求大神帮我看看我的程序哪里错了。
我用单链表建立了一个通讯录管理系统,出错了,求帮忙指点一下。程序代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #define NULL 0 #define LEN sizeof(LNode) int seat; //通讯录成员的序号 typedef struct LNode {//用于通讯录结点 int number; double telenum; char name[20]; struct LNode *next; }LNode,*LinkList; //1.创建链表 LinkList creatIncreLink() {//创建一个存放通讯录成员的非递减有序表,返回头结点地址 LinkList L=(LinkList)malloc(LEN); //头结点 L->next=NULL; LinkList p; int num=1,number; double telenum; char name[20]; printf("请输入学生学号、姓名、电话号码,建立通讯录,以'-1'为输入结束标志\n"); printf("请输入学号 %d: ",num); scanf("%d",&number); printf("请输入姓名 %d: ",num); char temp=getchar(); gets(name); printf("请输入电话号码 %d: ",num); scanf("%lf",&telenum); while(number>=0) { p=(LinkList)malloc(LEN); //新结点 p->number=number; p->telenum=telenum; strcpy(p->name,name); inserYouXuLink(L,p); num++; printf("请输入学号 %d: ",num); scanf("%d",&number); printf("请输入姓名 %d: ",num); temp=getchar(); gets(name); printf("请输入电话号码 %d: ",num); scanf("%lf",&telenum); } return(L); } //2.从通讯录中删除第i个元素 void deleteElem(LinkList L,int i) { LinkList p=L; int j=0; while(p->next && j<i-1) { p=p->next; j++; } if(!(p->next)) //判断i是否合法,i不能大于元素个数,也不能小于等于0 { printf("第%d个元素删除失败\n",i); return ; } LinkList q=p->next; p->next = q->next; free(q); } //3.按姓名删除通讯录 int delName(LinkList L,char n[]) { int flag=0; //判断要删除的通讯者和通讯录中的姓名是否匹配 LinkList p=L->next; seat=1; if(L->next==NULL) printf("该链表中没有元素,查找失败\n"); else { while(p !=NULL) { if(!strcmp(P->name,n)) //比较输入的姓名和通讯录中的姓名 { flag=1; printf("%S ",p->name); p=p->next; deleteElem(L,seat); } else {//输入姓名不匹配,指针移到下一个通讯者 p=p->next; seat++; } } if(flag) printf("被删除\n"); } return flag; } //4.按学号删除通讯者 int delNum(LinkList L,int n) { int flag=0; //判断要删除的通讯者和通讯录中的学号是否匹配 LinkList p=L->next; seat=1; if(L->next==NULL) printf("该链表中没有元素,删除失败\n"); else { while(p !=NULL) { if(p->number<=n) { if(p->number==n) { flag=1; //输入学号匹配 printf("%d ",p->number); p=p->next; deleteElem(L,seat); } } else { p=p->next; seat++; } } printf("被删除\n"); } return flag; } //5.插入一个元素,使原有序表仍未有序 void insertYouXu(LinkList L,LinkList Elem) { LinkList p=L->next; while(p!=NULL && Elem->number=p->number) { if(p->number==Elem->number) { printf("重复输入!!\n"); return; } p=p->next; } //确定Elem的插入位置 if(p==NULL) { p=prior(L,p); Elem->next=NULL; p->next=Elem; } else //若为空表,插到头结点之后 { p=prior(L,p); Elem->next=p->next; p->next=Elem; } } //6.打印头结点地址为L的通讯录 void printList(LinkList L) { printf("\n -------------------\n"); printf(" 学号 姓名 电话号码\n"); printf(" --------------------\n"); LinkList p=L; int n=1; if(L==NULL || L->next==NULL) //判断通讯录是否为空 printf("该通讯录中没有元素\n"); else while(p->next !=NULL) { printf(" %2d %-9d",n,p->next->number); printf(" %-5s %.0f\n",p->next->name,p->next->telenum); p=p->next; n++; } printf(" ------------------\n"); return; } //7.找到位于当前地址元素的前一元素的地址 LinkList prior(LinkList L,LinkList p) { if(L->next==NULL) return(L); LinkList p_prior=L; while(p_prior->next !=p) p_prior=p_prior->next; return(p_prior); } //8.按姓名查找通讯者 int searchName(LinkList L,char n[]) { int flag=0; //标志要查找的通讯者和通讯录中的姓名是否匹配 LinkList p=L->next; seat=1; if(L->next==NULL || L==NULL) printf("该通讯录中没有元素,查找失败\n"); else { while(p !=NULL) { if(!strcmp(p->name,n)) //比较要查找的姓名是否与当前通讯录所指的姓名匹配 { flag=1; //输入姓名匹配 printf("要查找的是第%d个通讯者: \n",seat); printf("Number: %d Name: %s TeleNo.:%0.f\n",p->number,p->name,p->telenum); } p=p->next; seat++; } } return flag; } //9.按学号查找通讯者 int searchName(LinkList L,int n) { int flag=0; //标志要查找的通讯者和通讯录中的学号是否匹配 LinkList p=L->next; seat=1; if(L->next==NULL) printf("该链表中没有元素,查找失败\n"); else { while(p !=NULL) { if(p->number<=n) if(p->number==n) { flag=1; //输入学号匹配 printf("要查找的是第%d个通讯者: \n",seat); printf("学号: %d 姓名: %s 电话号码.:%0.f\n",p->number,p->name,p->telenum); } p=p->next; seat++; } } return flag; } //10.主函数。设定主界面的颜色大小,调用工作区模块函数 void main() { system("color lf"); printf("\n **************^@^欢迎使用通讯录系统^@^*************\n"); printf(" * 1 通讯录的建立 *\n"); printf(" * 2 插入通讯记录 *\n"); printf(" * 3 查询通讯记录 *\n"); printf(" * 4 删除通讯记录 *\n"); printf(" * 5 显示通讯录信息 *\n"); printf(" * 0 退出管理系统 *\n"); printf(" **************^@^欢迎使用通讯录系统^@^*************\n"); int flag=0; //通讯录是否建立 int menu; //菜单选项 printf("请选择0 ~ 5: "); scanf("%d",&menu); while(menu!=0) { switch(menu) { case 1: { L=creatIncreLink(); //调用函数实现通讯录建立 printf("建立通讯录: "); printList(L); flag=1; break; } case 2: { if(flag==1) { int number,telenum; char name[20]; printf("请输入通讯者的学号和姓名: \n"); printf("请输入学号: "); scanf("%d",&number); printf("请输入姓名: "); char temp=getchar(); gets(name); printf("请输入电话号码: "); scanf("%d",&telenum); LinkList p=(LinkList)malloc(LEN); //新结点 p->number=number; strcpy(p->name,name); insertYouXu(L,p); printf("插入后: "); printList(L); } else printf("\nERROR:通讯录还没有建立,请先建立通讯录\n"); break; } case 3: { int way,n,s; char na[20]; if(L!=NULL) { if(flag) { printf("选择查找方式: \n"); printf(" 1.按学号 2.按姓名"); scanf("%d",&way); if(way==1) { printf("\n请输入学号:"); scanf("%d",&n); s=searchNum(L,n); //查询通讯录成员 if(s==0) printf("无此通讯者,查找失败!\n"); } else if(way==2) { printf("\n请输入姓名:"); char temp=getchar(); gets(na); s=searchName(L,na); if(s==0) printf("无此通讯者,查找失败!\n"); } else printf("通讯录中无记录!\n"); } break; } else printf("通讯录中无记录!\n"); break; } case 4: { int way; printf("选择删除方式: \n"); printf(" 1.按序号 2.按学号 3.按姓名\n"); scanf("%d",&way); if(way==1) { int n; printf("请输入通讯录序号: "); scanf("%d",&n); printf("删除后: \n"); deleteElem(L,n); //按序号删除 printList(L); } else if(way==2) { int n,f; printf("\n请输入学号: "); scanf("%d",&n); f=delNum(L,n); //按学号删除 if(f!==0) { printf("删除后: \n"); printList(L); } else printf("无该学号,删除失败!\n"); } else if(way==3) { char na[20]; int f; printf("\n请输入姓名:"); char temp=getchar(); gets(na); f=delName(L,na); if(f!==0) { printf("删除后: \n"); printList(L); } else printf("无此姓名,删除失败!\n"); } else printf("ERROR!!\n"); break; } case 5: { printf("当前通讯录内容如下: \n"); //打印通讯录 printList(L); break; } case 0: exit(0); default: printf("\n没有此功能,请重新输入: \n"); } printf("选择功能: "); scanf("%d",&menu); } }