【求助】 关于链表的问题
程序代码:
#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); } } }