user-0 提问: 这个代码为啥达不到我的预期，咋修改

回复:
user: user-0
content: 引用 2 楼 自信男孩 的回复：写这么长的程序还都写完了在调试，这不是跟自己找麻烦吗？为什么不写完一个功能，调试一下没问题了继续写下一个功能呢？ out为什么要多次调用呢？每次调用之后都申请了一个链表，那么append产生的链表怎么不释放呢? 在搜索的功能里，没必要写这么多函数，一个函数搞定，那么多冗余的代码，没必要。还有，搜索里为什么调用那么多次in函数，没必要，反而应该在delete函数里调用in函数吧，这样更新链表，同时也更新文件。  一个文件里代码写多了，错误也就多了，建议先设计好架构，减少代码冗余，好好设计一下；注意不要重复创建链表~这个地方不要判断内存是否申请成功吗？还有为啥要加\n？麻烦大佬把有的地方解释一下，在下刚学C

user: user-0
content: 引用 2 楼 自信男孩 的回复：写这么长的程序还都写完了在调试，这不是跟自己找麻烦吗？为什么不写完一个功能，调试一下没问题了继续写下一个功能呢？ out为什么要多次调用呢？每次调用之后都申请了一个链表，那么append产生的链表怎么不释放呢? 在搜索的功能里，没必要写这么多函数，一个函数搞定，那么多冗余的代码，没必要。还有，搜索里为什么调用那么多次in函数，没必要，反而应该在delete函数里调用in函数吧，这样更新链表，同时也更新文件。  一个文件里代码写多了，错误也就多了，建议先设计好架构，减少代码冗余，好好设计一下；注意不要重复创建链表~谢谢提醒，以后注意

user: user-1
content: 写这么长的程序还都写完了在调试，这不是跟自己找麻烦吗？为什么不写完一个功能，调试一下没问题了继续写下一个功能呢？ out为什么要多次调用呢？每次调用之后都申请了一个链表，那么append产生的链表怎么不释放呢? 在搜索的功能里，没必要写这么多函数，一个函数搞定，那么多冗余的代码，没必要。还有，搜索里为什么调用那么多次in函数，没必要，反而应该在delete函数里调用in函数吧，这样更新链表，同时也更新文件。  一个文件里代码写多了，错误也就多了，建议先设计好架构，减少代码冗余，好好设计一下；注意不要重复创建链表~

user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  #define N 100 //#define NULL 0  typedef struct employee{     char num[N];//工号     char name[N];//姓名     char sex[2];//性别     char age[N];//年龄     char xueli[N];//学历     char gongzi[N];//工资     char adress[N];//地址     char phone[N]; //电话     struct employee *next; }em;  em *head;  em *in(em *head)//将数据写进文件 {     FILE *fp;     em *p;     /*        head=(em *)malloc(sizeof(em));        if(head==NULL)        {        printf("分配失败，程序结束\n");        exit(-1);        }        p = head;        p->next=NULL;        */     if((fp=fopen("E:\\职工信息.txt","a"))==NULL)     {         printf("无法打开文件\n");         exit(-1);     }     p = head;     //if (head!=NULL)     while(p!=NULL)     {         //fprintf(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);         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,/**p1,*/ *p2;     head = (em *)malloc(sizeof(em));     if (!head)         exit(0);     //p1=p2=head;     p2=head;     fp=fopen("E:\\职工信息.txt","r");     if(fp==NULL)     {         printf("文件打开失败\n");         exit(-1);     }     p=(em *)malloc(sizeof(em));     p->next=NULL;     head->next=NULL;     //while(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)!=EOF)     while(fscanf(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)!=EOF)     {         //p1=p2;         p2->next=p;         p2=p;         p=(em *)malloc(sizeof(em));         p->next=NULL;     }     free(p);     fclose(fp);     return head; }  em *append()//录入员工数据 {     int n,i;      em*p,*end;      if (!head) {         head = (em *)malloc(sizeof(em));         end = head;     }      printf("输入要录入员工的个数\n");     scanf("%d",&n);      for(i=0;i<n;i++)     {         p = (em*)malloc(sizeof(em));         if (!p)             exit(0);         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);         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;     }     end->next=NULL;     head = in(head);      return head; } void display(em* head)//用链表遍历员工数据 {     if (!head)         return;      em*p = head->next;     //p = p->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;     }     /*        if(head->next==NULL)        {        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;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); }  void search_name()//姓名查询 {     em *p;     char name[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        if(head->next==NULL)        {        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;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); }  void search_age()//年龄查询 {     em *p;     char age[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        em *p;        char age[N];        if(head->next==NULL)        {        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;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); }  void search_xueli()//学历查询 {     em *p;     char xueli[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        em *p;        char xueli[N];        if(head->next==NULL)        {        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;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); } void search_gongzi()//工资查询 {     em *p;     char gongzi[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        em *p;        char gongzi[N];        if(head->next==NULL)        {        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;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     if (!p)         printf("无此人信息\n"); } void search_adress()//地址查询 {     em *p;     char adress[N];      if (!head || !head->next) {         printf("此系统为空\n");         return;     }     /*        em *p;        char adress[N];        if(head->next==NULL)        {        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;     }     /*        em *p;        char phone[N];        if(head->next==NULL)        {        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;         }         /*            else if(p->next==NULL)            printf("无此人信息\n");            head=in(head);            */     }     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()//删除 {     //head=out();     char name[N];     em*p=head->next,*p1=head->next,*p2;     if(head->next==NULL)     {         printf("此通讯录为空\n");         return ;     }     printf("请输入要删除的姓名\n");     scanf("%s",name);     while((strcmp(p->name,name)!=0)&&p->next!=NULL)     {         p1=p;         p=p->next;     }     if(strcmp(name,p->name)==0)     {         if(p==head->next&&p->next!=NULL)             head->next=p->next;         else if(p==head->next&&p->next==NULL)         {             head->next=p->next;             printf("信息已删除，此通讯录为空\n");             return ;         }         else             p1->next=p->next;     }     else{         printf("此信息不存在\n");         return;     }     printf("此消息已删除\n");     printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t地址\t电话\n");     for(p2=head->next;p2!=NULL;p2=p2->next)         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);     head=in(head); } void change()//修改 {     //head=out();     char name[N];     em*p=head->next;     if(p==NULL)     {         printf("此系统为空\n");         return ;     }     printf("请输入要修改的姓名\n")