c语言链表非重复插入,C语言实现双向非循环链表(不带头结点)的节点插入

我在之前一篇博客中《C语言实现双向非循环链表的逆序打印》讲到了如何逆序输出一个双向非循环链表,让我们对这种链表类型有了理性的认识。今天我们要来实现的是对双向非循环链表进行节点的插入。大家可以和《C语言实现单链表节点的插入》单链表的节点插入对比着学习。代码上传至  https://github.com/chenyufeng1991/InsertDoubleLinkedList 。

核心代码如下:

Node *InsertList(Node *pNode,int pos,int x){

int i = 1;

int size = sizeList(pNode);

Node *pMove;

Node *pInsert;

pInsert = (Node *)malloc(sizeof(Node));

memset(pInsert, 0, sizeof(Node));

pInsert->element = x;

pInsert->next = NULL;

pInsert->prior = NULL;

pMove = pNode;

//首先检查pos值是否合法

if (pos < 0 || pos > size) {

printf("%s函数执行,输入的pos值非法,插入节点失败\n",__FUNCTION__);

return pNode;

}

//原链表是一个空链表,在第一个位置插入节点

if (pNode == NULL && pos == 0) {

pNode = pInsert;

printf("%s函数执行,在pos=%d位置插入x=%d节点成功\n",__FUNCTION__,pos,x);

return pNode;

}

//单独考虑插入到第一个节点和最后一个节点

if (pos == 0) {

//插入的节点作为第一个节点

pInsert->next = pNode;

pNode->prior = pInsert;

pNode = pInsert;

}else if(pos == size){

//插入的节点是最后一个节点

while (pMove->next != NULL) {

pMove = pMove->next;

}

pMove->next = pInsert;

pInsert->prior = pMove;

}else{

while (pMove != NULL) {

if (i == pos) {

//找到该位置,请注意下面的链表的链接顺序很重要

pInsert->next = pMove->next;

pMove->next->prior = pInsert;

pInsert->prior = pMove;

pMove->next = pInsert;

break;

}else{

//继续找下一个节点

i++;

pMove = pMove->next;

}

}

}

printf("%s函数执行,在pos=%d位置插入x=%d节点成功\n",__FUNCTION__,pos,x);

return pNode;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值