朱有鹏C语言高级---4.9.5--单链表--从链表头部插入新节点(5)

 

 朱有鹏C语言高级---4.9.5--单链表--从链表头部插入新节点(5)

 

从链表头部插入新节点

(1)注意写代码过程中的箭头符号 ( -> ),和说话过程中的指针指向。这是两码事,容易搞混。箭头符号实际上是用指针方式来访问结构体,所以箭头符号的实质是访问结构体中的成员。更清楚一点说程序中的箭头和链表的连接没有任何关系;链表中的节点通过指针指向来连接,编程中表现为一个赋值语句(用=来进行连接,例如头插法:new->pNext = pH->pNext),实质是把后一节点的首地址,赋值给前一个节点中的pNext元素做为值。

(2)链表可以从头部插入,也可以从尾部插入。也可以两头插入。头部插入和尾部插入对链表来说几乎没有差别。对链表本身无差别,但是有时候对业务逻辑有差别。

 

头插法

我们只要找到头结点就ok了。

 

#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)
{
	int cnt = 0;
	//分两布来完成插入
	//第一步,先找到链表中最后一个节点
	struct node *p = pH;
	while (NULL != p->pNext)
	{
		p = p->pNext;//往后走一个节点
		cnt++;
	}
	
	//第二部,将新节点插入到最后一个节点尾部		
	p->pNext = new;
	pH->data = cnt + 1;
}

//思路:
void insert_head(struct node *pH, struct node *new)
{
	//第1步: 新节点的next指向原来的第一个节点
	new->pNext = pH->pNext;	

	//第2部: 头节点的next指向新节点的地址
	pH->pNext = new;

	//第3步: 头节点中的计数要加1
	pH->data += 1;
}

int main(void)
{
	//不能指向NULL,因为尾插法时首先会判断头指针的值p->pNext
	//struct node *pHeader = NULL;	
	//定义头指针,创建头节点。头节点的数据域传的是节点的个数
	struct node *pHeader = create_node(0);//数据定义0表示没放数据	

	insert_head(pHeader, create_node(1));
	insert_head(pHeader, create_node(2));
	insert_head(pHeader, create_node(3));
/*
	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("header node data: %d.\n", pHeader->data);//pHeader->data等同于p->data	

	//访问链表第1个节点的有效数据
	printf("node1 data: %d.\n", pHeader->pNext->data);

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

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

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值