首页 > 其他分享 >双链表定义与操作

双链表定义与操作

时间:2024-09-21 17:04:33浏览次数:1  
标签:return 定义 next prior 双链 操作 NULL DNode 节点

双链表的定义

 与单链表不同的地方在于指针,双链表的指针多了个前向指针。

点击查看代码
typedef struct DNode{
	ElemType data;
	DNode *prior, *next;
}*DLinkList, DNode;

双链表的初始化(initial)

 双链表的创建也可分为带头节点和不带头节点(这里只放了不带头的初始化)。

点击查看代码
// 带头节点创建 
bool InitDHList(DLinkList &L){
	L = (DNode *)malloc(sizeof(DNode));
	if(L == NULL) return 0;
	L->next = NULL;
	L->prior = NULL;
	return 1;
}

双链表的插入(Insert)

 双链表的插入方式都和后插方式大致相同(这里提供了前插和后插)。

点击查看代码
// 双链表的插入(在p节点后插入s节点)
bool InsertNextDNode(DNode *p, int x){
	DNode *s = (DNode *)malloc(sizeof(DNode));
	s->data = x;
	if(p == NULL || s == NULL) return 0;
//	s->next = p->next; (后插) 
//	if(p->next != NULL) // 如果p后面没有后继节点 
//		p->next->prior = s;
//	s->prior = p;
//	p->next = s;
	s->prior = p->prior; // (前插) 
	if(p->prior != NULL) p->prior->next = s; // 如果p前面没有前继节点 
	s->next = p;
	p->prior = s;
	return 1; 
}

双链表的删除节点(Delete)

 双链表的删除操作。

点击查看代码
// 删除p节点的后继节点,将next改为prior,prior改为next就是删除p节点的前继节点 
bool DeleteNextNode(DNode *p){
	if(p == NULL) return 0;
	DNode *q = p->next;
	if(q == NULL) return 0;
	p->next = q->next;
	if(q->next != NULL) q->next->prior = p;
	free(q);
	return 1;
}

销毁链表(destroy)

点击查看代码
// 销毁链表
void DestoryList(DLinkList L){
	while(L->next != NULL){
		DeleteNextNode(L);
	}
	free(L);
	L = NULL;
} 

后项遍历:

void BackwardList(DNode *p){
while(p->next != NULL){
   p = p->next;
   cout << p->data << endl;
}
}

前项遍历:

void ForwardList(DNode *p){
while(p->prior != NULL){
   p = p->prior;
   cout << p->data << endl;
}
}

完整代码:

 注意:前向遍历只能使用前插操作才能遍历到值,后向遍历同理。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef int ElemType;
typedef struct DNode{
	ElemType data;
	DNode *prior, *next;
}*DLinkList, DNode;

// 带头节点创建 
bool InitDHList(DLinkList &L){
	L = (DNode *)malloc(sizeof(DNode));
	if(L == NULL) return 0;
	L->next = NULL;
	L->prior = NULL;
	return 1;
}

// 判断双链表是否为空(带头节点) 
bool Empty(DLinkList L){
	if(L->next == NULL) return 1;
	else return 0;
}

// 双链表的插入(在p节点后插入s节点)
bool InsertNextDNode(DNode *p, int x){
	DNode *s = (DNode *)malloc(sizeof(DNode));
	s->data = x;
	if(p == NULL || s == NULL) return 0;
//	s->next = p->next; (后插) 
//	if(p->next != NULL) // 如果p后面没有后继节点 
//		p->next->prior = s;
//	s->prior = p;
//	p->next = s;
	s->prior = p->prior; // (前插) 
	if(p->prior != NULL) p->prior->next = s; // 如果p前面没有前继节点 
	s->next = p;
	p->prior = s;
	return 1; 
}

// 位序插入
bool InsertValPos(DLinkList L, int pos, int val){
	DNode *p = L;
	if(p == NULL) return 0;
	int j = 0;
	while(p != NULL && j < pos - 1){
		p = p->next;
		j ++;
	}
	if(p == NULL) return 0;
	DNode *s = (DNode *)malloc(sizeof(DNode));
	s->data = val;
	s->next = p->next;
	p->next->prior = s;
	s->prior = p;
	p->next = s;
	return 1;
} 
// 删除p节点的后继节点,将next改为prior,prior改为next就是删除p节点的前继节点 
bool DeleteNextNode(DNode *p){
	if(p == NULL) return 0;
	DNode *q = p->next;
	if(q == NULL) return 0;
	p->next = q->next;
	if(q->next != NULL) q->next->prior = p;
	free(q);
	return 1;
}
// 销毁链表
void DestoryList(DLinkList L){
	while(L->next != NULL){
		DeleteNextNode(L);
	}
	free(L);
	L = NULL;
} 
// 后向遍历 
void  BackwardList(DNode *p){
	while(p->next != NULL){
		p = p->next;
		cout << p->data << endl;
	}
}
// 前向遍历 
void  ForwardList(DNode *p){
	while(p->prior != NULL){
		p = p->prior;
		cout << p->data << endl;
	}
}
int main(){
	DLinkList L;
	InitDHList(L);
	int n; cin >> n;
	for(int i = 1;i <= n;i ++){
		int x; cin >> x;
		InsertNextDNode(L, x);
	}
	ForwardList(L);
	
}

