2023年11月26日发(作者:)

C语⾔中链表怎么删除结点?

第⼀个⽅法:

/*根据姓名删除链表的中的学⽣记录*/

void deleteByName(struct STUDENT * head)

{

struct STUDENT *p,*q;

char name[20];

if(head==NULL)

{

printf("链表为空。n");

return;

}

printf("请输⼊要删除的学⽣的姓名:");

scanf("%s",name);

for(p=head->next,q=head;p!=NULL;p=p->next,q=q->next)

{

if(strcmp(p->name,name)==0)

{

q->next=p->next;

}

}

if(p==NULL)

printf("要删除的学⽣不存在。");

else

free(p);

}

这个⽅法主要是 q->next=p->next ,然后释放 p结点所占的内存空间。

2个⽅法:

/***************

函数功能:

删除出勤学⽣姓名

返回:指向链表表头的指针

/***************/

struct student * del_message(struct student* head)

{

FILE* fp;

struct student* pointer,*temp; //p指向新的结点 temp指针为临时结点

InputBox(,11,"请输⼊要删除学⽣姓名的学号");

fp=fopen("","wb+");

pointer=head->next; //从头结点开始遍历指向下⼀个节点

while(pointer!=NULL) //如果遍历不到空数据的话就⼀直遍历

{

if(strcmp(pointer->ID,)==0) //找到要删除的结点

{

temp=pointer; //将找到的结点赋值给临时temp结点变量

pointer=pointer->next; // p结点的下⼀个节点 赋值给p结点

free(temp); //释放临时temp结点所占内存

while(pointer!=NULL) //将剩下的结点写⼊

{

fwrite(pointer,sizeof(struct student),1,fp);

pointer=pointer->next;

}

break;

}

fwrite(pointer,sizeof(struct student),1,fp); //开始遍历链表结点,并写⼊⽂件

pointer=pointer->next; //p指针指向新的结点(下⼀个结点)

}

fclose(fp);

outtextxy(220, 200, "删除出勤学⽣成功!");

return head;

}

这个⽅法先找到p结点,也就是要删除的结点,然后将其赋值给⼀个临时的temp结构变量,然后p结点的下⼀个结点赋值给p结点,最后释放

temp结点所占⽤的内存。

temp=pointer; //将找到的结点赋值给临时temp结点变量

pointer=pointer->next; // p结点的下⼀个节点 赋值给p结点

free(temp); //释放临时temp结点所占内存

第⼆个⽅法是是从⽂件中读写链表结构。

不知道两种⽅法是否⼀样?