嵌入式linux-c语言-单链表之尾部插入节点

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单链表之尾部插入节点

1、单链表的实现之从尾部插入节点

1.1、从尾部插入节点

先请看上面的图,我们现在已经有了一个只有一个节点的链表,并且用creat_node又创建了一个首地址为new节点。怎么将这两个节点链接起来?

答案是显而易见的,只需要一步:pHeader->pNext=new;

但是这样的一句代码显然只适用于上图的这一种情况,我们想要的insert_tail()函数的功能是不管链表后面有几个节点,都可以使用该函数来完成尾部插入新节点的目的。于是我们就有了下面的思路。

将从尾部插入节点的任务分成两个步骤:

(1)找到链表的最后一个节点。

(2)将新的节点和原来的最后一个节点连接起来。

void insert_tail(struct node*pH,struct node*new)

{

struct node*p=pH;

while(NULL!=p->pNext)//第一步

{

p=p->pNext;

}

p->pNext=new;//第二步

}

函数的参数为链表的头指针pH和要插入的新节点的首地址new。第一步的while循环用来找到最后一个节点的首地址,第二步的作用就是将新的节点和原来的最后一个节点连接起来。

1.2、构建第一个简单的链表

好了,现在我们已经实现了creat_node()和insert_tail()两个必要的函数,可以开始构建真正的链表了,先构建一个有3个节点的链表好了。

#include

#include

#include

struct node

{

int data;

struct node*pNext;

};

struct node*create_node(int data);

void insert_tail(struct node*pH,struct node*new);

int main(void)

{

struct node*pHeader=create_node(1);

insert_tail(pHeader,create_node(2));

insert_tail(pHeader,create_node(3));

printf("node1data:%d.\n",pHeader->data);

printf("node2data:%d.\n",pHeader->pNext->data);

printf("node3data:%d.\n",pHeader->pNext->pNext->data);

return0;

}

1.3、什么是头结点

请思考一下如果像下面的方法来创建第一个节点可不可以?

struct node*pHeader=NULL;

insert_tail(pHeader,create_node(1));

答案当然是不可以的。我们在insert_tail中直接默认了头指针指向了一个节点,如果我们不给头指针添加一个节点直接insert_tail(pHeader, create_node(1)),函数内部就会试图操作pHeader->pNext,但是此时pHeader的值是NULL,因此会导致段错误。我们不得不在定义了头指针后创建一个新节点给指针初始化,否则不能避免这个错误,但是这样的方法使得我们必须对链表的第一个节点进行特殊对待。

链表还有另外一种用法,就是把头指针指向的第一个节点作为头结点使用。头结

点有两个特点:它紧跟在头指针后面;头结点的数据部分是空的(或者存链表的节点数),指针部分指向第一个有效节点。

这样看来头结点确实和其他节点不同,头节点在创建头指针时一并创建并且和头指

针关联起来。后面真正存储数据的节点就用节点添加函数来完成,譬如insert_tail。这种处理方法的思路就是既然第一个节点注定是要特殊对待的就干脆让它更特殊一点。

链表有没有头结点是不同的。体现在链表的插入节点,删除节点,遍历节点

解析

链表的各个算法函数都不相同。所以在设计一个链表的时候有头结点后面的所有算法也要按照有头结点的情况来处理,如果设计时没有头结点那么后面的算法也不要考虑头结点。实际编程中两种链表都有人用,所以在阅读别人的代码的时候要注意有没有头结点。我们接下来介绍的算法都是默认有头结点的。

获取更多视频资料欢迎加入397164505朱老师技术群。

总之头结点不是必须的,可有可无,但是加上头结点比较好,因为有了头结点后对所有节点的操作方式就达成了统一不需要每次都对第一个节点特殊对待。

相关文档
最新文档