数据结构的带头,双向,循环链表来咯

这篇具有很好参考价值的文章主要介绍了数据结构的带头,双向,循环链表来咯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一篇文章给大家讲了一个很简单的单向不带头,不循环的链表,是为了让大家更好的理解链表,现在我们就来学习学习他的升级版,双向,带头,循环链表。希望多多支持哦!

目录

定义的结构体节点

 开辟结构体节点的函数

头插函数

尾插函数

头删函数

尾删函数


首先我们要使链表带头,那么我们定义的结构体中必须有两个结构体指针变量,一个指向前一个节点一个指向后一个节点。注意我们所说的头也是一个节点,但它不储存数据是为方便我们使优化结构使速率更快,时间复杂度更优。下面是其结构

数据结构的带头,双向,循环链表来咯,数据结构,链表,c语言,c#,visualstudio

定义的结构体节点

 首先还是老样子,用typedef来命名结构体和类型,定义数据和两个指针,prev为指向前一个节点的指针,back则指向后一个节点的指针。

typedef int Type;
typedef struct Listnode Dlistnode;

struct Listnode
{
	struct Listnode* prev;
	struct Listnode* next;
	Type date;
};

 开辟结构体节点的函数

Dlistnode* Buynode(Type a)
{

	Dlistnode* newnode = (Dlistnode*)malloc(sizeof(Dlistnode));
	newnode->date = a;
	newnode->next = NULL;
	newnode->prev = NULL;
}

这里就跟昨天文章一样没什么好说的。


头插函数

 

void Pushfront(Dlistnode* phead,Type a)
{
	assert(phead);
	Dlistnode* first = phead->next;
	Dlistnode* new = Buynode(a);

	new->next = first;
	new->prev = phead;
	phead->next = new;
	phead->next->prev = new;


}

首先我们要保证传过来的phead头节点不为空,所以assert一下。这里创建辅助变量first即指向第一个节点的 指针(这里的第一个指针是指第一个存放数据的指针即头节点往后的哪一个节点)是为了使后面的赋值不用考虑赋值的顺序,后面的四个赋值顺序随便哪个在前代码都不会出错。


尾插函数
void Pushback(Dlistnode* phead,Type a)
{
	assert(phead);
	Dlistnode* tail = phead->prev;
	Dlistnode* new = Buynode(a);

	new->prev = tail;
	new->next = phead;
	phead->prev = new;
	phead->prev = new;
	

}

这里需要注意的跟头插差不多。


头删函数

 

void Popfront(Dlistnode* phead)
{
	assert(phead);
	assert(phead->next != phead);
	Dlistnode* first = phead->next;
	Dlistnode* second = phead->next->next;

	phead->next = second;
	second->prev = phead;
	free(first);
	first = NULL;

}

 代码解析:assert(phead->next != phead);主要是当不断头删只剩下头节点时,不会将头节点也删去。然后后面的first,second也是辅助变量。


尾删函数
void Popback(Dlistnode* phead)
{
	assert(phead);
	assert(phead->prev != phead);
	Dlistnode* first = phead->prev;
	Dlistnode* second = phead->prev->prev;

	second->next = phead;
	phead->prev = second;
	free(first);
	first = NULL;
}

也是和头删的差不多就不多解释了。


打印函数

 

void Print(Dlistnode* phead)
{
	Dlistnode* cur = phead->next;
	while (cur != phead)
	{
		printf("%d->", cur->date);
	}
	printf("\n");
}

也是常规打印就也不解释了。


今天文章到此结束。数据结构的带头,双向,循环链表来咯,数据结构,链表,c语言,c#,visualstudio 文章来源地址https://www.toymoban.com/news/detail-833869.html

