带头双向链表实现(带图详解)

本文详细介绍了带头双向链表的概念,包括其结构和特点,并提供了创建、插入、删除、查找和销毁等操作的代码实现,帮助理解双向链表的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.什么是带头双向链表

2.怎么创建带头双向指针

3.代码实现部分(增、删、查、改)

1.双向链表的初始化

2.双向链表的头插

3.双向链表的头删

4.双向链表的尾插

5.双向链表的尾删

6.双向链表的打印

7.双向链表的查找

8.双向链表在指定位置前插入

9.双向链表删除指定位置

10.双向链表的销毁


1.什么是带头双向链表

带头双向链表表示的就是一个有着双向指针的链表既能通过当前位置找到上一个数据的地址也可以找到下一个数据的地址;即是一个有着两个指针的结构体;而那个头就是head(为哨兵位),哨兵位不存储数据,它的作用是能够将头尾链接起来。

 双向链表大致结构如图:但其中head哨兵位的头节点存储的是最后一个数据(如果链表为空的话则指向自己),最后一个数据的尾节点指向哨兵位;

2.怎么创建带头双向指针

typedef int LTDataType;
typedef struct ListNode
{
	LTDataType data;
	struct ListNode* next;
	struct ListNode* prev;
}ListNode;

带头双向指针的结构类型。

3.代码实现部分(增、删、查、改)

1.双向链表的初始化

ListNode* ListCreate()// 创建返回链表的头结点.
{
	ListNode* pHead = (ListNode*)malloc(sizeof(ListNode));
	if (pHead == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	pHead->next = pHead;
	pHead->prev = pHead;

	return pHead;
}

直接创建一个头节点让节点的头和尾都指向自己就初始化完成了;

2.双向链表的头插

void ListPushFront(ListNode* pHead, LTDataType x)
{
	assert(pHead);
	ListNode* tail = pHead->next;
	ListNode* cur = BuyListNode(x);

	cur->prev = pHead;
	pHead->next = cur;
	tail->prev = cur;
	cur->next = tail;

}

3.双向链表的头删

void ListPopFront(ListNode* pHead)
{
	assert(pHead);
	ListNode* next = pHead->next->next;
	ListNode* cur = pHead->next;

	next->prev = pHead;
	pHead->next = next;
	free(cur);
	cur = NULL;

}

4.双向链表的尾插

void ListPushBack(ListNode* pHead, LTDataType x)
{
	assert(pHead);
	ListNode* tail = pHead->prev;
	ListNode* cur = BuyListNode(x);
	
	cur->next = pHead;
	cur->prev = tail;
	pHead->prev = cur;
	tail->next = cur;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值