user-0 提问: 救急！！！麻烦大牛们看一下，这个代码问题出现在哪，咋改。问题是实现员工信息管理系统

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 3 楼 寻开心 的回复：#define N 100 typedef struct employee{     char num[N];//工号     char name[N];//姓名     char sex[2];//性别，如果输入中文男女， 就要至少3个， 如果是英文f，m 2个就够了     char age[N];//年龄     char xueli[N];//学历     char gongzi[N];//工资     char adress[N];//地址     char phone[N]; //电话     struct employee *next; }em; em *head=NULL; em *in(em *head)//将数据写进文件 {     if ( head == NULL) return NULL; // 空表无输出     FILE *fp;     em *p;     // 保存文件，不应该是append的方式，应该是覆盖的方式w     if((fp=fopen("E:\\职工信息.txt","w"))==NULL)     {         printf("无法保存文件\n");         return NULL; // 无法保存文件还不至于结束程序         // exit(-1);     }     p = head->next; // 不输出头节点，所以ph直接定位到第一个有效节点上     while(p!=NULL)     {         fprintf(fp,"%s %s %s %s %s %s %s %s\n", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone);         p = p->next;     }     fclose(fp);     return head; } em *out(void)//从文件读取数据 {     FILE*fp;     em *p, *pEnd;     /*       这里应该先判断head是否为空， 不为空，应该先释放原来链表占据的内存     */     head = (em *)malloc(sizeof(em)); head->next = NULL;     if (!head)         exit(0);     pEnd = head;     fp=fopen("E:\\职工信息.txt","r");     if(fp==NULL)     {         printf("文件打开失败\n");         exit(-1);     }     while (1) {         p=(em *)malloc(sizeof(em));         p->next=NULL;         // 读取数据，fscanf返回的是读入到指定的参数的个数， 8个字符串         if ( 8 == fscanf(fp, "%s%s%s%s%s%s%s%s", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone) ) { // 挂接到尾巴上             pEnd->next = p;             pEnd = p;         } else {             // 没有读取到8个有效字符串，包括读取到文件尾巴的情况             free(p);             pEnd->next = NULL;             break;         }     }     fclose(fp);     return head; }  em *append()//录入员工数据，可被多次调用 {     /*更完善的代码是应该检测，新录入的员工是否和以前的重复的*/     int n,i;     em*p, *end = NULL;     if ( !head) { // 如果是空指针，才新建头         head = (em *)malloc(sizeof(em));         end = head;     } else { // 否则head不变， end定位到最后一个节点上         end = head;         while(end->next !=NULL) end = end->next;     }      printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em)); p->next = NULL;         if (!p) exit(0);         printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         scanf("%s%s%s%s%s%s%s%s", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone);         end->next = p;         end = p;     };     head = in(head);     return head; } void display(em* head)//用链表遍历员工数据 {     if (!head)         return;     em*p = head->next;     while(p!=NULL)     {         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         p = p->next;     } } void search_num()//工号查询 {     char num[N];     em *p;      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的工号\n");     scanf("%s",num);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(num,p->num)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_name()//姓名查询 {     em *p;     char name[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的姓名\n");     scanf("%s",name);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->name,name)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_age()//年龄查询 {     em *p;     char age[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的年龄\n");     scanf("%s",age);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->age,age)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_xueli()//学历查询 {     em *p;     char xueli[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的学历\n");     scanf("%s",xueli);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->xueli,xueli)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search_gongzi()//工资查询 {     em *p;     char gongzi[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的工资\n");     scanf("%s",gongzi);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(gongzi,p->gongzi)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search_adress()//地址查询 {     em *p;     char adress[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的地址\n");     scanf("%s",adress);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->adress,adress)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         else if(p->next==NULL)             printf("无此人信息\n");         head=in(head);     }     if (!p)         printf("无此人信息\n"); } void search_phone()//电话查询 {     em *p;     char phone[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的电话\n");     scanf("%s",phone);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->phone,phone)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search()//查询 {     int a;     printf("\n按职工号查询请按0\n按姓名查询请按1\n按年龄查询请按2\n按学历查询请按3\n按工资查询请按4\n按住址查询请按5\n按电话查询请按6\n返回主菜单请按7\n");     scanf("%d",&a);     switch(a)     {case 0:printf("按职工号查询\n");search_num();break;         case 1:printf("按姓名查询\n");search_name();break;         case 2:printf("按职年龄查询\n");search_age();break;         case 3:printf("按职学历查询\n");search_xueli();break;         case 4:printf("按职工资查询\n");search_gongzi();break;         case 5:printf("按住址查询\n");search_adress();break;         case 6:printf("按电话资查询\n");search_phone();break;         case 7:printf("返回主菜单\n");break;     } } void Delete()//删除 {     if ( !head || !head->next ){         printf("此通讯录为空\n");         return ;     }     //head=out();     char name[N];     em *p=head->next, *p1=head,  *p2;      printf("请输入要删除的姓名\n");     scanf("%s",name);     while( p!=NULL && (strcmp(p->name,name)!=0) ){         p1=p;         p=p->next;     }     if ( p == NULL ) { // 是否找到         printf("此信息不存在\n");         return;     }      p2 = p;     p1->next = p->next;     printf("此消息已删除：\n");     printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");     printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p2->num,p2->name,p2->sex,p2->age,p2->xueli,p2->gongzi,p2->adress,p2->phone);     free(p2);     if ( head->next == NULL ) {         printf("此通讯录为空！");     }     head=in(head); } void menu()//菜单管理初始化 {     printf("**********员工信息管理系统**********\n");     printf("1,录入员工信息\n");     printf("2,浏览员工信息\n");     printf("3,查询员工信息\n");     printf("4,删除员工信息\n");     printf("5,修改员工信息\n");     printf("6,退出\n");     printf("请按此功能序号\n"); } int main() {     int n;     while(1)     {         menu();         scanf("%d",&n);         if(n==1)             append();         else if(n==2)             display(head);         else if(n==3)             search();         else if(n==4)             Delete(); //        else if(n==5) //            change(); 没看到这个函数         else if(n==6) break;         else printf("您输入有错误\n");     }     printf("谢谢您的使用\n");     exit(-1);     return 0; }现在这个代码删除后，不能修改

