数据结构代码归纳

线性表

线性表的顺序表示

定义与初始化

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;
}

 栈

定义以及基本操作

栈判断空是判断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;
}

队列

队列的顺序存储

//队列
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; 
}

树与二叉树 

二叉树的定义:

树的顺序存储

跟适合完全二叉树

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

树的链式存储:

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

 二叉树遍历

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为的USG6000为什么不能ping通

前言&#xff1a; 防火墙usg6000v的镜像 链接: https://pan.baidu.com/s/1uLRk0-hnHRTLYLx1Pnplow?pwdtymp 提取码: tymp 看了好多毒文章&#xff0c;感觉写作业更有意思&#xff0c;可以了解新的知识 内容&#xff1a; 首先看毒文章是这样说的&#xff0c;华为的防火墙是…

“量子跃迁与数据织网:深入探索K最近邻算法在高维空间中的优化路径、神经网络融合技术及未来机器学习生态系统的构建“

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

VTK编程指南<三>:基于VTK入门程序解析来理解VTK基础知识

1、VTK入门程序 下面是一个完整的Vtk入门程序&#xff0c;我们基于这个程序来对VTK的基本知识进行一个初步了解。 #include <iostream>#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2);// VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INI…

汽车免拆案例 | 2007款宝马650i车发动机偶尔无法起动

故障现象 一辆2007款宝马650i车&#xff0c;搭载N62B48B发动机&#xff0c;累计行驶里程约为26万km。车主反映&#xff0c;发动机偶尔无法起动&#xff0c;故障频率较低&#xff0c;十几天出现1 次&#xff0c;且故障出现时起动机不工作。 故障诊断  接车后试车&#xff0c;…

Kafka单机及集群部署及基础命令

目录 一、 Kafka介绍1、kafka定义2、传统消息队列应用场景3、kafka特点和优势4、kafka角色介绍5、分区和副本的优势6、kafka 写入消息的流程 二、Kafka单机部署1、基础环境2、iptables -L -n配置3、下载并解压kafka部署包至/usr/local/目录4、修改server.properties5、修改/etc…

python中的列表、元组、字典的介绍与使用

目录 一、区别介绍 1.使用场景以及区别图 2.详细介绍 列表 元组 字典 二、例子操作 (一)列表list 1.定义和初始化 2.访问元素&#xff08;下标&#xff09; 3.修改元素&#xff08;下标&#xff09; 4.添加元素&#xff08;append、下标insert&#xff09; 5.删除…

WiFi受限不再愁,电脑无网络快速修复指南

有时在试图连接WiFi时&#xff0c;会发现网络连接受限&#xff0c;或无法正常访问互联网。这种情况不仅影响了工作效率&#xff0c;还可能错过重要的信息。那么&#xff0c;究竟是什么原因导致了电脑WiFi连接受限呢&#xff1f;又该如何解决这一问题呢&#xff1f;小A今天就来教…

【技巧】Mac上如何显示键盘和鼠标操作

在制作视频教程时&#xff0c;将键盘和鼠标的操作在屏幕上显示出来&#xff0c;会帮助观众更容易地理解。 推荐Mac上两款开源的小软件。 1. KeyCastr 这款工具从2009年至今一直在更新中。 https://github.com/keycastr/keycastr 安装的话&#xff0c;可以从Github上下载最…

c++ map对其值排序

无法直接排序,转换成vector<std::pair<string,int>> #include <iostream> #include <map> #include <vector> #include <algorithm>// 用于排序的比较函数 bool compareByValue(const std::pair<std::string, int>& a, const …

调度器、闲逛进程

调度器、闲逛进程 一、调度器/调度程序二、闲逛进程 一、调度器/调度程序 ②、③由调度程序引起&#xff0c;调度程序决定&#xff1a; 让谁运行&#xff1f;-- 调度算法 运行多长时间&#xff1f;-- 时间片大小 调度时机 – 什么事件会触发“调度程序”&#xff1f; ∙ \bull…

第七节(1)、T型加减速转动【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍步进电机T型加减速的控制方法&#xff0c;分2个小节&#xff0c;本小节主要内容为该控制方法的推导与计算&#xff0c;第二节对T型加减速进行了简化计算 一.加速阶段计算 1.1 计算时间与步数关系 根据位移公式可得&#xff1a; a n g l e 0 n ∗ s…

利用 360 安全卫士极速版关闭电脑开机自启动软件教程

在使用电脑的过程中&#xff0c;过多的开机自启动软件会严重拖慢电脑的开机速度&#xff0c;影响我们的使用体验。本教程中简鹿办公将详细介绍如何使用 360 安全卫士极速版关闭电脑开机自启动软件&#xff0c;让您的电脑开机更加迅速流畅。 一、打开 360 安全卫士极速版 在电…

车联网安全学习之TBOX

Telematics BOX&#xff0c;简称 T-BOX&#xff0c;也称远程信息处理控制单元&#xff08;Telematics Control Unit, TCU&#xff09;&#xff0c;集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…

神经网络入门实战:(六)PyTorch 中的实用工具 SummaryWriter 和 TensorBoard 的说明

(一) SummaryWriter 这里先讲解 SummaryWriter &#xff0c;TensorBoard 会在第二大点进行说明。 SummaryWriter 是 PyTorch 中的一个非常实用的工具&#xff0c;它主要用于将深度学习模型训练过程中的各种日志和统计数据记录下来&#xff0c;并可以与 TensorBoard 配合使用&am…

C#实现一个HttpClient集成通义千问-开发前准备

集成一个在线大模型&#xff08;如通义千问&#xff09;&#xff0c;来开发一个chat对话类型的ai应用&#xff0c;我需要先了解OpenAI的API文档&#xff0c;请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…

开发知识点-uniCloud

开发知识点-uniCloud 服务空间云函数 cloudfunctions云对象importObjectJSON 格式的文档型数据库Collection unicloud数据的指定表集合 DB SchemaJQL 语法参考资料 服务空间 项目关联空间 云函数 cloudfunctions 云对象importObject JSON 格式的文档型数据库 nosql 非关系…

Vue Web开发(二)

1. 项目搭建 1.1. 首页架子搭建 使用Element ui中的Container布局容器&#xff0c;选择倒数第二个样式&#xff0c;将代码复制到Home.vue。 1.1.1.下载less &#xff08;1&#xff09;下载less样式 npm i less   &#xff08;2&#xff09;下载less编辑解析器 npm i less…

GWAS分析先做后学

大家好&#xff0c;我是邓飞。 GWAS分析是生物信息和统计学的交叉学科&#xff0c;上可以学习编程&#xff0c;下可以学习统计。对于Linux系统&#xff0c;R语言&#xff0c;作图&#xff0c;统计学&#xff0c;机器学习等方向&#xff0c;都是一个极好的入门项目。生物信息如…

Go学习:变量

目录 1. 变量的命名 2. 变量的声明 3. 变量声明时注意事项 4. 变量的初始化 5. 简单例子 变量主要用来存储数据信息&#xff0c;变量的值可以通过变量名进行访问。 1. 变量的命名 在Go语言中&#xff0c;变量名的命名规则 与其他编程语言一样&#xff0c;都是由字母、数…

Netty 心跳机制示例 —— 服务端实现

Netty 心跳机制示例 —— 服务端实现 1. 背景 在分布式系统和网络通信中&#xff0c;保持客户端与服务器端的连接活跃是非常重要的。如果长时间没有数据传输&#xff0c;连接可能会超时或被中断。为了解决这个问题&#xff0c;我们可以通过 心跳机制 来保证连接持续有效。 N…