数据结构代码归纳

news2025/1/15 19:15:43

1.线性表

线性表的顺序表示

定义与初始化

typedef struct SqList{
	ElemType data[MaxSize];
	//ElemType *data  开动态数组 
	int length;
}Sqlist;
void InitList(SqList &L){
	L.length=0;//若静态数组
	//若动态数组 
	//L.data=(ElemType*)malloc(sizeof(ElemType)*MaxSize); 
} 

插入操作

在顺序表的第i(1<=i<=L.length+1)个位置插入元素 ,data的下标范围是从0开始。

bool ListInsert(SqList &L, int i, ElemType m){
	if(i<1||i>L.length)return false;//i超出数组范围 
	if(L.length>=MaxSize)return false;//length超出最大长度
	for(int j=L.length; j>=i; j--){
		L.data[i]=L.data[i-1];//将第i个及以后元素往后移动
	} 
	L.data[i-1]=m;
	L.length++;
    return true;
} 

删除操作

bool ListInsert(SqList &L, int i, ElemType &m){
	if(i<1||i>L.length)return false;//i超出数组范围 
	m=L.data[i-1];
	for(int j=i; j<L.length; j++){
		L.data[j-1]=L.data[j];//删除之后数组往前移 
	}
	L.length--;
	return true;
} 

线性表链式存储

 链头指能通过指针访问到链表所有结点的位置,链尾的next指针为空

定义与初始化 

typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;
//带头结点 
bool InitList(LinkList &L){
	L=(LNode *)malloc(sizeof(LNode));//创建头结点 
	L->next=NULL;
	return true;
}
//不带头结点 
bool InitList(LinkList &L){
	L=NULL;
	return true;
}

插入结点

//插入结点操作
bool ListInsert(LinkList &L, int i, ElemType m){
	LNode *p=L;
	int j=1;
	//找到第i个结点 ,j=1表示p在第一个元素 
	while(p!=NULL&&j<=i-1){
		p=p->next;
		j++;
	}
	if(p==NULL)return false;
	LNode *s=(LNode*)malloc(sizeof(LNode));
	s->data=m;
	s->next=p->next;
	p->next=s;
	return true; 
}

删除结点

与插入节点类似

//删除结点
bool ListDelet(LinkList &L, int i, ElemType &m){
	LNode *p=L;
	int j=1;
	while(p!=NULL&&j<=i-1){
		p=p->next;
		j++;
	}
	if(p==NULL||p->next==NULL)return false;
	m=p->next->data;
	LNode *s=p->next;
	m=s->data;
	p->next=s->next;
	free(s);
	return true;
} 

头插法建立单链表/链表逆置

//头插法/链表逆置 
LinkList List_HeadInsert(LinkList &L){
	LNode *s;
	int x;
	L=(LNode*)malloc(sizeof(LNode));//带头结点的初始化 
	L->next=NULL;
	cin>>x;
	while(x!=99999){
		//每次添加结点必须新申请空间 
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		s->next=L->next;//L是头结点 
		L->next=s;
		cin>>x;
	}
	return L; 
}

尾插法

设置一个指针指向链表尾巴,每次从尾巴插入,得到的链表是正序

双链表

//双链表定义初始化
typedef struct DLNode{
	ElemType data;
	DNode *prior, *next;
}DNode, *DLinkList; 
bool InitDLinkList(DLinkList &L){
	L=(DNode *)malloc(sizeof(DNode));
	if(L==NULL)return false;//如果开空间失败,可有可无 
	L->next=NULL;//前后指针都设置为空
	L->prior=NULL;
	return true;
}

定义与初始化

//双链表定义初始化
typedef struct DNode{
	ElemType data;
	DNode *prior, *next;
}DNode, *DLinkList; 
bool InitDLinkList(DLinkList &L){
	L=(DNode *)malloc(sizeof(DNode));
	if(L==NULL)return false;//如果开空间失败,可有可无 
	L->prior=NULL;
	L->next=NULL;
	return true;
}

p结点后插入s

