数据结构之“双向链表”

1. 链表的分类

链表的种类有(2x2x2)种,带头/不带头;单向/双向;循环/不循环。

带头/不带头
在之前学习单链表(不带头单向不循环链表)时,它是不带头的,它的第一个结点是可以变的,比如: 我们还可以将第一个结点删除;头插一个数据,等等
但是带头的链表,它的第一个结点(头结点)存储的不是有效数据,其余结点存储的是有效数据。头结点俗称为“哨兵位”,它只是用来占位子的。

在这里插入图片描述

单向/双向
单向:只能通过前一个的next找到下一个结点,不能通过下一个结点找到前一个结点的地址。
双向:通过前一个可找到后一个,通过后一个可找到前一个

在这里插入图片描述

循环/不循环
在这里插入图片描述

2.双向链表

1.全称是:带头双向循环链表
2.双向链表的结点结构:数据+下一个结点的地址next+上一个结点的地址prev

typedef int DataType;

//双像链表的定义
typedef struct ListNode
{
   
	DataType val;
	struct ListNode* next;
	struct ListNode* prev;
};

3.双向链表在使用之前就要有头结点(哨兵位)。(初始化创建一个头结点)
记得:双向链表是:带头双向循环链表,要循环!!!那必定next和prev不可能指向空,而是指向它自己

//LTNode.c里的内容

LTNode* LTBuynode(DataType x)
{
   
	LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));
	if (newnode == NULL)
	{
   
		perror("malloc fail!");
		exit(1);
	}
	newnode->data = x;
	newnode->next = newnode->prev = newnode; //上/下结点地址都是自己,达到循环的目的
	return newnode;
}

void LTInit(LTNode** pphead)
{
   
	//创建一个头结点
	*pphead = LTBuynode(-1);
}

在这里插入图片描述

4.双向链表在插

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值