/*
===========================
功能:输出节点
返回: 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; //后移一个节点
} (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|