//双链表插入操作  
bool InsertDList(DNode *p, DNode *s){
	if(p==NULL||s==NULL)return false; 
	s->next=p->next;
	if(p->next!=NULL){//如果p有后继结点 
		p->next->prior=s;	
	}
	s->prior=p;
	p->next=s; 
	return true;
}

循环单链表

定义

//循环单链表 
typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;
//带头结点 
bool InitList(LinkList &L){
	L=(LNode *)malloc(sizeof(LNode));//创建头结点 
	L->next=L;//把链尾结点next指针指向链头结点 
	return true;
}

判断为空条件:L->next==L

循环双链表

定义与初始化

 typedef struct DNode{
	ElemType data;
	DNode *prior, *next;
}DNode, *DLinkList; 
bool InitDLinkList(DLinkList &L){
	L=(DNode *)malloc(sizeof(DNode));
	if(L==NULL)return false;//如果开空间失败,可有可无 
	L->prior=L;//头结点的prior指向头结点 
	L->next=L;头结点的next指向头结点 
	return true;
}

删除结点

//可以无顾虑删除,不可能有空的结点
bool InsertDList(DNode *p, DNode *s){
	s->next=p->next;
	p->next->prior=s;	
	s->prior=p;
	p->next=s; 
	return true;
}

 2.栈

定义以及基本操作

栈判断空是判断top==-1,满是top==MaxSize-1;

共享栈是一个数组空间分为两个栈,判断左边栈空:top1==-1,右边栈空:top2==MaxSize.判断栈满条件top1+1==top2

//栈
#define MaxSize 100
typedef struct{
	ElemType data[MaxSize];
	int top;//栈顶指针 
}SqStack;
int main()
{
	SqStack s;
	s.top=-1;//初始化,栈顶指针为-1:判断栈是否为空 
	//进栈
	ElemType x;
	s.data[++s.top]=x; 
	//出栈
	s.top--;//前提top!=-1; 
    return 0;
}

3.队列

队列的顺序存储

//队列
typedef struct{
	ElemType data[MaxSize];
	int front , rear;
}SqQueue;

循环队列 

以牺牲一个结点判断队满队空:

头指针指向队列第一个元素,尾指针为空,指向队尾指针的下一个元素,新加入结点的位置

队满条件:(Q.rear+1)%MaxSize==Q.front

队空条件:Q.rear==Q.front

队内元素个数:(Q.rear-Q.front+MaxSize)% MaxSize

初始化

void InitQueue(SqQueue &Q){
	Q.front=Q.rear=0;
} 

入队

bool EnQueue(SqQueue &Q, ElemType m){
	if((Q.rear+1)%MaxSize==Q.front)return false;//判断是否队满 
	Q.data[Q.rear]=m;
	Q.rear=(Q.rear+1)%MaxSize;//尾指针加一要取模 
	return true;
}

出队 

//出队
bool DeQueue(SqQueue &Q, ElemType &m){
	if(Q.front==Q.rear)return false;//队空
	m=Q.data[Q.front];
	Q.front=(Q.front+1)%MaxSize; 
	return true;
} 

队列的链式存储

定义

//链式存储定义
typedef struct LinkNode{
	ElemType data;
	struct LinkNode *next;
}LinkNode;
typedef struct {
	LinkNode *front, *rear;
}LinkQueue;

带头结点的链式存储,front指向不存储数据的头结点,rear指向队尾指针

入队

//入队
bool EnQueue(LinkQueue &Q, ElemType m){
	LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));
	p->data=m;
	p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;
} 

出队

//出队
bool DeQueue(LinkQueue &Q, ElemType &m){
	if(Q.front==Q.rear)return false;//空队
	LinkNode *p=Q.front->next;
	m=p->data;
	Q.front->next=p->next;//删除 
	if(p==Q.rear)Q.rear=Q.front;//如果只有一个结点,删除后为空 
	free(p);
	return true; 
}

4.树与二叉树 

二叉树的定义:

树的顺序存储

跟适合完全二叉树

 一定要把结点编号与完全二叉树结合起来

树的链式存储:

typedef struct ThreadNode{
	Elemtype data;
	struct ThreadNode* lchild, *rchild; 
	int ltag, rtag;//线索标记 
}ThreaNode, *ThreadTree ; 

 二叉树遍历

