c语言实现双向链表的插入

/*
** 把一个新值插入到双向链表中,rootp是一个指向根节点的指针
** value是需要插入的新值
** 返回值:如果链表原先已经存在这个值,返回0
** 如果为新值分配内存失败,返回-1
** 如果新值插入成功,返回1
*/

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

typedef struct NODE {
	struct NODE* fwd;
	struct NODE* bwd;
	int			 value;
} Node;

int
dll_insert(register Node* rootp, int value)
{
	register Node* this;
	register Node* next;
	register Node* newnode;

	/*
	** 查看value是否已经存在于链表中,如果是就返回
	** 否则,为新值创建一个新节点
	** this 将指向应该在新节点之前的节点
	** next 将指向应该在新节点之后的节点
	*/
	for (this = rootp; (next = this->fwd) != NULL; this = next) {
		if (next->value == value)
			return 0;
		if (next->value > value)
			break;
	}

	newnode = (Node*)malloc(sizeof(Node));
	if (newnode == NULL)
		return -1;
	newnode->value = value;

	/*
	**把新节点添加到链表中
	*/
	newnode->fwd = next;
	this->fwd = newnode;

	if (this != rootp)
		newnode->bwd = this;
	else
		newnode->bwd = NULL;
	if (next != NULL)
		next->bwd = newnode;
	else
		rootp->bwd = newnode;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值