朱有鹏C语言高级---4.9.3--单链表--从链表的头部插入节点(3)

朱有鹏C语言高级---4.9.2--单链表--访问单链表中各个节点的数据(1)

朱有鹏C语言高级---4.9.3--单链表--将创建节点的代码封装成一个函数(2)

朱有鹏C语言高级---4.9.3--单链表--从链表的头部插入节点(3)

从链表的尾部插入节点

尾部插入简单点,因为前面已经建立好的链表不用动。直接动最后一个。

因为我们在insert_tail中直接默认了头指针指向的有一个节点,因此如果程序中直接定义了头指针后就直接insert_tail就会报段错误。我们不得不在定义头指针之后先create_node创建一个新节点给头指针初始化,否则不能避免这个错误;但是这样解决让程序看起来逻辑有点不太顺,因为看起来第一个节点和后面的节点的创建、添加方式有点不同。

#include <stdio.h>
#include <strings.h>
#include <stdlib.h>

//构建一个链表节点
struct node
{
	int data;		//有效数据
	struct node *pNext;	//指向下一个节点的指针
};

//作用:创建一个链表的节点
//返回:指针,指针指向我们本函数新创建的一个节点的首地址
struct node * create_node(int data)
{
	struct node *p = (struct node *)malloc(sizeof(struct node));
	if (NULL == p)
	{
		printf("malloc error.\n");
		return NULL;
	}
	//清理申请到的堆内存
	bzero(p, sizeof(struct node));
	//填充节点
	p->data = data;
	p->pNext = NULL;//将来要指向下一个节点的首地址
			//实际操作时将下一个节点malloc返回的指针复制给这个
	return p;
}

//思路:由头指针向后遍历,直到走到原来的最后一个节点。原来最后一个节点里面的pNext是NULL,
//现在我们将它改成new就可以了。添加了之后新节点就变成了最后一个。
//pH:头指针,有链表的头指针才能找到链表。new是一个新的节点
void insert_tail(struct node *pH, struct node *new)
{
	//分两布来完成插入
	//第一步,先找到链表中最后一个节点
	struct node *p = pH;
	while (NULL != p->pNext)
	{
		p = p->pNext;//往后走一个节点
	}
	
	//第二部,将新节点插入到最后一个节点尾部		
	p->pNext = new;
}

int main(void)
{
	//不能指向NULL,因为尾插法时首先会判断头指针的值p->pNext
	//struct node *pHeader = NULL;	
	//定义头指针
	struct node *pHeader = create_node(1);	

	insert_tail(pHeader, create_node(2));
	insert_tail(pHeader, create_node(3));
	insert_tail(pHeader, create_node(4));
/*
	pHeader = create_node(1);	
	//将本节点和它前面的头指针关联起来

	pHeader->pNext = create_node(2);
	//将本节点和它前面的头指针关联起来

	pHeader->pNext->pNext = create_node(3);
	//将来要指向下一个节点的首地址

	//至此创建了一个有1个头指针+3个完整节点的链表	
*/
	
	//下面是4.9.3节的代码
	//访问链表的各个节点的有效数据,这个访问必须注意不能使用p,p1,p2,而只能使用pHeader
	
	//访问链表第一个节点的有效数据
	printf("node1 data: %d.\n", pHeader->data);//pHeader->data等同于p->data	
	//printf("p->data: %d.\n", p->data);

	//访问链表第二个节点的有效数据
	printf("node2 data: %d.\n", pHeader->pNext->data);
	//printf("p1->data: %d.\n", p1->data);
	// pHeader->pNext->pNext->data等同于p1->data

	//访问链表第3个节点的有效数据
	printf("node3 data: %d.\n", pHeader->pNext->pNext->data);
	//printf("p2->data: %d.\n", p2->data);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xiaodingqq/article/details/83086525