双向链表的增删查改

本文详细介绍了双向链表的实现,包括结构体定义、初始化、节点申请、插入、删除、查找、销毁及打印等功能。强调了头结点与尾结点的特殊关系,并提供了完整程序示例。
摘要由CSDN通过智能技术生成

目录

 结构体类型中要有三个元素:1、指向前一个节点的指针prev。2、存储的数据val。3、指向后一个节点的指针next。还有要注意的点就是:头节点head和尾结点tail的关系,head->prev=tail,tail->next=head.

1.两个typedef,做好基础工作

2.需要定义的各个函数

3.LTDinit初始化函数的细节

4.BuyListNode申请空间函数

5.ListInsert插入函数函数细节(默认尾插)

 6.ListErase删除函数细节

7.关于头插尾插,头删尾删

8.ListFind查找函数

9.ListDestory销毁函数

10.ListPrint打印函数

11.完整程序加运行


  •  结构体类型中要有三个元素:1、指向前一个节点的指针prev。2、存储的数据val。3、指向后一个节点的指针next。还有要注意的点就是:头节点head和尾结点tail的关系,head->prev=tail,tail->next=head.

若一个双向链表只有头节点head那么他的head->next=head;head->prev=head;


1.两个typedef,做好基础工作

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

方便以后修改数据类型和简化写代码。


2.需要定义的各个函数

LTNode* LTDinit();//初始化双向链表
LTNode* BuyListNode(LTDataType x);//申请新的节点
void ListPrint(LTNode* phead);//打印双向链表
void ListInsert(LTNode* pos, LTDataType x);//在任意位置插入
void ListPushBack(LTNode* phead, LTDataType x);//尾部插入
void ListPushFront(LTNode* phead, LTDataType x);//头部插入
void ListErase(LTNode* pos);//删除数据
void ListPopBack(LTNode* phead);//尾部删除
void ListPopFront(LTNode* phead);//头部删除
LTNode* ListFind(LTNode* phead, LTDataType x);//查找
void ListDestory(LTNode* phead);//销毁双向链表

3.LTDinit初始化函数的细节

LTNode* LTDinit()
{
	LTNode* guard = NULL;//创建哨兵位节点,方便尾插
	guard = (LTNode*)malloc(sizeof(LTNode));
	if (guard == NULL)
	{
		perror("malloc fail\n");
		exit;//开辟成功则继续,失败则退出程序
	}
	else
	{
		guard->next = guard;
		guard->prev = guard;
	}
	return guard;
}

有一个哨兵位节点就方便后续的插入,当然在销毁双向链表的时候也需要在哨兵位上注意一点


4.BuyListNode申请空间函数

参数是数据x,返回值是新开辟空间的地址,找到

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值