二叉树三种遍历方式以及线索二叉树

5.图

图的邻接矩阵存储

#define MaxVertex 1000
typedef char VertexType;
typedef int EdgeType;
typedef struct MGraph{
	VertexType vex[MaxVertex];
	EdgeType edge[MaxVertex][MaxVertex];
	int vexnum, arcnum;
}MGraph;

图的邻接表存储 

typedef struct ArcNode{
	int adjvex;//该弧所指的顶点 
	struct ArcNode *next;//指向下一条弧的指针 
}ArcNode;
typedef struct VNode{
	VertexType data;
	ArcNode *firstArc;//该顶点第一条弧 
}VNode;
typedef struct LGraph{
	VNode artices[MaxVertex];//点集 
	int vexnum, arcnum;
}LGraph;

图的搜索 

dfs的递归非递归形式,bfs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构 (36)各种排序方法的综合比较

一、常见排序方法分类 插入排序类 直接插入排序&#xff1a;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。希尔排序&#xff1a;是插入排序的一种改进版本&#xff0c;先将整个待排序的记录序列分割成为…

SpringMVC全局异常处理

一、Java中的异常 定义&#xff1a;异常是程序在运行过程中出现的一些错误&#xff0c;使用面向对象思想把这些错误用类来描述&#xff0c;那么一旦产生一个错误&#xff0c;即创建某一个错误的对象&#xff0c;这个对象就是异常对象。 类型&#xff1a; 声明异常&#xff1…

【高中生讲机器学习】28. 集成学习之 Bagging 随机森林!

创建时间&#xff1a;2024-12-09 首发时间&#xff1a;2024-12-09 最后编辑时间&#xff1a;2024-12-09 作者&#xff1a;Geeker_LStar 嘿嘿&#xff0c;你好呀&#xff01;我又来啦~~ 前面我们讲完了集成学习之 Boooooosting&#xff0c;这篇我们来看看集成学习的另一个分支…

springSecurity权限控制

权限控制&#xff1a;不同的用户可以使用不同的功能。 我们不能在前端判断用户权限来控制显示哪些按钮&#xff0c;因为这样&#xff0c;有人会获取该功能对应的接口&#xff0c;就不需要通过前端&#xff0c;直接发送请求实现功能了。所以需要在后端进行权限判断。&#xff0…

李飞飞的生成式3D场景,对数字孪生的未来影响几何?

大家好&#xff0c;我是日拱一卒的攻城师不浪&#xff0c;致力于技术与艺术的融合。这是2024年输出的第47/100篇文章。 前言 这两天&#xff0c;AI界的教母李飞飞团队重磅发布了空间智能生成式AI大模型。 仅通过一张图片就能够生成一个可操作和交互的3D空间场景。 空间智能的…

意图识别模型使用 基于BERT的对话意图和槽位联合识别 CPU运行BERT模型-亲测成功

意图识别模型使用 基于BERT的对话意图和槽位联合识别 CPU运行BERT模型-亲测成功 我们在开发AI-Agent智能体时&#xff0c;通常会使用提示词工程设置场景的带入&#xff0c;在实际项目中会有很多场景&#xff0c;如果所有提示词都放一起就会超过Token限制&#xff0c;则不得不拆…

OSG开发笔记(三十七):OSG基于windows平台msvc2017x64编译器官方稳定版本OSG3.4.1搭建环境并移植Demo

​若该文为原创文章&#xff0c;未经允许不得转载 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/144258047 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 长沙红胖子Qt…

《毛泽东思想和中国特色社会理论概述》课程报告Latex版本

所需要的图片: 源码(可运行): \documentclass[12pt]{article} \usepackage{ctex} \usepackage{graphicx} \usepackage{booktabs} \usepackage{titlesec} \usepackage{geometry} \usepackage{float} \usepackage{tabularx} \usepackage{enumitem} …

2024.12.6——攻防世界PHP2

知识点&#xff1a;目录扫描 代码审计 传参知识点补充&#xff1a; 后缀名为.phps的文件出现在无法使用web浏览器查看php源代码的情况下&#xff0c;.phps文件就是php的源代码文件&#xff0c;通常用于提供给用户&#xff08;访问者&#xff09;查看php代码&#xff0c;因为用…

