笔试题 实现双向链表的插入和删除

双向链表详解
本文深入讲解了双向链表的基本概念及其实现方法,包括定义、创建空链表、查找节点位置、插入节点和删除节点等核心操作,并附带具体代码实现。

这几天做了笔试题发现双向链表这一块自己掌握的很差,所以写下此博客来加深自己对双向链表的理解

首先什么是双向链表?

通过翻阅资料知道双向链表是指在前驱和后继方向都能遍历的线性表


自己在软件上写了几遍,代码如下

1、双向链表的定义

typedef int ElemType;

typedef struct node{
	ElemType data;
	struct node *left;
	struct node *right;
}DblNode;

typedef DblNode *DblList;

2、建立空的双向链表

void CreateDblList(DblList *first)                     //创建双向链表
{
	(*first) = (DblNode *)malloc(sizeof(DblNode));

	if (first == NULL)
	{
		return;
	}

	(*first)->left = (*first)->right = (*first);        //初始化       表头结点的指针都指向自己     
}

3、查找第 i 个结点的位置

DblNode* Locate(DblList first, int i)  //查找第 i 个结点在链中的位置
{
	if (i < 0)
		return first;
	DblNode *p = first->right;
	int j = 1;

	while (p != NULL && i < j)
	{
		p = p->right;
		j++;
	}
	return p;

}

4、双向链表插入结点

void InsertList(DblList first,int i, ElemType data)     //双向链表插入结点
{
	DblNode *p = Locate(first, i-1);
	if (p == first && i != 1)
		return 0;
	DblNode *q = (DblNode *)malloc(sizeof(DblNode));

	q->data = data;
	q->left = p;
	q->right = p->right;
	p->right = q;
	p->right->left = q;

}

5、双向链表删除结点

void Remove(DblList first, int i)          //双向链表删除结点
{
	DblNode *p = Locate(first, i);

	if (p == first)
		return 0;
	p->right->left = p->left;
	p->left->right = p->right;

	free(p);
}

双向链表相对单链表稍微复杂些,但我还是慢慢掌握了,继续加油!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值