user-0 提问: c语言问题，为什么delete，search，edito函数不能调用链表，怎么改

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> //#include<conio.h> #include<string.h>  /*定义结构体*/ int n=0; struct student {     //char ID[4];     char ID[16]; //for '\0'     char name[20];     float score;     struct student *next; };  /*创建一个只有头结点的空链表*/ struct student *create_head() {     struct student *head;     head = (struct student*)malloc(sizeof (struct student) );     if(head==NULL)             //小心别漏这个     {         printf("申请头结点失败!\n");         return NULL;     }     head->next = NULL;     return head; }  /*将s指向的结点插入链表,使链表保持升序,并返回头结点*/ struct student *add(struct student *head) {     struct student *p = head;     struct student *s;     s = (struct student*)malloc( sizeof(struct student) );     printf("输入学生信息:\n");     while(1)//判断学号是否合理     {         printf("学号:");         scanf("%s",s->ID);         if(strlen(s->ID)==4)         {             printf("姓名:");             scanf("%s",s->name);             printf("成绩:");             scanf("%f",&s->score);             break;         }         else         {             printf("输入非法：学号必须为4位，请重新输入\n");             continue;         }     }     while(p->next!=NULL&&strcmp(s->ID,p->next->ID))//特别注意&&左右不能写反,若s最大,最后p->next=NULL,p->next->ID运行出错         p=p->next;     if(p->next==NULL) //s->ID最大的情况     //其实两种情况可以并在一块写     {         p->next=s;    //连接结点         s->next=NULL;   //p->next就等于NULL     }     else     {         p->next=s;    //连接结点         s->next=p->next;     }     n = n+1;      return head; } void Mainmenu() {     printf("=================\n");     printf("|        1.添加学生        |\n");     printf("|        2.查询学生        |\n");     printf("|        3.编辑学生        |\n");     printf("|        4.删除学生        |\n");     printf("|        5.打印全部        |\n");     printf("|        6.总人数          |\n");     printf("|        7.退出系统        |\n"); } /*查找符合条件的结点,并返回指向该结点的指针*/ void search(struct student *head) {     struct student *p=head->next;     char a[20];     int f=0;     printf("请输入要查找学生的学号:\n");     scanf("%s",a);     for(;p!=NULL;p=p->next)         if(!strcmp(a,p->ID))         {             printf("学号为%s的学生信息为:姓名(%s) 成绩(%f)\n",p->ID,p->name,p->score);             f=1;             break;         }     if(!f)         printf("该学生不存在\n"); }  /*输出链表各结点的值,也称对链 输出链表各结点的值,也称对链表的遍历*/ void print(struct student *head) {     struct student *p;     printf("  链表如下:  \n");     p=head->next;     while(p!=NULL)     {         printf("学号为%s的学生信息为:姓名(%s) 成绩(%f)\n",p->ID,p->name,p->score);         p=p->next;     } } /*释放链表*/ void free_list(struct student *head) {     struct student *p=head ;     printf("释放链表:\n");     while(p!=NULL)     {         head = head->next;         free(p);         p = head;     }     printf("释放链表成功!\n"); } /*删除链表中值为ID的结点,并返回链表的首指针*/ void delete_note(struct student *head) {     struct student *p1=head->next , *p2=head ;     char a[4];     printf("选择删除功能:\n");     printf("1.根据学号删除学生信息\n");     printf("2.删除所有学生信息\n");     //switch(getch())     getchar();     switch(getchar())     {         case '1':             {                 printf("请输入要删除学生的学号:");                 scanf("%s",a);                 while(p1!=NULL&&strcmp(p1->ID,a)!=0)//特别注意&&左右条件不能调换,若调换如果p1指向NULL时p1->ID运行出错                 {                     p2 = p1;                     p1 = p1->next;                 }                 if(p1==NULL) {   //特别注意两个if不能调换,若调换如果p1指向NULL时,p1->ID运行出错                     printf("找不到符合删除要求的结点!!!\n");                     break;                 }                 if(strcmp(p1->ID,a)==0)                 {                     p2->next = p1->next;                     free(p1);                     printf("结点删除成功!\n");                 }             }             break;         case '2':             {                 free_list(head);    //少了这一步会导致内存泄露                 head=NULL;                 printf("已删除全部学生\n");             }             break;     } } void Edit(struct student *head) {     char a[20],b[20];     float c;     struct student *p=head;      printf("请输入要编辑学生的学号:");     scanf("%s",a);     getchar();      while(1)     {         if(strcmp(p->ID,a)==0)         {             printf("请选择修改项目:\n");             printf("1.姓名\n");             printf("2.分数\n");             //switch(getch())             switch(getchar())             {                 case '1':                     {                         printf("请输入修改后的姓名:");                         scanf("%s",b);                         strcpy(p->name,b);                     }                 case '2':                     {                         printf("请输入修改后的分数:");                         scanf("%f",&c);                         p->score = c;                     }             }             break;         }         else             p = p->next;         if (!p)             break;     }     if(p==NULL)     {         printf("学号不存在，请重新输入\n");     } } void PrintCnt() {     printf("%d",n); } //void main() int main() {     struct student *p , *head ;     head=create_head();     while(1)     {         Mainmenu();         //switch(getch())         switch(getchar())         {             case '1':                 {                     add(head);                     break;                 }             case '2':                 {                     search(head);                     break;                 }             case '3':                 {                     Edit(head);                     break;                 }             case '4':                 {                     delete_note(head);                     break;                 }             case '5':                 {                     print(head);                     break;                 }             case '6':                 {                     PrintCnt();                     break;                 }             case '7':                 exit(0);             default:                 break;         }         getchar();     } }  供参考 已经修改了一些codes，但是测试发现代码里还有些逻辑错误，建议继续调试。