user-0 提问: 无法返回表头

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> struct per    /*定义结构体类型*/ {     long int num;     char name[20];     char tel[12];     char mail[30];     char add[50];      long int mnum;     char id[18];     struct per *next; }; struct per *jianli();                       /*声明建立通信录函数*/ void shuchu(struct per *head);              /*声明输出通信录函数*/ struct per *tianjia(struct per *head);      /*声明添加联系人函数*/ struct per *shanchu(struct per *head);      /*声明删除联系人函数*/ struct per *chazhao(struct per *head);      /*声明查找联系人函数*/ struct per *head=NULL; int main() {   /*主函数*/     int select;     printf("\n\t***************** 欢迎进入个人通信录管理系统 ******************\n");     /*主控菜单*/     printf("\n\t ----------------->>   1: 建 立 通 信 录   <<-----------------");     printf("\n\t ----------------->>   2: 输 出 通 信 录   <<-----------------");     printf("\n\t ----------------->>   3: 添 加 联 系 人   <<-----------------");     printf("\n\t ----------------->>   4: 删 除 联 系 人   <<-----------------");     printf("\n\t ----------------->>   5: 查 找 联 系 人   <<-----------------");     printf("\n\t ----------------->>   0: 退 出 系 统      <<-----------------\n");      printf("\n\t***************************************************************\n");     printf("\n\t请选择（0---5）：");fflush(stdout);     rewind(stdin);scanf("%d",&select);     printf("\n");     switch(select) {         /*对应模块函数*/     case 1:         head=jianli();         break;     case 2:         shuchu(head);         break;     case 3:         head=tianjia(head);         break;     case 4:         head=shanchu(head);         break;     case 5:         head=chazhao(head);         break;     case 0:         break;     default:         printf("您的输入有误，请重新输入（0---5）：\n");      }     while(select!=0); }   /*建立通信录函数*/ struct per *jianli() {      /*创建链表，并返回表头指针*/     struct per *head;       /*表头*/     struct per *p1;         /*新建节点*/     struct per *p2;         /*表尾节点*/     long int num1;     char name1[20];     char tel1[12];     char mail1[30];     char add1[50];     long int mnum1;     char id1[18];     head=NULL;              /*无任何节点，表头指向空*/      while(1) {         printf("请输入联系人编号、姓名、电话、身份证号、邮箱、地址及邮编（用空格分隔，用0结束）\n");         rewind(stdin);scanf("%d",&num1);         if (num1==0) break;/*假设num=0表示输入结束*/         scanf(" %s %s %s %s %s %d",name1,tel1,id1,mail1,add1,&mnum1);     /*读入第一个联系人的信息*/         p1=(struct per *)malloc(sizeof(struct per));      /*新建一个节点*/         p1->num=num1;                                     /*存入联系人的信息*/         strcpy(p1->name,name1);         strcpy(p1->tel,tel1);         strcpy(p1->id,id1);         strcpy(p1->mail,mail1);         strcpy(p1->add,add1);         p1->mnum=mnum1;         p1->next=NULL;                /*将next域置为空，表示尾节点*/         if(head==NULL)             head=p1;                  /*第一个新建节点是表头*/         else             p2->next=p1;              /*原表尾的下一个节点是新节点*/         p2=p1;                        /*新建节点成为表尾*/     }     return head;              /*返回表头指针*/ } /*输出通信录函数*/ void shuchu(struct per *head) {     struct per *p;     int n=0;                           /*统计节点数，即联系人数*/     printf("\n\t*******************通*******信*******录*******************\n");     printf("\n%-5s%-12s%-12s%-19s%-17s%-9s%-7s\n","编号","姓名","电话号码","身份证号","邮箱","地址","邮编");     if(head!=NULL) {         for(p=head; p!=NULL; p=p->next) {     /*如果到达尾节点退出循环，否则继续*/             printf("%-5d%-12s%-12s%-19s%-17s%-9s%-7d\n",p->num,p->name,p->tel,p->id,p->mail,p->add,p->mnum);             n++;         }         printf("联系人总数：%d\n\n",n);     } else         printf("\n对不起，该通信录中没有任何联系人!\n\n"); } /*添加联系人函数*/ struct per*tianjia(struct per*head) {     struct per*p;     struct per*p1;     struct per*p2;     p2=head;     p=(struct per*)malloc(sizeof(struct per));              /*新建节点p*/     printf("请输入要添加的联系人的编号、姓名、电话、身份证号、邮箱、地址、邮编:\n");     rewind(stdin);scanf("%d %s %s %s %s %s %d",&p->num,p->name,p->tel,p->id,p->mail,p->add,&p->mnum);     printf("成功添加联系人%s !\n",p->name);     if(head==NULL)  {         head=p;         p->next=NULL;     }  else {         while((p->num>p2->num)&&(p2->next!=NULL)) {   /*查找添加位置*/             p1=p2;             p2=p2->next;         }         if(p->num<=p2->num) {  /*从小到大排列，添加至表内*/             if(p2==head) {                 head=p;                 p->next=p2;             } else    {                 p1->next=p;                 p->next=p2;             }         } else {               /*添加至表尾*/             p2->next=p;             p->next=NULL;         }     }     return(head); } /*删除联系人函数*/ struct per *shanchu(struct per *head) {     struct per *p2;     struct per *p1;     int num1,n;     printf("请输入要删除的联系人编号：");fflush(stdout);     /*根据输入信息查找联系人*/     rewind(stdin);scanf("%d",&num1);     if(head==NULL)  {         printf("\n通讯录为空\n\n");         return(head);     }     p2=head;     while(num1 != p2-> num && p2->next !=NULL)  {         p1=p2;         p2=p2->next;     }     if(num1==p2->num)  {         printf("\n成功查询到该联系人！\n");         printf("\n%-5s%-12s%-12s%-19s%-17s%-9s%-7s\n","编号","姓名","电话号码","身份证号","邮箱","地址","邮编");         printf("%-5d%-12s%-12s%-19s%-17s%-9s%-7d",p2->num,p2->name,p2->tel,p2->id,p2->mail,p2->add,p2->mnum);         printf("\n确定删除？  1确定   0取消 ");fflush(stdout);         rewind(stdin);scanf("%d",&n);         switch(n)   {         case 1:   {                 if(p2==head)                     head=p2->next;                 else                     p1->next=p2->next;                 free(p2);                 printf("\n成功删除编号为%ld的联系人！\n\n",num1);             }             break;         case 0:             printf("\n您取消了删除任务，联系人未被删除！\n");             break;         }     } else         printf("\n对不起，该通信录中没有任何联系人!\n\n");     return(head); } /*查找函数*/ struct per *chazhao(struct per *head) {     struct per*p2;     char id1[20];     printf(" 请输入要查找的联系人身份证号：\n");     rewind(stdin);scanf("%s",id1);     if(head==NULL)  {         printf("\n通讯录为空\n\n");         return(head);     }     p2=head;     while (p2)  {         if(strcmp(p2->id,id1)==0) {             printf("\n成功查询到该联系人！\n");             printf("\n%-5s%-12s%-12s%-19s%-17s%-9s%-7s\n","编号","姓名","电话号码","身份证号","邮箱","地址","邮编");             printf("%-5d%-12s%-12s%-19s%-17s%-9s%-7d\n",p2->num,p2->name,p2->tel,p2->id,                    p2->mail,p2->add,p2->mnum);             break;         }         p2=p2->next;     }     if(!p2)         printf("\n对不起，该通信录没有该联系人!\n\n");     return (head); }

user: user-0
content: dddddddddd