从一个动态链表中删除一个结点就是将该系欸但从链表中分离出来,并不是真正的从内存中将该节点抹去,只需要改变连接关系就行了。
重点语句:
p1->next=p2->next;
将下一个结点的地址赋给前一个结点的地址域即可。
例子:编写函数del,在单向链表中删除一个结点。
分析:本题目所需要的建立链表输出链表和前几节都一样,特殊的是del这个删除操作的函数。
#include<stdio.h>
#include<stdlib.h>
int main()
{
SNODE *creat(SNODE *head);
void print(SNODE *head);
SNODE *del(SNODE *head,int number);
int score;
SNODE *head;
head=NULL;
printf("输入若干学生信息");
head=creat(head);
printf("现有信息");
print(head);
printf("请输入要删除的学号:");
scanf("%d",&score);
head=del(head,score);
printf("新的信息为:");
print(head);
return 0;
}
SNODE *del(SNODE *head,int number)
{
SNODE *p1,*p2;;
if(head==NULL)
{
printf("链表为空");
return(head);
}
p1=head;
while(number!=p1->id&&p1->next!=NULL) //p1指向的不是要找的结点,并且后面好友结点
{
p2=p1;
p1=p1->next; //p1后移一个
}
if(number==p1->id) //找到要删除的结点
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
printf("delete:%d\n",number);
}
else
printf("找不到该结点");
return (head);
}
其中几个函数和上一章节中的一个样子,这里就不明确指出了,如果需要就请参考上一节(包括创建链表和访问链表等)