为什么头指针不能直接后移啊?head=head->next

运行结果如下,第一个是正常的,第二个就有问题了:
img

img

代码如下:

img

img

img
img

#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct student//定义结构体 { char id[10]; char name[10]; struct student *Next;}STU;STU *CreatLink(STU a[],int n)//创建链表 {STU *head;int i;head=&a[0];for(i=0;i<n-1;i++){a[i].Next=&a[i+1];}a[i].Next=NULL;return head; } void Output(STU *head)//输出链表 { STU *p; p=head; printf("学号\t%姓名\n"); while(p) { printf("%s\t%s\n",p->id,p->name); p=p->Next; } printf("\n===========================\n");} STU *Delid(STU *head,char ID[])//删除某个id对应的信息 { STU *p=head,*front; while(p) { if(strcmp(p->id,ID)==0)//查找到要删除的id { break;//退出循环 } front=p; p=p->Next; } if(p==head)//说明要删除第一个id的信息 { head=p->Next;//将头结点移到后一个结点 question:也就是这一步出现错误了 } else { if(p) front->Next=p->Next; else printf("查无此人,无法删除"); } return head;}int main() { STU a[]={ {"2201","赵大"}, {"2202","李二"}, {"2203","张三"}, {"2204","贾四"}, {"2205","王五"}, {"2206","钱六"}, {"2207","孙七"} },*head; char ID[10]; head=CreatLink(a,7); Output(head); printf("请输入id:"); gets(ID); printf("\n===========================\n"); Delid(head,ID); printf("\n===========================\n"); Output(head); system("pause"); return 0; }

改成head = Delid(head,ID);就行了
head是指针,作为参数只能修改外部传入的指针指向的地址的存储数据,而不能修改指针自身的值
如果想要通过参数修改指针自身的值,那么就需要用指针的指针作为参数类型

Delid()中 head 参数是指针,把head 参数指针重新指向一个新的地址,只能改变head 参数自身。
main主函数中的head不会跟着改变。
你可以把main函数中
Delid(head,ID);
改成
head=Delid(head,ID);
重新接收下Delid()函数return head;的返回值