IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C++数据结构补充(双向链表) -> 正文阅读

[数据结构与算法]C++数据结构补充(双向链表)

双向链表与单向链表的结构类似,但多了一个指向前驱结点的指针。此外空的双向链表的指针域需要特别注意。

双向链表可以有效提高算法的时间性能,说白了就是以空间换取时间。

此外,双向链表也可以有循环链表。

1、双向链表初始化

双向链表的初始化如下:

#include"stdio.h"
#include"stdlib.h"
typedef int ElemType;
typedef struct DualNode
{
	ElemType data;
	struct DualNode* prior;  //前驱结点
	struct DualNode* next;  //后继结点
}DualNode, * DualLinkList;
int InitList(DualLinkList* L, int LinkSize)
{
	//生成还有多少个结点的双向链表
	DualNode* p, * q;
	int i;
	*L = (DualLinkList)malloc(sizeof(DualNode));
	if (!(*L))
		return 0;
	(*L)->next = NULL;
	(*L)->prior = NULL;
	p = (*L);
	for (int i = 0; i < LinkSize; i++)
	{
		q = (DualNode*)malloc(sizeof(DualNode));
		if (!(q))
			return 0;
		q->data = 0;  //结点赋值,初值暂定为0
		q->prior = p;
		q->next = p->next;
		p->next = q;

		p = q;  //更新p的位置
	}
	//如果想构建循环链表
	//p->next = (*L)->next;
	//(*L)->next->prior = p;
}

2、循环链表的插入

插入操作需要一个顺序,该顺序不能违反。如果要在第P个位置插入一个新节点,则:

1、首先新建结点s的后继结点应当指向位置P的结点

s->next=p;

2、新建结点s的前驱结点应当指向位置P的上一个结点

s->prior=p->prior;

3、修改P位置上一个结点的指针域,上一个结点的后继结点需要指向s

p->prior->next=s;

4、修改P位置的结点的指针,该节点的前驱结点要修改为s

p->prior=s;

?

int InsetDualLinkList(DualLinkList* L, int posi, ElemType n)
{
	//插入在位置posi
	DualNode* p, * s;
	p = *L;
	int i = 1;
	//找到第posi个结点
	while (p && i < posi)
	{
		p = p->next;
		i++;
	}
	if (!p || i > posi)
		return 0;
	//创建待插入结点
	s = (DualNode*)malloc(sizeof(DualNode));
	s->data = n;
	//更新指针域
	s->next = p;
	s->prior = p->prior;
	p->prior->next = s;
	p->prior = s;
	return 1;
}

3、循环链表的删除

1、首先完成待删除结点P的上下两个结点的指针更新,包括:

p->prior->next=p->next;

p->next->prior=p->prior;

2、更新完成后释放P结点的空间

Free(p);

int DeleteDualLinkList(DualLinkList* L, int posi, ElemType *n)
{
	//删除位置posi的结点,其值返回在n里
	DualNode* p;
	int i = 1;
	p = *L;
	//找到posi位置
	if (!p && i < posi)
	{
		p = p->next;
		i++;
	}
	if (!p || i > posi)
		return 0;
	//更新指针域,释放空间
	p->prior->next = p->next;
	p->next->prior = p->prior;
	*n = p->data;
	free(p);
	return true;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 23:13:18  更:2022-07-04 23:16:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:53:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码