user: user-2
content: 太长了。 具体哪儿出了问题，你描述问题所在啊  in和out函数肯定是有问题的， in把head存到了文件，out读的时候，又在前面挂了一个空的head头 in和out的行为要保持一致。 head是空头， in就不要存它了。 这样和out能匹配起来  out函数读数据的地方写的太啰嗦 while（1） {      p = malloc ....         if ( fscanf(......) !=EOF )  { // 把数据读到p里面， 确定数据有效         把p挂上      } else {     // 读到文件尾巴了        free(p); // 放弃最后的        设置上列表尾巴的NULL标记        break;     } }  你自己测试找到问题， in一次，out一次看看数据是否一致，借此判定是否正确

user: user-0
content: 引用 3 楼 寻开心 的回复：#define N 100 typedef struct employee{     char num[N];//工号     char name[N];//姓名     char sex[2];//性别，如果输入中文男女， 就要至少3个， 如果是英文f，m 2个就够了     char age[N];//年龄     char xueli[N];//学历     char gongzi[N];//工资     char adress[N];//地址     char phone[N]; //电话     struct employee *next; }em; em *head=NULL; em *in(em *head)//将数据写进文件 {     if ( head == NULL) return NULL; // 空表无输出     FILE *fp;     em *p;     // 保存文件，不应该是append的方式，应该是覆盖的方式w     if((fp=fopen("E:\\职工信息.txt","w"))==NULL)     {         printf("无法保存文件\n");         return NULL; // 无法保存文件还不至于结束程序         // exit(-1);     }     p = head->next; // 不输出头节点，所以ph直接定位到第一个有效节点上     while(p!=NULL)     {         fprintf(fp,"%s %s %s %s %s %s %s %s\n", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone);         p = p->next;     }     fclose(fp);     return head; } em *out(void)//从文件读取数据 {     FILE*fp;     em *p, *pEnd;     /*       这里应该先判断head是否为空， 不为空，应该先释放原来链表占据的内存     */     head = (em *)malloc(sizeof(em)); head->next = NULL;     if (!head)         exit(0);     pEnd = head;     fp=fopen("E:\\职工信息.txt","r");     if(fp==NULL)     {         printf("文件打开失败\n");         exit(-1);     }     while (1) {         p=(em *)malloc(sizeof(em));         p->next=NULL;         // 读取数据，fscanf返回的是读入到指定的参数的个数， 8个字符串         if ( 8 == fscanf(fp, "%s%s%s%s%s%s%s%s", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone) ) { // 挂接到尾巴上             pEnd->next = p;             pEnd = p;         } else {             // 没有读取到8个有效字符串，包括读取到文件尾巴的情况             free(p);             pEnd->next = NULL;             break;         }     }     fclose(fp);     return head; }  em *append()//录入员工数据，可被多次调用 {     /*更完善的代码是应该检测，新录入的员工是否和以前的重复的*/     int n,i;     em*p, *end = NULL;     if ( !head) { // 如果是空指针，才新建头         head = (em *)malloc(sizeof(em));         end = head;     } else { // 否则head不变， end定位到最后一个节点上         end = head;         while(end->next !=NULL) end = end->next;     }      printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em)); p->next = NULL;         if (!p) exit(0);         printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         scanf("%s%s%s%s%s%s%s%s", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone);         end->next = p;         end = p;     };     head = in(head);     return head; } void display(em* head)//用链表遍历员工数据 {     if (!head)         return;     em*p = head->next;     while(p!=NULL)     {         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         p = p->next;     } } void search_num()//工号查询 {     char num[N];     em *p;      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的工号\n");     scanf("%s",num);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(num,p->num)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_name()//姓名查询 {     em *p;     char name[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的姓名\n");     scanf("%s",name);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->name,name)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_age()//年龄查询 {     em *p;     char age[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的年龄\n");     scanf("%s",age);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->age,age)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_xueli()//学历查询 {     em *p;     char xueli[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的学历\n");     scanf("%s",xueli);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->xueli,xueli)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search_gongzi()//工资查询 {     em *p;     char gongzi[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的工资\n");     scanf("%s",gongzi);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(gongzi,p->gongzi)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search_adress()//地址查询 {     em *p;     char adress[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的地址\n");     scanf("%s",adress);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->adress,adress)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         else if(p->next==NULL)             printf("无此人信息\n");         head=in(head);     }     if (!p)         printf("无此人信息\n"); } void search_phone()//电话查询 {     em *p;     char phone[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的电话\n");     scanf("%s",phone);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->phone,phone)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search()//查询 {     int a;     printf("\n按职工号查询请按0\n按姓名查询请按1\n按年龄查询请按2\n按学历查询请按3\n按工资查询请按4\n按住址查询请按5\n按电话查询请按6\n返回主菜单请按7\n");     scanf("%d",&a);     switch(a)     {case 0:printf("按职工号查询\n");search_num();break;         case 1:printf("按姓名查询\n");search_name();break;         case 2:printf("按职年龄查询\n");search_age();break;         case 3:printf("按职学历查询\n");search_xueli();break;         case 4:printf("按职工资查询\n");search_gongzi();break;         case 5:printf("按住址查询\n");search_adress();break;         case 6:printf("按电话资查询\n");search_phone();break;         case 7:printf("返回主菜单\n");break;     } } void Delete()//删除 {     if ( !head || !head->next ){         printf("此通讯录为空\n");         return ;     }     //head=out();     char name[N];     em *p=head->next, *p1=head,  *p2;      printf("请输入要删除的姓名\n");     scanf("%s",name);     while( p!=NULL && (strcmp(p->name,name)!=0) ){         p1=p;         p=p->next;     }     if ( p == NULL ) { // 是否找到         printf("此信息不存在\n");         return;     }      p2 = p;     p1->next = p->next;     printf("此消息已删除：\n");     printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");     printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p2->num,p2->name,p2->sex,p2->age,p2->xueli,p2->gongzi,p2->adress,p2->phone);     free(p2);     if ( head->next == NULL ) {         printf("此通讯录为空！");     }     head=in(head); } void menu()//菜单管理初始化 {     printf("**********员工信息管理系统**********\n");     printf("1,录入员工信息\n");     printf("2,浏览员工信息\n");     printf("3,查询员工信息\n");     printf("4,删除员工信息\n");     printf("5,修改员工信息\n");     printf("6,退出\n");     printf("请按此功能序号\n"); } int main() {     int n;     while(1)     {         menu();         scanf("%d",&n);         if(n==1)             append();         else if(n==2)             display(head);         else if(n==3)             search();         else if(n==4)             Delete(); //        else if(n==5) //            change(); 没看到这个函数         else if(n==6) break;         else printf("您输入有错误\n");     }     printf("谢谢您的使用\n");     exit(-1);     return 0; }这个是void change()//修改 {     //head=out();     char name[N];     em*p=head->next;     if(p==NULL)     {         printf("此系统为空\n");         return ;     }     printf("请输入要修改的姓名\n");     scanf("%s",name); while(p!=NULL) {     if(strcmp(p->name,name)==0)     {         printf("请输入您要修改的信息\n");         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         scanf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);break;     }     printf("修改成功\n");     head=in(head); }

user: user-2
content: #define N 100 typedef struct employee{     char num[N];//工号     char name[N];//姓名     char sex[2];//性别，如果输入中文男女， 就要至少3个， 如果是英文f，m 2个就够了     char age[N];//年龄     char xueli[N];//学历     char gongzi[N];//工资     char adress[N];//地址     char phone[N]; //电话     struct employee *next; }em; em *head=NULL; em *in(em *head)//将数据写进文件 {     if ( head == NULL) return NULL; // 空表无输出     FILE *fp;     em *p;     // 保存文件，不应该是append的方式，应该是覆盖的方式w     if((fp=fopen("E:\\职工信息.txt","w"))==NULL)     {         printf("无法保存文件\n");         return NULL; // 无法保存文件还不至于结束程序         // exit(-1);     }     p = head->next; // 不输出头节点，所以ph直接定位到第一个有效节点上     while(p!=NULL)     {         fprintf(fp,"%s %s %s %s %s %s %s %s\n", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone);         p = p->next;     }     fclose(fp);     return head; } em *out(void)//从文件读取数据 {     FILE*fp;     em *p, *pEnd;     /*       这里应该先判断head是否为空， 不为空，应该先释放原来链表占据的内存     */     head = (em *)malloc(sizeof(em)); head->next = NULL;     if (!head)         exit(0);     pEnd = head;     fp=fopen("E:\\职工信息.txt","r");     if(fp==NULL)     {         printf("文件打开失败\n");         exit(-1);     }     while (1) {         p=(em *)malloc(sizeof(em));         p->next=NULL;         // 读取数据，fscanf返回的是读入到指定的参数的个数， 8个字符串         if ( 8 == fscanf(fp, "%s%s%s%s%s%s%s%s", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone) ) { // 挂接到尾巴上             pEnd->next = p;             pEnd = p;         } else {             // 没有读取到8个有效字符串，包括读取到文件尾巴的情况             free(p);             pEnd->next = NULL;             break;         }     }     fclose(fp);     return head; }  em *append()//录入员工数据，可被多次调用 {     /*更完善的代码是应该检测，新录入的员工是否和以前的重复的*/     int n,i;     em*p, *end = NULL;     if ( !head) { // 如果是空指针，才新建头         head = (em *)malloc(sizeof(em));         end = head;     } else { // 否则head不变， end定位到最后一个节点上         end = head;         while(end->next !=NULL) end = end->next;     }      printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em)); p->next = NULL;         if (!p) exit(0);         printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         scanf("%s%s%s%s%s%s%s%s", p->num, p->name, p->sex, p->age, p->xueli, p->gongzi, p->adress, p->phone);         end->next = p;         end = p;     };     head = in(head);     return head; } void display(em* head)//用链表遍历员工数据 {     if (!head)         return;     em*p = head->next;     while(p!=NULL)     {         printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");         printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);         p = p->next;     } } void search_num()//工号查询 {     char num[N];     em *p;      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的工号\n");     scanf("%s",num);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(num,p->num)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_name()//姓名查询 {     em *p;     char name[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的姓名\n");     scanf("%s",name);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->name,name)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_age()//年龄查询 {     em *p;     char age[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的年龄\n");     scanf("%s",age);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->age,age)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); }  void search_xueli()//学历查询 {     em *p;     char xueli[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的学历\n");     scanf("%s",xueli);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->xueli,xueli)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search_gongzi()//工资查询 {     em *p;     char gongzi[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的工资\n");     scanf("%s",gongzi);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(gongzi,p->gongzi)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search_adress()//地址查询 {     em *p;     char adress[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的地址\n");     scanf("%s",adress);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->adress,adress)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }         else if(p->next==NULL)             printf("无此人信息\n");         head=in(head);     }     if (!p)         printf("无此人信息\n"); } void search_phone()//电话查询 {     em *p;     char phone[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     printf("请输入要查找的电话\n");     scanf("%s",phone);     for(p=head->next;p!=NULL;p=p->next)     {         if(strcmp(p->phone,phone)==0)         {             printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");             printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->sex,p->age,p->xueli,p->gongzi,p->adress,p->phone);             break;         }     }     if (!p)         printf("无此人信息\n"); } void search()//查询 {     int a;     printf("\n按职工号查询请按0\n按姓名查询请按1\n按年龄查询请按2\n按学历查询请按3\n按工资查询请按4\n按住址查询请按5\n按电话查询请按6\n返回主菜单请按7\n");     scanf("%d",&a);     switch(a)     {case 0:printf("按职工号查询\n");search_num();break;         case 1:printf("按姓名查询\n");search_name();break;         case 2:printf("按职年龄查询\n");search_age();break;         case 3:printf("按职学历查询\n");search_xueli();break;         case 4:printf("按职工资查询\n");search_gongzi();break;         case 5:printf("按住址查询\n");search_adress();break;         case 6:printf("按电话资查询\n");search_phone();break;         case 7:printf("返回主菜单\n");break;     } } void Delete()//删除 {     if ( !head || !head->next ){         printf("此通讯录为空\n");         return ;     }     //head=out();     char name[N];     em *p=head->next, *p1=head,  *p2;      printf("请输入要删除的姓名\n");     scanf("%s",name);     while( p!=NULL && (strcmp(p->name,name)!=0) ){         p1=p;         p=p->next;     }     if ( p == NULL ) { // 是否找到         printf("此信息不存在\n");         return;     }      p2 = p;     p1->next = p->next;     printf("此消息已删除：\n");     printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");     printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",p2->num,p2->name,p2->sex,p2->age,p2->xueli,p2->gongzi,p2->adress,p2->phone);     free(p2);     if ( head->next == NULL ) {         printf("此通讯录为空！");     }     head=in(head); } void menu()//菜单管理初始化 {     printf("**********员工信息管理系统**********\n");     printf("1,录入员工信息\n");     printf("2,浏览员工信息\n");     printf("3,查询员工信息\n");     printf("4,删除员工信息\n");     printf("5,修改员工信息\n");     printf("6,退出\n");     printf("请按此功能序号\n"); } int main() {     int n;     while(1)     {         menu();         scanf("%d",&n);         if(n==1)             append();         else if(n==2)             display(head);         else if(n==3)             search();         else if(n==4)             Delete(); //        else if(n==5) //            change(); 没看到这个函数         else if(n==6) break;         else printf("您输入有错误\n");     }     printf("谢谢您的使用\n");     exit(-1);     return 0; }

user: user-0
content: 就是运行第一次和第二次的结果不一样