到了这里,关于数据结构的带头,双向,循环链表来咯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构---带头双向循环链表

    什么是双向带头循环链表? 上面简单的一个非空 带头循环双向链表逻辑图 如何定义一个双向链表? 根据图和代码可以看双向链表就是单链表的每个结点中,在设置一个指向前驱节点的指针 简单认识之后,对他进行初始化(申请一个头节点,让前驱和后驱指针都指向自己) 代码

    2024年02月07日
    浏览(55)
  • 【数据结构】实现带头双向循环链表

    之前我们已经学习了单链表,有了单链表的基础,现在开始学习带头双向循环链表~ 结构最复杂 ,一般用在单独存储数据。 实际中使用的链表数据结构,都是带头双向循环链表 。另外这个结构虽然结构复杂,但是使用代码实现以后会发现 结构会带来很多优势 ,实现反而简单

    2024年02月10日
    浏览(38)
  • 数据结构之带头双向循环链表

    目录 链表的分类 带头双向循环链表的实现 带头双向循环链表的结构 带头双向循环链表的结构示意图 空链表结构示意图 单结点链表结构示意图  多结点链表结构示意图 链表创建结点 双向链表初始化 销毁双向链表 打印双向链表  双向链表尾插 尾插函数测试 双向链表头插

    2024年02月08日
    浏览(65)
  • 数据结构_带头双向循环链表

    相较于之前的顺序表和单向链表,双向链表的逻辑结构稍微复杂一些,但是在实现各种接口的时候是很简单的。因为不用找尾,写起来会舒服一点。(也可能是因为最近一直在写这个的原因) 在实现接口的时候,除了没有找尾,其他的操作和单向链表是差不多的,这里就不多

    2024年04月14日
    浏览(52)
  • 【数据结构】线性表——带头双向循环链表

    带头双向循环链表的优点 1.支持任意位置时间复杂度为O(1)的插入和删除。 2.按照需求申请释放空间,无需担心空间不够用,无需担心浪费。 3.带头可以省去链表为空时的判断,可以使代码更加简约 带头双向循环链表的缺点 1.不可以进行下标随机访问。 2.缓存利用率低 带头双

    2024年02月03日
    浏览(58)
  • 【数据结构】带头双向循环链表及其实现

    目录 1.带头双向循环链表 2.带头双向循环链表实现 2.1初始化 2.2销毁 2.3头插 2.4链表打印 2.5头删数据 2.6尾插数据 2.7尾删数据 2.8链表判空  2.9查找一个数据 2.10在pos位置前插入数据 2.11删除pos位置 2.12求链表的长度 2.顺序表和链表的比较 我们已经实现了无头单向循环链表 带头双

    2024年02月10日
    浏览(31)
  • 数据结构入门指南:带头双向循环链表

    目录 文章目录 前言 1.结构与优势 2.链表实现       2.1 定义链表 2.2 创建头节点 2.3 尾插 2.4 输出链表 2.5 尾删 2.6 头插 2.7头删 2.8 节点个数 2.9 查找 2.10 位置插入 2.11 位置删除 2.12 销毁链表  3. 源码 总结         链表一共有8种结构,但最常用的就是无头单向链表、和带头

    2024年02月14日
    浏览(38)
  • 【数据结构】双向带头循环链表的实现

    前言:在前面我们学习了顺序表、单向链表,今天我们在单链表的基础上进一步来模拟实现一个带头双向链表。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:数据结构 👈 💯代码仓库:卫卫周大胖的学习日记💫 💪关注博主和博主一起学习!一起努力! 带头双向循环链

    2024年01月15日
    浏览(39)
  • 数据结构: 线性表(带头双向循环链表实现)

    之前一章学习了单链表的相关操作, 但是单链表的限制却很多, 比如不能倒序扫描链表, 解决方法是在数据结构上附加一个域, 使它包含指向前一个单元的指针即可. 那么怎么定义数据结构呢? 首先我们先了解以下链表的分类 链表的结构非常多样, 以下情况组合起来就有 8 中链表

    2024年02月14日
    浏览(31)
  • 数据结构-带头双向循环链表的实现

    前言           带头双向循环链表是一种重要的数据结构,它的结构是很完美的,它弥补了单链表的许多不足,让我们一起来了解一下它是如何实现的吧!         它的节点中存储着数据和两个指针,一个 指针_prev 用来记录前一个节点的地址,另一个指针 _next 用来记录后一

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包