OSI模型及各层缺陷

1&#xff0e;TCP/IP概述 &#xff08;1&#xff09;TCP/IP基本结构 TCP/IP是一组Internet协议&#xff0c;不但包括TCP和IP两个关键协议&#xff0c;还包括其他协议&#xff0c;如UDP、ARP、ICMP、Telnet和FTP等。TCP/IP的设计目标是使不同的网络互相连接&#xff0c;即实现互…

【论文阅读】Fifty Years of the ISCA: A Data-Driven Retrospective

学习体会&#xff1a; ISCA会议近五十年文章分析, 了解论文热点方向, 处理器依旧是热点! AI和并行是大趋势, 做XPU相关目前来说还是热点~ 摘录自原文 摘录: 数据来源和分析方法&#xff1a; 作者收集了 ACM 数字图书馆中所有 ISCA 论文&#xff0c;并使用 DBLP、Google Schol…

什么是MMD Maximum Mean Discrepancy 最大均值差异?

9多次在迁移学习看到了&#xff0c;居然还是Bernhard Schlkopf大佬的论文&#xff0c;仔细看看。 一.什么是MMD&#xff1f; 1. MMD要做什么&#xff1f; 判断两个样本&#xff08;族&#xff09;是不是来自于同一分布 2.怎么做&#xff1f;&#xff08;直观上&#xff09;…

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代&#xff0c;音频设备的兼容性和性能成为了用户关注的重点。LDR6500&#xff0c;作为乐得瑞科技精心研发的USB Power Delivery&#xff08;PD&#xff09;协议芯片&#xff0c;凭借其卓越的性能和广泛的应用兼容性&#xff0c;为音频设备领域带来了新…

Leetcode 每日一题 1.两数之和

目录 问题描述 示例 示例 1 示例 2 示例 3 提示 解决方案 算法思路 过题图片 代码实现 复杂度分析 注意事项 题目链接 结论 问题描述 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你找出数组中和为目标值的那两个整数&#xff0c;并返回它们的数组下…

【萤火工场CEM5826-M11测评】Arduino 采集雷达模块数据与串口绘图

【萤火工场CEM5826-M11测评】Arduino 采集雷达模块数据与串口绘图 当采用串口输出模式时&#xff0c;雷达检测到运动时&#xff0c;则输出 v0.0km/h, str1234 字样&#xff1b; v 表示目标速度大小&#xff0c;str 表示信号强度&#xff1b; 当雷达检测不到目标时&#xff0c…

【C++】选择排 序算法分析与扩展

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;代码回顾&#x1f4af;选择排序的算法流程&#x1f4af;代码详解外层循环初始化最小值内层循环比较与更新元素交换 &#x1f4af;选择排序的特性时间复杂度空间复杂度稳定性…

3D 生成重建024-LGM第一个开源的3D生成大模型!

3D 生成重建024-LGM第一个开源的3D生成大模型 文章目录 0 论文工作1 论文方法2 实验效果 0 论文工作 这篇论文介绍了一种名为LGM&#xff08;大型多视角高斯模型&#xff09;的新方法&#xff0c;用于从单视角图像或文本提示生成高分辨率的三维内容。该方法的核心思想是双重的…

微信 创建小程序码-有数量限制

获取小程序码&#xff1a;小程序码为圆图&#xff0c;有数量限制。 目录 文档 接口地址 功能描述 注意事项 请求参数 对接 获取小程序码 调用获取 小程序码示例 总结 文档 接口地址 https://api.weixin.qq.com/wxa/getwxacode?access_tokenaccess_token 功能描述 …

日志基础示例python和c++

文章目录 0. 引言1. python2. c 0. 引言 本文主要记录python版本和c版本常用的日志基础示例。 1. python python版本常用的是logging库&#xff0c;结合colorlog库&#xff0c;可根据不同日志级别打印不同颜色的日志&#xff0c;为了便于分析问题&#xff0c;还添加了日志保…

泷羽sec学习打卡-brupsuite4

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-proxy proxyInterceptHTTP history/WebSocket history&#xff08;历史记录&a…