【考研】数据结构(更新到循环链表)
声明:所有代码都可以运行,可以直接粘贴运行(只有库函数没有声明)
线性表的定义和基本操作
基本操作
- 定义
静态:
#include<stdio.h>
#include<stdlib.h>#define MaxSize 10//静态
typedef struct{int data[MaxSize];int length;
}SqList;void InitList(SqList &L)//初始化
{for(int i=0;i<MaxSize;i++){L.data[i]=0;}L.length=0;
}int main(void)
{SqList L;InitList(L);for(int i=0;i<L.length;i++){printf("the data %d is %d",i,L.data[i]);}return 0;
}
动态:
#include<stdio.h>
#include<stdlib.h>#define InitSize 10typedef struct{int *data;int MaxSize;//最大容量 int length;//当前长度
}SeqList;void Init(SeqList &L)
{L.data=(int *)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize;
}int main(void){return 0;
}
- 插入
静态:
//插入操作,bool用于判断操作是否成功 (处理异常情况)
bool ListInsert(SqList &L,int i,int e){if(i<1 || i>L.length+1) return false;//条件判断 if(L.length >= MaxSize) return false;for(int j=L.length;j>=i;i--){L.data[j]=L.data[j-1];}L.data[i-1]=e;L.length++;
}

动态:
- 删除
静态:
bool ListDelete(SqList &L,int i,int &e){if(i<1||i>L.length) return false;e=L.data[i-1];for(int j=i;j<L.length;j++){L.data[j-1]=L.data[j];}L.length--;return true;
}
动态顺序表以及各个操作
#include<stdio.h>
#include<stdlib.h>
#define InitSize 10typedef struct{int *data;int MaxSize;int length;
}SqList;void debug(SqList L){printf("当前顺序表的数据为length=%d maxsize=%d\n",L.length,L.MaxSize);
}
//初始化
void InitList(SqList &L){L.data=(int *)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize;
}//增加动态数组的长度
void IncreaseSize(SqList &L,int len){int *p=L.data;L.data=(int *)malloc((L.MaxSize+len)*sizeof(int));for(int i=0;i<L.length;i++){L.data[i]=p[i];//将数据复制到新区域 }L.MaxSize=L.MaxSize+len;//顺序表最大长度增加len free(p);//释放空间
} //插入操作
bool ListInsert(SqList &L,int i,int e){//范围判断 if(i<1 || i>L.length+1)return false;if(L.length>L.MaxSize)return false;for(int j=L.length;j>=i;j--){L.data[j]=L.data[j-1];}L.data[i-1]=e;L.length++;return true;
} 删除操作,删除第i个数据并且返回被删除的数据
bool ListDelete(SqList &L,int i,int &e)
{//范围判断if(i<1 || i>L.length+1) return false;else{//保存删除元素e=L.data[i]; for(int j=i;j<L.length;j++){L.data[j]=L.data[j+1];}L.length--;} return true;} //按位查找
int getElemBybit(SqList L,int i){//Check if the line has been crossedif(i<1 || i>L.length){printf("Cross the border!");return 0;}return L.data[i-1];
} //按值查找
int getElemByValue(SqList L,int value){for(int i=0;i<L.length;i++){if(L.data[i] == value){return i-1;}}printf("Can`t find the elem!");return 0;
} //打印操作
void print(SqList L){for(int i=0;i<L.length;i++){printf("%d ",L.data[i]);}printf("\n");
} //测试函数
int main(void){SqList L;debug(L);InitList(L);debug(L);for(int i=0;i<L.MaxSize;i++){L.data[i]=i;L.length++;}IncreaseSize(L,5);debug(L);print(L);if(ListInsert(L,2,5)){printf("插入成功,插入后数值");print(L);}else printf("插入失败");int e=0;if(ListDelete(L,3,e)){print(L);printf("被删除元素为:%d",e);}int value,position;printf("\nPlease input the value and the position:"); scanf("%d %d", &value, &position); printf("\nget the emlem by value :the elem position is%d\n",getElemByValue(L,value));printf("\nget the emlem by positon:the value is%d\n",getElemBybit(L,position));return 0;
}
链表基本
链表结构:
单链表:
//定义单链表
typedef struct LNode {int data; // 数据域 struct LNode* next; // 指针域
} LNode, * LinkList;
双链表:
//定义结构
typedef struct DNode{int data;//数据域 struct DNode *prior,*next;//指针域
}DNode,*DLinkList;
单链表
操作:
// 初始化一个链表,带头结点
bool InitList(LinkList* L);// 按照位序插入
bool ListInsert(LinkList* L, int i, int e);// 指定结点的后插操作
bool InsertNextNode(LNode* p, int e);// 指定结点的前插操作
bool InsertPriorNode(LNode* p, int e);// 按位序删除结点
bool ListDelete(LinkList* L, int i, int* e);// 创建方式 - 头插法创建
LinkList List_HeadInsert(LinkList* L);//创建方法 - 尾插法创建
LinkList List_TailInsert(LinkList* L);//指定结点的删除
bool DeleteNode(LNode *p);//按位查找
LNode *GetElem(LinkList L,int i);//按值查找
LNode *LocateElem(LinkeList L,int e); //求单链表的长度
int length(LinkList L);//链表逆置
LNode *Inverse(LNode *L); // 打印链表
void print(LinkList L);
操作实现:
// 打印链表
void print(LinkList L) {LinkList E = L->next;while (E != NULL) {printf("%d ", E->data);E = E->next;}printf("\n");
}// 初始化一个链表,带头结点
bool InitList(LinkList* L) {*L = (LNode*)malloc(sizeof(LNode));if (*L == NULL) return false;(*L)->next = NULL;printf("Initialization of the linked list succeeded!\n");return true;
}// 按照位序插入
bool ListInsert(LinkList* L, int i, int e) {if (i < 1) return false; // 判断操作合法LNode* p = *L;int j = 0;while (p != NULL && j < i - 1) {p = p->next;j++;}int choice =0;printf("Prior or next?(1/2)");scanf("%d",&choice);if(choice == 2)return InsertNextNode(p, e);if(choice == 1)return InsertPriorNode(p,e);elsereturn false;
}// 指定结点的后插操作
bool InsertNextNode(LNode* p, int e) {if (p == NULL) return false; // 判断合法 LNode* s = (LNode*)malloc(sizeof(LNode));if (s == NULL) return false; // 内存分配失败 s->data = e;s->next = p->next;p->next = s;return true;
}// 指定结点的前插操作
bool InsertPriorNode(LNode* p, int e) {if (p == NULL) return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (s == NULL) return false;s->next = p->next;p->next = s;s->data = p->data; // 交换数值从而实现前插操作,方法还是后插的方法 p->data = e;return true;
}// 按位序删除结点并返回删除数据
bool ListDelete(LinkList* L, int i, int* e) {if (i < 1) return false; // 判断操作合法LNode* p = *L;int j = 0;while (p != NULL && j < i - 1) {p = p->next;j++;} // 定位到删除结点if (p == NULL) return false;if (p->next == NULL) return false;LNode* q = p->next;*e = q->data;p->next = q->next;free(q);return true;
}// 创建方式
// 1. 头插法创建 O(n)
LinkList List_HeadInsert(LinkList* L) {*L = (LinkList)malloc(sizeof(LNode)); // 建立头结点(*L)->next = NULL; // 初始为空链表,这步不能少!int x;LNode* s;printf("input the x:");scanf("%d", &x);while (x != 9999) {s = (LNode*)malloc(sizeof(LNode));s->data = x;s->next = (*L)->next;(*L)->next = s;printf("Continue input the x:");scanf("%d", &x);}return *L;
}//指定结点的删除(重点理解)
bool DeleteNode(LNode *p){if(p == NULL) return false;LNode *q=p->next;p->data=p->next->data;p->next=q->next;free(q);return true;
}//按位查找
LNode *GetElem(LinkList L,int i){if(i<1) return false;LNode *p=L->next;int j;while(p!=NULL && j<i-1){p=p->next;j++;}return p;
}//按值查找
LNode *LocateElem(LinkList L,int e){if(L == NULL) return false;LNode *p=L->next;while(p != NULL && p->data!=e){p=p->next; }return p;
}//求单链表的长度
int length(LinkList L){int len=0;LNode *p=L;while(p->next!=NULL){p=p->next;len++;}return len;
} //创建方法 - 尾插法创建
//创建方法 - 尾插法创建
LinkList List_TailInsert(LinkList* L){int x;*L=(LinkList)malloc(sizeof(LNode));LNode *s,*r=*L;printf("输入插入的结点的值:");scanf("%d",&x);while(x != 9999){s=(LNode *)malloc(sizeof(LNode));s->data=x;r->next=s;r=s;scanf("%d",&x);}r->next=NULL;return *L;
}//链表逆置(重点理解)
LNode *Inverse(LNode *L){LNode *p,*q;p=L->next;L->next=NULL;while(p!=NULL){q=p;p=p->next;q->next=L->next;L->next=q;}return L;
}
测试代码
int main(void) {LinkList L = NULL;LNode *elem = NULL;int e=0;List_HeadInsert(&L);print(L);printf("Insert:\n");ListInsert(&L,2,3); print(L);ListDelete(&L,3,&e);print(L);printf("Deleted elem:%d\n",e);printf("Delete the elem by Node\n");DeleteNode(L->next->next);print(L);printf("Search by position\n");elem=GetElem(L,3);printf("the elem is:%d\n",elem->data);printf("Inverse the Link\n");L=Inverse(L);print(L);return 0;
}
双链表
操作:
//打印
void print(DLinkList L);
//链表的初始化 ,
bool InitLinkList(DLinkList *L);
//判空
bool isEmpty(DLinkList L);
//后插操作,将s插入p之后
bool InsertNextNode(DNode *p,DNode *s);
//前插操作
bool InsertPriorNode(DNode *p,DNode *s);
定义:
bool InitLinkList(DLinkList *L){*L = (DNode *)malloc(sizeof(DNode));if(L == NULL) return false;(*L)->next=NULL;(*L)->prior=NULL;return true;
}bool isEmpty(DLinkList L){if(L->next==NULL) return true;elsereturn false;
}bool InsertNextNode(DNode *p,DNode *s){if(p==NULL || s==NULL){printf("非法\n");return false;}s->next=p->next;s->prior=p;p->next=s;printf("Insert next node success!\n");return true;
}bool InsertPriorNode(DNode *p,DNode *s){if(p==NULL || s==NULL || p->prior==NULL){printf("非法\n");return false;}s->prior=p->prior;s->next=p;p->prior=s;printf("Insert prior node success!\n");return true;
}void print(DLinkList L){L=L->next;//因为有头结点 while(L!=NULL){printf("%d ",L->data);L=L->next;}
}
测试:
//测试
int main(void){DLinkList L;DNode *node;int data,x;if(InitLinkList(&L)){printf("初始化成功!"); }printf("开始插入(9999停止)\n");scanf("%d",&x);while(x !=9999){node=(DNode *)malloc(sizeof(DNode));node->data=x;InsertNextNode(L,node);scanf(" %d",&x);}print(L);return 0;
}
单循环链表.
//循环链表
#include<stdio.h>
#include<stdlib.h>//循环单链表
typedef struct LNode{int data;struct LNode *next;
}DNode,*LinkList;//打印
void print(LinkList L);
//初始化一个循环单链表
bool InitList(LinkList *L);
//判空
bool isEmpty(LinkList L);
//判断结点是否为表尾指针
bool ifTail(LinkList L,LNode *p);
//插入结点
bool InsertNextNode(LNode *p,LNode *q);int main(void)
{LinkList L;LNode *node;int x;if(InitList(&L)) printf("初始化成功!\n");printf("输入9999结束!\n");scanf("%d",&x);while(x != 9999){node=(LNode *)malloc(sizeof(LNode));node->data=x;InsertNextNode(L,node);scanf(" %d",&x);}print(L);return 0;} bool InitList(LinkList *L){*L=(LNode *)malloc(sizeof(LNode));if(*L==NULL) return false;(*L)->next = *L;return true;
}bool isEmpty(LinkList L){if(L->next == L)return true;elsereturn false;
}void print(LinkList L){LinkList head=L->next;while(head != L){printf("%d ",head->data);head=head->next;}
}bool ifTail(LinkList L,LNode *p){if(p->next == L)return true;elsereturn false;
}bool InsertNextNode(LNode *p,LNode *q){if(p==NULL || q==NULL) return false;q->next=p->next;p->next=q;return true;
}
相关文章:
【考研】数据结构(更新到循环链表)
声明:所有代码都可以运行,可以直接粘贴运行(只有库函数没有声明) 线性表的定义和基本操作 基本操作 定义 静态: #include<stdio.h> #include<stdlib.h>#define MaxSize 10//静态 typedef struct{int d…...
DB2—03(DB2中常见基础操作)
DB2—03(DB2中常见基础操作) 1. 前言1.1 oracle和mysql相关 2. db2中的"dual"2.1 SYSIBM.SYSDUMMY12.2 使用VALUES2.3 SYSIBM.SYSDUMMY1 "变" dual 3. db2中常用函数3.1 nvl()、value()、COALESCE()3.2 NULLIF() 函数3.3 LISTAGG() …...
华为云cce健康检查有什么用?配置需要注意什么?
华为云cce健康检查 如上图,华为云健康检查可用来探测cce的实例运行状态,必要时cce会自动重启实例,达到cce持续服务。 但是配置时需要注意一下几个方面,否则cce的状态总是有些不正常。 1、http探查比较友好。因为我们的在cce里面…...
微信小程序会议OA-登录获取手机号流程登录-小程序导入微信小程序SDK(从微信小程序和会议OA登录获取手机号到登录小程序导入微信小程序SDK)
目录 获取用户昵称头像和昵称 wx.getUserProfile bindgetuserinfo 登录过程 登录-小程序 wx.checkSession wx.login wx.request 后台 准备数据表 反向生成工具生成 准备封装前端传过来的数据 小程序服器配置 导入微信小程序SDK application.yml WxProperties …...
原来 TinyVue 组件库跨框架(Vue2、Vue3、React、Solid)是这样实现的?
本文由 TinyVue 组件库核心成员郑志超分享,首先分享了实现跨框架组件库的必要性,同时通过演示Demo和实际操作向我们介绍了如何实现一个跨框架的组件库。 前言 前端组件库跨框架是什么? 前端组件库跨框架是指在不同的前端框架(如…...
自定义label组件
自定义label组件 支持边框绘制 支持shape背景(按指定圆角裁剪,矩形,圆角矩,圆形),支持指定角圆角 支持自定义阴影(颜色,偏移,深度) 边框颜色支持状态选择器 预览 核心绘制辅助类 public class LabelHelper {private final Paint paint;private Paint shadowPaint;private fina…...
【Linux】使用Makefile自动化编译项目:简化开发流程、提高效率
文章目录 示例一:编译一个进度条程序示例二:编译一个简单的程序gcc的几个选项结论 当你开始一个新的软件项目时,编写一个好的Makefile是非常重要的。Makefile是一个文本文件,用于指定如何构建和编译项目。它定义了目标文件、依赖关…...
浅谈开源和闭源的认知
目录 在大型模型的发展中,开源和闭源两种截然不同的开发模式扮演着关键的角色。开源模式通过促进技术共享,吸引了大量优秀人才的加入,从而推动了大模型领域的不断创新。与此相反,闭源模式则着重于保护商业利益和技术优势ÿ…...
你了解Postman 变量吗?
变量是在Postman工具中使用的一种特殊功能,用于存储和管理动态数据。它们可以用于在请求的不同部分、环境或集合之间共享和重复使用值。 Postman变量有以下几种类型: 1、环境变量(Environment Variables): 环境变量是在Postman…...
ArmSoM-RK3588编解码之mpp编码demo解析:mpi_enc_test
一. 简介 [RK3588从入门到精通] 专栏总目录mpi_enc_test 是rockchip官方编码 demo本篇文章进行mpi_enc_test 的代码解析,编码流程解析 二. 环境介绍 硬件环境: ArmSoM-W3 RK3588开发板 软件版本: OS:ArmSoM-W3 Debian11 三. …...
【ES6.0】-详细模块化、export与Import详解
【ES6.0】-详细模块化、export与Import详解 文章目录 【ES6.0】-详细模块化、export与Import详解一、模块化概述二、ES6模块化的语法规范三、export导出模块3.1 单变量导出3.2 导出多个变量3.3 导出函数3.4 导出对象第一种第二种: 3.5 类的导出第一种第二种 四、imp…...
网工内推 | Base北京,国企网工运维,最高30k*14薪,IE认证优先
01 万方数据股份有限公司 招聘岗位:网络工程师 职责描述: 1.负责完成基础网络组网工作; 2.负责网络对象的访问控制及安全策略,配置VLan,黑白名单、地址转换、故障排查及网络安全监控工作; 3.负责对操作系…...
SQL LIKE 运算符:用法、示例和通配符解释
SQL中的LIKE运算符用于在WHERE子句中搜索列中的指定模式。通常与LIKE运算符一起使用的有两个通配符: 百分号 % 代表零个、一个或多个字符。下划线 _ 代表一个单个字符。 以下是LIKE运算符的用法和示例: 示例 选择所有以字母 “a” 开头的客户&#x…...
编译原理Lab1-用FLEX构造C-Minus-f词法分析器
HNU编译原理lab1实验–根据cminux-f的词法补全lexical_analyer.l文件,完成词法分析器。 本文没有添加任何图片,但是以复制输出的形式展现出来了实验结果。 实验要求: 根据cminux-f的此法补全lexical_analyer.l文件,完成词法分析…...
网络安全之渗透测试入门准备
渗透测试入门所需知识 操作系统基础:Windows,Linux 网络基础:基础协议与简单原理 编程语言:PHP,python web安全基础 渗透测试入门 渗透测试学习: 1.工具环境准备:①VMware安装及使用;…...
【MySQL】宝塔面板结合内网穿透实现公网远程访问
文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cpo…...
通过AX6000路由器,实现外部访问内网的任意主机
概述 这里遇到一个场景,就是需要外部的人员,访问我内网的一台设备,进行内外部的设备联调。 这也是实际环境中,很常见的一种场景。 之前的做法是子设备上运行edge节点,可以直接访问。 但有的设备无法运行edge节点,那么可以参考一下这个方案来实现。 此方案可以摒弃了…...
如何应用ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作??
如果我想让gpt从pdf文档中提取相关关键词的内容,可以怎么做呢??我们评论区讨论 ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题,ChatGPT都能为您提供实用且高质量的建议和指导&am…...
camera-caps:Jetson设备上的一种实用的V4L2可视化界面
camera-caps:Jetson设备上的一种实用的V4L2可视化界面 github地址是: https://github.com/jetsonhacks/camera-caps 注意:Jetpack5.x需要选择tag 5.x版本...
CAN基础知识
CAN 简介 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信 协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种 各样的电子控制系统被开发了出来…...
PX4+FlightGear联合仿真入门:从QGroundControl连接、虚拟摇杆设置到首次飞行实操
PX4FlightGear联合仿真实战:从零操控到首次飞行全解析 当FlightGear的蓝天白云界面在屏幕上展开,而PX4控制台闪烁着待命光标时,许多无人机爱好者会陷入短暂的迷茫——环境搭建只是起点,真正的挑战在于如何让这架虚拟飞机听从指令翱…...
别再死记硬背公式了!用PyTorch代码实战推导普通/深度可分离/分组卷积的参数量与FLOPs
用PyTorch代码实战验证卷积层的参数量与计算量 在深度学习模型优化过程中,理解不同卷积操作的参数量(Params)和浮点运算量(FLOPs)至关重要。本文将带您通过PyTorch代码实际构建普通卷积、深度可分离卷积和分组卷积层,并使用torchinfo和thop工具验证理论计…...
Hitboxer:终极SOCD清理工具,一键解决游戏按键冲突的免费神器
Hitboxer:终极SOCD清理工具,一键解决游戏按键冲突的免费神器 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的游戏对战中,明明按下了正确的按键,角…...
手把手教你用LongCat-Image-Editn:无需代码,在星图平台快速搭建个人AI修图站
手把手教你用LongCat-Image-Editn:无需代码,在星图平台快速搭建个人AI修图站 1. 为什么选择LongCat-Image-Editn 1.1 普通人也能用的AI修图神器 想象一下:你有一张完美的照片,但想换个背景;或者产品图需要更新&…...
想要副业增收、入职网安?这份 SRC 漏洞挖掘全流程指南,帮你快速上手漏洞挖掘
凌晨两点,大学生张三盯着电脑屏幕突然跳出的「高危漏洞奖励到账」提示,手抖得差点打翻泡面——这是他挖到人生第一个SRC漏洞(某电商平台的越权访问漏洞)后收到的第一笔奖金,金额足够支付三个月生活费。这样的故事&…...
062B-基于51单片机无线病房呼叫系统(+时间)【Proteus仿真+Keil程序+报告+原理图】
062B-基于51单片机无线病房呼叫系统(时间)一、系统硬件整体架构 本无线病房定时呼叫系统选用STC89C51单片机作为主控芯片。整体硬件配置包含:51 单片机最小系统、NRF24L01 无线通信模块、DS1302 实时时钟芯片、LCD1602 液晶显示模块、按键控制…...
Caldera 推出 Metalayer 生态工具 拓展 Layer 生态能力
Caldera 近日正式推出 Metalayer Token Launcher,这是首个支持跨链代币部署的无代码解决方案, 为项目方提供一套无需代码的代币发行工具,帮助团队快速创建并部署 MetaTokens,进一步降低链上经济系统启动与资产发行的技术门槛。 Metalayer To…...
Rust的声明宏macro_rules!与过程宏在元编程能力上的根本差异
Rust作为一门现代系统编程语言,其元编程能力主要依赖于两种宏系统:声明宏macro_rules!和过程宏。它们在语法扩展和代码生成方面各具特色,但背后的设计理念和实现机制却存在根本性差异。理解这些差异不仅能帮助开发者选择合适的工具࿰…...
hyperf 数据治理与合规安全一体化:数据分级、血缘、隐私合规、审计追踪、密钥与机密管理。
数据分级 -> 采集最小化 -> 全链路可追踪 -> 审计可回放 -> 密钥集中托管 -> 发布前自动检查。──────────────────────────────下面给你一套完整可落地的方法。---1. 先定总原则(所有技术动作都围绕它)1. …...
Amulet-Map-Editor完整功能解析:从世界编辑到格式转换
Amulet-Map-Editor完整功能解析:从世界编辑到格式转换 【免费下载链接】Amulet-Map-Editor A Minecraft world editor and converter that supports all versions since Java 1.12 and Bedrock 1.7. 项目地址: https://gitcode.com/gh_mirrors/am/Amulet-Map-Edit…...
