fannie5 发布留言 2008-10-22 18:46 菜鸟又有问题了我课程实践在做通讯录管理,老师要求能建立,增删,修改并能按多种方式查询,但现在程序运行中修改和删除总有错,不知道为什么,忘各位大侠帮我这个菜鸟查一下错,不胜感激 以下是程序源代码: #include #include #include struct Telephone { char name[20]; char addrass[20]; char zip[20]; char telephone[20]; struct Telephone *next; }; typedef struct Telephone TEL; TEL *head=NULL; void showmenu(); //菜单 void Appenditem(); //添加条目 void print(); //输出条目 void Finditem1(); //查找条目( 按姓名 ) void Finditem2(); //查找条目( 按号码 ) void Finditem3(); //查找条目( 按邮编 ) void Finditem4(); //查找条目( 按地址 ) void Reviseitem(); //修改条目 void Removeitem(); //删除信息 void Saveandfree(); //保存到文件 void Open(); //打开文件 void main() { char ch; Open(); //打开文件 while(1) { showmenu(); //显示菜单 scanf(" %c",&ch); switch(ch) { case '1':Appenditem(); //添加条目 break; case '2':print(); //输出条目 break; case '3':Finditem1(); //查找条目1.按姓名 break; case '4':Finditem2(); //查找条目2.按号码 break; case '5':Finditem3(); //查找条目3.按邮编 break; case '6':Finditem4(); //查找条目4.按地址 break; case '7':Reviseitem(); //修改条目 break; case '8': Removeitem(); //删除信息 print(); //输出删除后的结果 break; case '0':Saveandfree(); //保存并释放内存 exit(0); //退出 break; default: printf("选择错误!"); break; } } }
//菜单 void showmenu() { printf("\n*****************通讯录系统*****************\n"); printf("\t1.添加条目。\n"); printf("\t2.输出输出\n"); printf("\t3.按姓名查询\n"); printf("\t4.按号码查询\n"); printf("\t5.按邮编查询\n"); printf("\t6.按地址查询\n"); printf("\t7.修改条目\n"); printf("\t8.删除条目\n"); printf("\t0.保存并退出!\n"); printf("*************************************************\n"); printf("\t请选择:\n"); }
//添加条目 void Appenditem() { TEL *p1=NULL,*p2=NULL; p1=(TEL *)malloc(sizeof(TEL)); //申请结点 printf("输入姓名:\n"); //添加信息 scanf("%s",p1->name); printf("输入地址:\n"); scanf("%s",p1->addrass); printf("输入邮编:\n"); scanf("%s",p1->zip); printf("输入电话:\n"); scanf("%s",p1->telephone); p1->next=NULL; //保存到链表
if(head==NULL) { head=(TEL *)malloc(sizeof(TEL)); //申请空间 head->next=p1; } else { for(p2=head;p2->next!=NULL;p2=p2->next); //找到结点尾 p2->next=p1; } printf("此信息已添加!"); }
//输出学生信息 void print() { TEL *p=NULL; if(head==NULL) { printf("此通讯录中无记录,请输入记录后在使用本功能!\n"); return; } printf("**************通讯录系统*********************\n"); //输出信息 printf("姓名\t地址\t邮编\t电话\n"); for(p=head->next;p!=NULL;p=p->next) printf("%s\t%s\t%s\t%s\n",p->name,p->addrass,p->zip,p->telephone); }
//查找信息1.按姓名 void Finditem1() { TEL *p; char findname[20]; printf("请输入要查找的姓名:\n"); scanf("%s",findname); printf("**************通讯录系统*********************\n"); printf("姓名\t地址\t邮编\t电话\n"); for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->name,findname)==0) printf("%s\t%s\t%s\t%s\n",p->name,p->addrass,p->zip,p->telephone); } }
//查找信息2.按号码 void Finditem2() { TEL *p; char findtelephone[20]; printf("请输入要查找的号码:\n"); scanf("%s",findtelephone); printf("**************通讯录系统*********************\n"); printf("姓名\t地址\t邮编\t电话\n"); for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->telephone,findtelephone)==0) printf("%s\t%s\t%s\t%s\n",p->name,p->addrass,p->zip,p->telephone); } }
//查找信息3.按邮编 void Finditem3() { TEL *p; char findzip[20]; printf("请输入要查找的邮编:\n"); scanf("%s",findzip); printf("**************通讯录系统*********************\n"); printf("姓名\t地址\t邮编\t电话\n"); for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->zip,findzip)==0) printf("%s\t%s\t%s\t%s\n",p->name,p->addrass,p->zip,p->telephone); } }
//查找信息4.按地址 void Finditem4() { TEL *p; char findaddrass[20]; printf("请输入要查找的地址:\n"); scanf("%s",findaddrass); printf("**************通讯录系统*********************\n"); printf("姓名\t地址\t邮编\t电话\n"); for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->addrass,findaddrass)==0) printf("%s\t%s\t%s\t%s\n",p->name,p->addrass,p->zip,p->telephone); } }
//修改条目 void Reviseitem()
{ char findname[20]; //先查找 后修改 int k; TEL *p = head->next, *pr = head->next; printf("请输入要修改的姓名:\n"); scanf(" %s",findname); if (head->next == NULL) { printf("无此节点!\n"); return; } while ((k=strcmp(p->name,findname)!=0 )&& p->next != NULL) { pr =p; p =p->next; } if (k==0) //输出删除信息 { printf("%s\t%s\t%s\t%s\n",p->next->name,p->next->addrass,\ p->next->zip,p->next->telephone); if (p == head->next) head->next = p->next; else pr->next = p->next; free(p); } TEL *p1=NULL,*p2=NULL; p1=(TEL *)malloc(sizeof(TEL)); //申请结点 printf("输入姓名:\n"); //添加信息 scanf("%s",p1->name); printf("输入地址:\n"); scanf("%s",p1->addrass); printf("输入邮编:\n"); scanf("%s",p1->zip); printf("输入电话:\n"); scanf("%s",p1->telephone); p1->next=NULL; //保存到链表
if(head==NULL) { head=(TEL *)malloc(sizeof(TEL)); //申请空间 head->next=p1; } else { for(p2=head;p2->next!=NULL;p2=p2->next); //找到结点尾 p2->next=p1; } printf("此信息已修改!"); }
//删除信息 void Removeitem() { char findname[20]; //先查找 后删除 TEL *p = head->next, *pr = head->next; printf("请输入要删除的姓名:\n"); scanf(" %s",findname); if (head->next == NULL) { printf("无此节点!\n"); return; } while ((strcmp(p->name,findname)!=0 )&& p->next != NULL) { pr =p; p =p->next; } if (strcmp(findname, p->name)==0) //输出删除信息 { printf("%s\t%s\t%s\t%s\n",p->next->name,p->next->addrass,\ p->next->zip,p->next->telephone); if (p == head->next) head->next = p->next; else pr->next = p->next; free(p); } printf("此信息已删除!"); } //保存链表信息到文件并释放内存空间 void Saveandfree() { TEL *p=NULL; FILE *fp; char *Book="books.txt"; if(head==NULL) { printf("\n记录为空!\n"); return; } else p=head->next; if((fp=fopen(Book,"wb+"))==NULL) { printf("\n打不开文件!\n"); return; } while(p!=NULL) //保存信息 { fwrite(p,sizeof(TEL),1,fp); p=p->next; } printf("保存完毕!"); fclose(fp); //*****释放链表空间***** for(;head->next!=NULL;) { p=head->next; head->next=head->next->next; free(p); } free(head); } //文件信息输出到链表 void Open() { FILE *fp; TEL *p1=NULL,*p2=NULL,*temp=NULL; if((fp=fopen("books.txt","rb+"))==NULL) { printf("\n****************这是一个新的通讯录管理系统******************\n"); return; } head=(TEL *)malloc(sizeof(TEL)); head->next=NULL; temp=p2=head; while(! feof(fp)) //循环读取 { p1=(TEL *)malloc(sizeof(TEL)); temp=p2; p2->next=p1; p2=p1; fread(p1,sizeof(TEL),1,fp); } temp->next=NULL; fclose(fp); //关闭文件 }
页: [1] 特别说明:如网页特效代码中有引用图片文件等,请自己下载到本地调试! |