/*
===========================
成果:输出节点
返回: void
===========================
*/
void Print(struct student *head)
{
struct student *p;
printf ("nNow,These %d records are:n",n);
p = head;
if(head != NULL) //只要不是空链表,就输出链表中全部节点
{
printf("head is %on",head); //输出面指针指向的地点
do
{
/*
输出响应的值:当前节点地点、各字段值、当前节点的下一节点地点。
这样输出便于读者形象看到一个单向链表在计较机中的存储布局,和我们
计划的图示是千篇一律的。
*/
printf ("%o %d %5.1f %on",p,p->num,p->score,p->next);
p = p->next; //移到下一个节点
}
while (p != NULL);
}
}/*
===========================
成果:输出节点
返回: void
===========================
*/
void Print(struct student *head)
{
struct student *p;
printf ("nNow,p->next);
p = p->next; //移到下一个节点
}
while (p != NULL);
}
}
单向链表的删除图示:
---->[NULL]
head
图3:空链表
从图3可知,空链表显然不能删除
---->[1]---->[2]...---->[n]---->[NULL](原链表)
head 1->next 2->next n->next
---->[2]...---->[n]---->[NULL](删除后链表)
head 2->next n->next
图4:有N个节点的链表,删除第一个节点
团结原链表和删除后的链表,就很轻易写出响应的代码。操纵要领如下:
1、你要大白head就是第1个节点,head->next就是第2个节点;
2、删除后head指向第2个节点,就是让head=head->next,OK这样就行了。
---->[1]---->[2]---->[3]...---->[n]---->[NULL](原链表)
head 1->next 2->next 3->next n->next
---->[1]---->[3]...---->[n]---->[NULL](删除后链表)
head 1->next 3->next n->next
图5:有N个节点的链表,删除中间一个(这里图示删除第2个)
团结原链表和删除后的链表,就很轻易写出响应的代码。操纵要领如下:
1、你要大白head就是第1个节点,1->next就是第2个节点,2->next就是第3个节点;
2、删除后2,1指向第3个节点,就是让1->next=2->next。
删除指定学号的节点的函数为:
/*
==========================
成果:删除指定节点
(此例中是删除指定学号的节点)
返回:指向链表表头的指针
==========================
*/
struct student *Del (struct student *head,int num)
{
struct student *p1; //p1生涯当前必要搜查的节点的地点
struct student *p2; //p2生涯当前搜查过的节点的地点
if (head == NULL) //是空链表(团结图3领略)
{
printf ("nList is null!n");
return head;
}
//定位要删除的节点
p1 = head;
while (p1->num != num && p1->next != NULL) //p1指向的节点不是所要查找的,而且它不是最后一个节点,就继承往下找
{
p2 = p1; //生涯当前节点的地点
p1 = p1->next; //后移一个节点
} (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|