| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 311 人关注过本帖
标题:【求助】 关于链表的问题
取消只看楼主 加入收藏
thlgood
Rank: 5Rank: 5
等 级:职业侠客
帖 子:281
专家分:381
注 册:2010-9-24
结帖率:91.43%
收藏
已结贴  问题点数:20 回复次数:0 
【求助】 关于链表的问题
程序代码:
#include"stdio.h"
#include"malloc.h"
#include"stdlib.h"
#include"string.h"

#define N 3
typedef struct stu
{
    char name[20];
    long int phone;
    char type;
    char email;
    struct stu*next;
}TONGXUN;
/*菜单函数,返回值为整数*/
int menu_select()
{
    char s[3];
    int c;
    printf("\n  ***********主菜单***********\n");
    printf("       1.输入记录\n");
    printf("       2.显示所有记录\n");
    printf("       3.按姓名查找并记录并排序\n");
    printf("       4.插入记录\n");
    printf("       5.删除记录\n");
    printf("       6.将所有记录保存到文件\n");
    printf("       7.从文件中读入所有记录\n");
    printf("       8.退出\n");
    printf("    *************************\n\n");
    do
    {
        printf("请选择操作(1-9):");
        scanf("%s",s);
        c=atoi(s);
    }while(c<0||c>9);/*选择项不在0和9之间重输*/
        return(c);/*返回选择项,主程序根据该数调用相应的函数*/
}
/*插入模块*/