标签:return,定义,next,prior,双链,操作,NULL,DNode,节点
From: https://www.cnblogs.com/asherof/p/18424228

相关文章

  • 链表(3)链表的基本操作
            单链表的基本操作主要有;①创建链表;②输出链表;③査我结点;④插入结点,⑤鹏除结点;⑥重组链表。下面分别进行介绍。一.创建链表        创建链表是指在程序运行时,进行动态内存分配,创建若千个结点,并把这些结点连接成串,形成一个链表。在进行动态......
  • 【python】Pandas 数据分析之分组聚合操作|代码讲解|建议在Jupyter Notebook 中运行
    建议在JupyterNotebook中运行jupyternotebook环境搭建文章目录1.Pandas加载数据1.1根据列名加载数据1.2根据行加载数据1.3加载指定行,指定列的数据2.分组聚合3.Pandas基本绘图5.常用的排序函数5.1找到小成本高口碑的电影5.2找到每年imdb评分最......
  • 超详细的XML介绍【附带dom4j操作XML】
    XML简介XML(EXtensibleMarkupLanguage),可扩展标记语言**特点XML与操作系统、编程语言的开发平台无关实现不同系统之间的数据交换作用数据交互配置应用程序和网站Ajax基石XML文档结构:1.声明一般是XML文档的第一行2.文档描述信息声明的组成:version:文档符......
  • 视频监控平台AS-V1000的部门管理功能,实现对部门所属的监控视频摄像头资源的添加、删除
    目录一、部门资源二、视频监控资源管理平台介绍1、AS-V1000介绍2、平台服务器配置说明三、部门资源管理功能介绍1、部门资源结构树2、添加和删除部门的资源(1)手动添加(2)删除资源3、查询资源(1)按部门查询(2)按资源查询4、导出部门资源及其结构(1)导出整个部门资源树(2)导......
  • 【C语言】⾃定义类型:联合和枚举
    ⾃定义类型:联合和枚举1.联合体1.1联合体类型的声明1.2联合体的特点1.3相同成员的结构体和联合体对⽐1.4联合体⼤⼩的计算1.5联合的⼀个练习2.枚举类型2.1枚举类型的声明2.2枚举类型的优点2.3枚举类型的使⽤1.联合体1.1联合体类型的声明像结构体⼀样,联......
  • 【Git 操作】Git 的基本操作
    文章目录1.Git的配置2.工作区、暂存区、版本库1.Git的配置......
  • 2024-09-21:用go语言,给定一个字符串 s,字符串中的每个字符要么是小写字母,要么是问号‘?
    2024-09-21:用go语言,给定一个字符串s,字符串中的每个字符要么是小写字母,要么是问号'?'。对于一个仅包含小写字母的字符串t,我们定义cost(i)为在t的前i个字符中与t[i]相同的字符的出现次数。字符串t的分数是所有位置i的cost(i)之和。现在的任务是用小写字母替换所有的问号'?',使得......
  • 2024-09-21:用go语言,给定一个字符串 s,字符串中的每个字符要么是小写字母,要么是问号‘?
    2024-09-21:用go语言,给定一个字符串s,字符串中的每个字符要么是小写字母,要么是问号'?'。对于一个仅包含小写字母的字符串t,我们定义cost(i)为在t的前i个字符中与t[i]相同的字符的出现次数。字符串t的分数是所有位置i的cost(i)之和。现在的任务是用小写字母替换所有的问号'?',使得......
  • 人员规范操作行为识别系统
    人员规范操作行为识别系统对现场人员操作行为进行实时监测分析,如果人员规范操作行为识别系统发现现场人员未按照要求规范进行操作、遗漏操作步骤更改先后作业顺序或者操作不规范,人员规范操作行为识别系统立即抓拍存档现场语音播报提醒相关人员行为不规范请立即改正,并同步违规信息......
  • linux 操作系统下的dhclient命令介绍和案例使用
    linux操作系统下的dhclient命令介绍和案例使用dhclient是Linux系统中用于动态主机配置协议(DHCP)客户端的命令。它的主要功能是从DHCP服务器获取网络配置,包括IP地址、子网掩码、默认网关和DNS服务器等信息dhclient命令概述基本语法bashdhclient[选项][网络接口......