C语言实现双链表插入节点

网上关于这个主题的讲解和代码很多,本文不做过于详尽的描述。本文主要从思考的角度来看待这个问题,如何实现在双链表中插入特点的节点。


如图所示,这是一个常见的双向链表结构。每一个节点存在三个域,分别是数据值部分、前向域和后向域。在没有准备插入节点之前,A 和B 节点的关系如图中1,2线条所示,A节点的后向域指向B节点,B节点的前向域指向A节点。那么,如果需要在A节点之后插入一个节点C,该如何插入呢?实际上,从前面的描述中我们可以知道,要想在A节点和B节点间插入C节点,实际上就是要改变线条1,2的指向关系,令他们重新指向新节点,实现达到目的的效果。

 

因为是在A节点之后插入新节点,所以,A节点的信息是已知的且目前不会变化的,那么我们可以先处理"未知的"B节点和C节点的关系。实现B节点和C节点的连接关系,就是实现将C节点的后向域指向B节点,将B节点的前向域指向C节点,如图中step1和step2所示。那么step1和step2的顺序可以交换吗?当然是可以的。这就是我们前面所说的先处理B节点和C节点的关系,因为无论step1和step2如何变化,我们都能准确无误通过A的后向域找到B节点。好,B节点和C节点的关系处理完毕。

接下来我们需要做的是,处理A节点和C节点的关系,如下图中所示,那么step3和step4的顺序可以交换吗 ?当然也是可以的。因为此时A和C 是相对独立的2个节点,step3和step4顺序不影响两者之间的连接关系。

代码总结如下:

typedef struct Node{
	int data;
	struct Node* next;
	struct Node* prev;
}node;

void InsertNode(node* A, int data)
{
	if(NULL == A)
		return;
		
	node* C = (node*)malloc(sizeof(node));
	
	C->data = data;
	C->next = NULL;
	C->prev = NULL;
	
	C->next = A->next;
	A->next->next = C;
	C->prev = A;
	A->next = C;
}

当然,上述代码写的比较简单,实际情况还需要考虑头和尾的边界情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值