int insert(TONGXUN *h)
{
    TONGXUN *info;          /*p指向插入位置,q是其前驱,info指新插入记录*/
    int n=0;
    printf("\n请添加新记录!\n");
    info=(TONGXUN *)malloc(sizeof(TONGXUN));  /*申请空间*/
    if(!info)
    {
        printf("内存分配失败!\n");
        return NULL;              /*返回空指针*/
    }
    printf("输入号码:\n");
    scanf("%s",info->phone);       /*以下是待插入数据的录入和处理,具体同创建模块*/
    printf("输入姓名: \n");
    scanf("%s",info->name);
    printf("输入Email\n");
    scanf("%s",info->email);
    info->next=h;
    h=info;
    printf("\n----已添加 %s 到通讯录!----\n",info->name);
    return(1);

/*创建链表,完成数据录入功能,新结点在表头插入*/
int create()
{
    int i;
    float s;
    TONGXUN*h=NULL,*info;/*h:头结点指针;info:新结点指针*/
    for(;;)
    {
        info=(TONGXUN*)malloc(sizeof(TONGXUN));/*申请空间*/
        if(!info)/*如果指针为空*/
        {
            printf("\n内存分配失败");
            return NULL;/*返回空指针*/
        }
        printf("\n 请按提示输入信息。\n\n");
        printf("输入姓名:");
        scanf("%s",info->name)/*输入姓名并校验*/
        printf("输入电话号码(输入'#'号结束):");
        scanf("%s",info->phone);
        if(info->phone[0]=='#')break;/*如果学号首字符为#则结束输入*/
        printf("输入类型:");
        scanf("%s",info->type);/*输入类型,并校验*/
        printf("输入电子邮件地址:");
        scanf("%s",info->email);
        info->next=h;/*将头结点作为新输入结点的后继结点*/
        h=info;/*新输入结点为新的头结点*/
    }
    return 1;/*返回头指针*/
}
/*删除模块*/
int delete1(TONGXUN *h)
{
    char k[5];              /*定义字符串数组,用来确认删除信息*/
    TONGXUN *p,*q;          /*p为查找到要删除的节点指针,q为其前驱指针*/
    char name[20];          /*存放姓名*/
    printf("请输入需要删除的姓名:\n");   /*显示提示信息*/
    scanf("%s",name);       /*输入要删除的姓名*/
    q=p=h;                  /*q和p赋初值头指针*/
    while(p!=NULL&&strcmp(p->name,name))/*当记录学好不是要找的,或指针不为空时*/
    {
        q=p;            /*将p指针赋值给q作为p的前驱指针*/
        p=p->next;      /*将p指针指向下一条记录*/
    }
    if(p==NULL)         /*如果p为空,说明链表中没有该节点*/
        printf("\n 很遗憾,通讯录中没有你要删除的姓名!\n");
    else                /*p不为空,显示找到的记录信息*/
    {
        printf("*************Found***************\n");
        printf(" 姓名    号码      类别      Email\n");
        printf("-----------------------------------/n");
        printf(" %-15s   %-15s     %-15s     %-20s");
        printf("***********************************\n");
        do{
            printf("您确定要删除此记录吗?(y/n):");
            scanf("%s",k);
        }while(k[0]!='y'&&k[0]!='n');
        if(k[0]!='n')       /*删除确认判断*/
        {                   /*如果p==h,说明被删结点时头结点*/
            if(p==h)
                h=p->next;  /*修改头指针指向下一条记录*/
            else
                q->next=p->next;/*不是头指针,将p的后继结点时头结点*/
            free(p);            /*释放p所指结点空间*/
            printf("\n 已经成功删除! \n",name);
        }
    }
    return(1);            /*返回头指针*/
}
/*显示模块*/

void print(TONGXUN *h)
{
    int i=0;        /*统计记录条数*/
    TONGXUN *p;     /*移动指针*/
    p=h;            /*初值为头指针*/
    if(p==NULL)
    {
        printf("\n   很遗憾,空表中没有任何记录可供显示!\n");
    }
    else                                        /*显示所有已储存信息*/         
    {
        printf("*****************Found*****************");
        printf("姓名       号码         类别      E-mile\n");
        printf("---------------------------------------");
        while(p!=NULL)
        {
            i++;
                printf("%-15s      %-15s        %-10s     %-30s\n",p->name,p->phone,p->type,p->email);
            p=p->next;
        }
        printf("***************************************\n\n");
    }
}


/*保存数据到文件模块*/
void save(TONGXUN*h)
{
    FILE*fp;/*定义只想文件的指针*/
    TONGXUN*p;/*定义移动指针*/
    char outfile[20];
    print("请输入导出文件名,比如:d:\\xds\\name.txt:\n");
        scanf("%s",outfile);
    if((fp=fopen(outfile,"wb"))==NULL)/*为输入打开一个二进制文件,如没有建立*/
    {
        printf("不能打开文件,文件保存失败!\n");
    }
    else
    {
        p=h;/*移动指针从头指针开始*/
        while(p!=NULL)/*如果p不为空*/
        {

            fwrite(p,sizeof(TONGXUN),1,fp);/*写入一条记录*/
            p=p->next;
        }
        fclose(fp);
        printf("---所有记录已经成功保存至文件%s中!---\n",outfile);/*显示保存成功*/
    }
}

/*查找模块*/
void search(TONGXUN *h)
{
    TONGXUN *p;         /*移动指针*/
    char name[20];      /*存放姓名的字符数组*/
    printf("请输入您要查找的姓名:\n");
    scanf("%s",name);    /*输入姓名*/
    p=h;               /*将头指针赋给p*/
    while(p!=NULL&&strcmp(p->name,name))      /*当记录姓名不是要找的,且指针不为空时*/
        p=p->next;                            /*移动指针,指向下一结点,继续查找*/
    if(p==NULL)                               /*指针为空,说明未能找到所要的结点*/
        printf("\n 您要查找的是%s,很遗憾,查无此人!\n",name);
    else                            /*显示查找到的记录信息*/
    {
        printf("**************Found******************\n");
        printf(" 姓名      号码       类别      Email\n");
        printf("-------------------------------------\n");
        printf(" %-15s     %-15s      %-15s     %-20s",p->name,p->phone,p->type,p->email);
        printf("*************************************\n");
    }
}

/*导入信息模块*/
int load()
{
    TONGXUN *p,*q,*h=NULL;/*定义记录指针变量*/
    FILE *fp;/*定义指针指向的文件*/
    char infile[20];/*保存文件名*/
    printf("请输入导入文件名,比如:d:\\xds\\name.txt:\n");
    scanf("%s",infile);/*输入文件名*/ 
    if((fp=fopen(infile,"rb"))==NULL)/*打开一个二进制文件,为只读方式*/
    {
        printf("文件打开失败!\n");
        return 0;
    }
    p=(TONGXUN*)malloc(sizeof(TONGXUN));           /*申请空间*/
    if(!p)
    {
        printf("内存分配失败!\n");           /*如果没有分配到,则内存溢出*/
        return h;                      /*返回空头指针*/
    }
    h=p;                   /*申请到得空间,将其作为头指针*/
    while(!feof(fp))       /*循环数据知道文件结束*/
    {
        if(1!=fread(p,sizeof(TONGXUN),1,fp))
            break;                          /*如果没读到数据,跳出循环*/
        p->next=(TONGXUN*)malloc(sizeof(TONGXUN));   /*问下一个结点申请空间*/
        if(!p->next)
        {
            printf("内存分配失败!\n");      /*如果没有申请到,则内存溢出*/
            return h;
        }
        q=p;                                         /*保存当前的结点的指针,作为下一结点的前驱*/
        p=p->next;                                        /*指针后移,新读入数据链到当前表尾*/
    }
    q->next=NULL;                                       /*最后一个结点的后继指针尾空*/
    fclose(fp);                                         /*关闭文件*/
    printf("已经成功从文件%s 导入数据!!!",infile);
    return 1;                                           /*返回头指针*/
}
/*********主函数k开始**********/
void main()
{
    TONGXUN *head=NULL;/*链表定义头指针*/
    system("clor 5e");/*条DOS命令清屏,可用color?命令查看格式*/
    for(;;)
    {
        switch(menu_select())/*调用主菜单,返回值整数作开关语句的条件*/
        {
        case 1:head=create();break;
        case 2:print(head);break;
        case 3:search(head);break;
        case 4:head=insert(head);break;
        case 5:head=delete1(head);break;
        case 6:save(head);break;
        case 7:head=load();break;
        case 8:head=load();break;
        case 9:exit(0);
        }
    }
}
搜索更多相关主题的帖子: color 
2011-03-01 15:18
快速回复:【求助】 关于链表的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022468 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved