最新要闻
- 世界热资讯!王一博、梁朝伟主演电影《无名》结束公映:85天票房9.31亿
- 热讯:RTX 4060 Ti、RTX 4060严重缩水:除了显存 还有一点没法看
- 天天视点!人类真是动物界最优秀的长跑运动员?别闹了
- 环球快报:一款车发布两年还没影!长城怎么这么难产?
- 当前聚焦:机械硬盘卖不动了 销量暴跌35%!三大品牌抱团哭惨
- 三代同堂!46岁皇马传奇古蒂升级当爷爷,22岁网红大女儿产下一子
- 世界短讯!【明日方舟】4周年活动更新预测(第二版)
- 当前头条:4年不卡的骁龙8+旗舰来了!一加Ace 2原神限定版明天发:抢到赚到
- 全球视点!iOS 17控制中心将有大变化:有一批老设备不支持 将被淘汰
- AMD、NVIDIA新一代显卡全部破发!次旗舰双双最惨
- 世界观察:民营天龙二号液体火箭首飞成功:还隐藏了一个中国第一
- 天天看热讯:不知道这几点!你买电动牙刷就是花冤枉钱
- 世界热资讯!热泵干衣机被严重低估了!浑身都是宝
- 环球快报:2023上海车展丨这些即将首发的热门新车你一定不要错过!
- 云南泼水节白天是热闹夜晚是浪漫:市民游客共狂欢
- 员工回应公司发布高薪招聘老板公告:不是开玩笑
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【全球报资讯】考研数据结构模板:顺序表、链表、栈、队列
【资料图】
考研数据结构模板:顺序表、链表、栈、队列
前言
- 代码风格偏向于考研风格而非算法竞赛风格。
- 代码实现参考《2024数据结构王道复习指导》。
- 注释详细、保证看懂。
- 下面是已实现的数据结构模板:
- 顺序表SeqList
- 链表LinkList
- 双链表DLinkList
- 顺序栈SeqStack
- 循环顺序队列CircleQueue
- 链队列LinkQueue
顺序表SeqList
顺序表定义
// 定义顺序表struct SeqList { int *data; // 数据动态分配 int length, maxLength; // 当前长度、最大长度};// 最大容量#define SEQ_LIST_MAX_SIZE 100// 初始容量#define SQL_LIST_INIT_SIZE 10
初始化
void SeqListInitial(SeqList &list) { list.maxLength = SQL_LIST_INIT_SIZE; list.data = new int[list.maxLength]; list.length = 0;}
判断是否为空
bool SeqListIsEmpty(SeqList &list) { return list.length == 0;}
查询元素长度
int SeqListLength(SeqList &list) { return list.length;}
打印元素
void SeqListPrint(SeqList &list) { for (int i = 0; i < list.length; i++) { printf("%d ", list.data[i]); }}
插入元素
bool SeqListInsert(SeqList &list, int index, int data) { if (index < 1 || index > list.length + 1) { // index范围必须在[1, list.SeqListLength + 1] return false; // 下标溢出 } if (list.length == list.maxLength) { // 空间不足,申请空间 if (list.length == SEQ_LIST_MAX_SIZE) { return false; // 空间溢出 } else { int maxLength; // 下一次申请空间的长度 if (list.length * 2 < SEQ_LIST_MAX_SIZE) { maxLength = list.length * 2; // 容量每次扩大两倍 } else { maxLength = SEQ_LIST_MAX_SIZE; } int *memory = new int[maxLength]; // 创建一块存储空间 for (int i = 0; i < list.length; i++) { // 复制数组 memory[i] = list.data[i]; } delete list.data; // 释放原来的空间 list.data = memory; list.maxLength = maxLength; } } for (int i = list.length; i >= index; i--) { // 移动数组 list.data[i] = list.data[i - 1]; } list.length++; list.data[index - 1] = data; // 插入元素 return true;}
删除元素
bool SeqListRemove(SeqList &list, int index, int &data) { if (index < 1 || index > list.length) { // index取值范围为[1, list.SeqListLength] return false; // 溢出 } data = list.data[index - 1]; // 保存删除的数据 for (int i = index; i < list.length; i++) { // 移动元素 list.data[i - 1] = list.data[i]; } list.length--; return true;}
查询元素位置
int SeqListFindIndex(SeqList &list, int data) { for (int i = 0; i < list.length; i++) { // 遍历数组 if (list.data[i] == data) { return i + 1; } } return -1; // 找不到则返回-1}
查询位置上的元素值
bool SeqListGet(SeqList &list, int index, int &data) { if (index < 1 || index > list.length) { // 下标范围在[1, list.length]之间 return false; } data = list.data[index - 1]; // 保存元素 return true;}
链表LinkList
链表定义
// 单链表节点struct LinkListNode { int data; LinkListNode *next;};// 单链表struct LinkList { LinkListNode *head; // 头指针 LinkListNode *tail; // 尾指针};
空元素初始化
void LinkListInitial(LinkList &list) { LinkListNode *node = new LinkListNode(); // 初始化头节点 list.head = node; list.tail = node;}
数组初始化
void LinkListInitial(LinkList &list, int data[], int length) { LinkListNode *node = new LinkListNode(); list.head = node; list.tail = node; for (int i = 0; i < length; i++) { // 尾插法插入所有元素 LinkListNode *next = new LinkListNode(); next->data = data[i]; list.tail->next = next; list.tail = list.tail->next; }}
查询元素长度
int LinkListLength(LinkList &list) { int length = 0; LinkListNode *p = list.head->next; while (p != NULL) { // 遍历链表直到为空 length++; p = p->next; } return length;}
打印元素
void LinkListPrint(LinkList &list) { if (list.head == list.tail) { return; } LinkListNode *p = list.head->next; while (p != NULL) { // 遍历所有元素,直到为空 printf("%d ", p->data); p = p->next; }}
插入元素
bool LinkListInsert(LinkList &list, int index, int data) { if (index < 1) { // 下标范围必须大于等于1 return false; } LinkListNode *p = list.head; // 用于保存插入位置的前驱 for (int i = 1; i < index; i++) { // 找到插入位置的前驱 p = p->next; if (p == NULL) { return false; // 不存在此下标 } } LinkListNode *node = new LinkListNode(); // 插入元素 node->data = data; node->next = p->next; p->next = node; return true;}
删除元素
bool LinkListRemove(LinkList &list, int index, int &data) { if (index < 1) { // 下标范围必须大于等于1 return false; } LinkListNode *p = list.head; // 用于保存插入位置的前驱 for (int i = 1; i < index; i++) { // 查找删除位置的前驱 p = p->next; if (p == NULL) { return false; // 不存在此下标 } } LinkListNode *node = p->next; // 执行删除操作 data = node->data; // 保存删除节点的值 p->next = node->next; delete node; // 释放空间 return true;}
查询位置上的元素值
bool LinkListGet(LinkList &list, int index, int &data) { if (index < 1) { // 下标范围必须大于等于1 return false; } LinkListNode *p = list.head; for (int i = 1; i <= index; i++) { // 遍历链表 p = p->next; if (p == NULL) { return false; // 不存在此下标 } } data = p->data; return true;}
双链表DLinkList
双链表定义
// 双链表节点struct DLinkListNode { int data; DLinkListNode *prev, *next; // 前驱与后继节点};// 双链表struct DLinkList { DLinkListNode *head; // 头节点};
初始化
void DLinkListInitial(DLinkList &list) { DLinkListNode *head = new DLinkListNode(); // 创建头节点 list.head = head;}
打印元素
void DLinkListPrint(DLinkList &list) { DLinkListNode *p = list.head; while (p->next != NULL) { p = p->next; printf("%d ", p->data); }}
插入元素
bool DLinkListNodeInsert(DLinkList &list, int index, int data) { if (index < 1) { // 下标范围必须大于等于1 return false; } DLinkListNode *p = list.head; for (int i = 1; i < index; i++) { // 找到插入位置的前驱 p = p->next; if (p == NULL) { return false; // 不存在此下标 } } DLinkListNode *node = new DLinkListNode(); // 插入元素 node->data = data; node->next = p->next; if (p->next != NULL) { p->next->prev = node; } node->prev = p; p->next = node; return true;}
删除元素
bool DLinkListRemove(DLinkList &list, int index) { if (index < 1) { // 下标范围必须大于等于1 return false; } DLinkListNode *p = list.head; // 找到删除位置的前驱 for (int i = 1; i < index; i++) { p = p->next; if (p == NULL) { return false; // 不存在此下标 } } DLinkListNode *q = p->next; // 被删除的元素 if (q == NULL) { // 当q为链表末尾时,则被删除的元素不存在 return false; } p->next = q->next; if (q->next != NULL) { q->next->prev = p; } delete q; // 释放空间 return true;}
顺序栈SeqStack
顺序栈定义
// 最大空间#define SEQ_STACK_MAX_SIZE 100// 顺序栈struct SeqStack { int data[SEQ_STACK_MAX_SIZE]; int top; // 栈顶指针};
初始化
void SeqStackInitStack(SeqStack &stack) { stack.top = -1; // 使用-1标识为空栈}
判断是否为空
bool SeqStackIsEmpty(SeqStack &stack) { return stack.top == -1;}
进栈
bool SeqStackPush(SeqStack &stack, int data) { if (stack.top == SEQ_STACK_MAX_SIZE - 1) { return false; // 空间不够 } stack.data[++stack.top] = data; // 指针后移并添加元素 return true;}
出栈
bool SeqStackPop(SeqStack &stack, int &data) { if (stack.top == -1) { return false; // 没有元素 } data = stack.data[stack.top--]; // 删除元素并将指针前移 return true;}
读取栈顶元素
bool SeqStackGetTop(SeqStack &stack, int &data) { if (stack.top == -1) { return false; // 没有元素 } data = stack.data[stack.top]; return true;}
循环顺序队列CircleQueue
循环顺序队列定义
// 最大空间#define CIRCLE_QUEUE_MAX_SIZE 10// 循环顺序队列struct CircleQueue { int data[CIRCLE_QUEUE_MAX_SIZE]; int front, rear; // 头指针和尾指针};
初始化
void CircleQueueInit(CircleQueue &queue) { queue.front = queue.rear = 0;}
判断队列是否为空
bool CircleQueueIsEmpty(CircleQueue &queue) { return queue.front == queue.rear;}
判断队列是否已满
bool CircleQueueIsFull(CircleQueue &queue) { return (queue.rear + 1) % CIRCLE_QUEUE_MAX_SIZE == queue.front; // 队尾的下一个位置是队头,则说明队满}
获取队列长度
int CircleQueueLength(CircleQueue &queue) { return (queue.rear - queue.front + CIRCLE_QUEUE_MAX_SIZE) % CIRCLE_QUEUE_MAX_SIZE;}
进队
bool CircleQueuePush(CircleQueue &queue, int data) { if (CircleQueueIsFull(queue)) { // 如果队列已满,则无法进队 return false; } queue.data[(queue.rear++) % CIRCLE_QUEUE_MAX_SIZE] = data; // 取模实现循环 return true;}
出队
bool CircleQueuePop(CircleQueue &queue, int &data) { if (CircleQueueIsEmpty(queue)) { // 如果队列为空,则无法出队 return false; } data = queue.data[(queue.front++) % CIRCLE_QUEUE_MAX_SIZE]; return true;}
链队列LinkQueue
链队列定义
// 链队列节点struct LinkQueueNode { int data; LinkQueueNode *next;};// 链队列struct LinkQueue { LinkQueueNode *front, *rear; // 头指针和尾指针};
初始化
void LinkQueueInit(LinkQueue &queue) { LinkQueueNode *head = new LinkQueueNode(); // 头节点 queue.front = queue.rear = head;}
判断队列是否为空
bool LinkQueueIsEmpty(LinkQueue &queue) { return queue.front == queue.rear;}
获取队列长度
int LinkQueueLength(LinkQueue &queue) { int length = 0; // 遍历链表直到为空 LinkQueueNode *p = queue.front->next; while (p != NULL) { length++; p = p->next; } return length;}
进队
void LinkQueuePush(LinkQueue &queue, int data) { LinkQueueNode *node = new LinkQueueNode(); // 头节点 node->data = data; queue.rear->next = node; queue.rear = queue.rear->next;}
出队
bool LinkQueuePop(LinkQueue &queue, int &data) { if (LinkQueueIsEmpty(queue)) { return false; // 队列为空 } LinkQueueNode *head = queue.front; // 头节点 LinkQueueNode *node = head->next; data = node->data; queue.front = node; // 新的头节点 delete head; // 释放空间 return true;}
关键词:
【全球报资讯】考研数据结构模板:顺序表、链表、栈、队列
世界热资讯!王一博、梁朝伟主演电影《无名》结束公映:85天票房9.31亿
热讯:RTX 4060 Ti、RTX 4060严重缩水:除了显存 还有一点没法看
天天视点!人类真是动物界最优秀的长跑运动员?别闹了
环球快报:一款车发布两年还没影!长城怎么这么难产?
当前聚焦:机械硬盘卖不动了 销量暴跌35%!三大品牌抱团哭惨
三代同堂!46岁皇马传奇古蒂升级当爷爷,22岁网红大女儿产下一子
天天关注:Node.js的安装以及配置npm全局模块路径和缓存路径
使用Sentieon加速甲基化(WGBS)分析
世界短讯!【明日方舟】4周年活动更新预测(第二版)
当前头条:4年不卡的骁龙8+旗舰来了!一加Ace 2原神限定版明天发:抢到赚到
全球视点!iOS 17控制中心将有大变化:有一批老设备不支持 将被淘汰
AMD、NVIDIA新一代显卡全部破发!次旗舰双双最惨
环球热议:扎实打牢数据结构算法根基,从此不怕算法面试系列之005 week01 02-05 使用自定义类测试我们前面实现的支持泛型的线性查找法
如何获取软件包的下载地址 wget curl
基于GPT3的代码编辑器Cursor试用-你的智能代码编辑助手
每日快播:React onBlur回调中使用document.activeElement返回body解决方案
世界观察:民营天龙二号液体火箭首飞成功:还隐藏了一个中国第一
天天看热讯:不知道这几点!你买电动牙刷就是花冤枉钱
世界热资讯!热泵干衣机被严重低估了!浑身都是宝
环球快播:致聂红的一封信
环球快报:2023上海车展丨这些即将首发的热门新车你一定不要错过!
云南泼水节白天是热闹夜晚是浪漫:市民游客共狂欢
员工回应公司发布高薪招聘老板公告:不是开玩笑
热推荐:java -- File类和递归
贾跃亭憋了九年的车终于量产?结果 又一张大饼!
环球快报:四边等宽的鸿蒙手机来了!华为nova 11明天发
潍坊风筝节放飞打工人的心声:引发网友热议
Intel鸡血驱动暴涨63%!Arc A750性价比秒杀RTX 3060 72%!
当前最新:天舟六号飞船、长征七号火箭抵达文昌!五次发射 100%成功
山东泰山队vs上海申花首发出炉:四外援先发,韩镕泽镇守球门
每日热讯!“泼水节被撕扯雨衣”女生发声:很崩溃
世界快报:众人狂欢!泼水节连狗路过都得淋两桶水再走
贝贝健电蚊香液到手14.9元:驱赶蚊虫神器 夏天必备
全球信息:超级SSD 21合一组成168TB!价格直奔20万元
全球视点!扎实打牢数据结构算法根基,从此不怕算法面试系列之001 week01 02-01 什么是算法?
焦点快报!女子花2万为猫移植鱼皮被网暴 本人:救治一半不可能放弃
全球热头条丨女子澄清妈妈做月嫂存款482万为虚构:觉得好玩就发了 现在很后悔
环球热文:养男三不碰,养女三讲究,教出来的孩子才能立足社会!
世界信息:Air724UG开发板串口教程
首发宁德时代麒麟电池 极氪009 ME版正式交付:根治续航焦虑
环球百事通!超智驾轿跑SUV!小鹏G6将亮相上海车展
学系统集成项目管理工程师(中项)系列06b_信息系统安全管理(下)
【打怪升级】【微服务】聊聊微服务拆分设计
微头条丨《世界尽头的咖啡馆》-热衷于有意义的事,追求真我。
31-触发器01
2023年4月自考《人力资源管理(一)》真题答案汇总
卡普空更新出尔反尔:突然移除《生化危机2/3》Steam版光追
世界速看:奥利奥礼包到手39元:夹心饼干、巧脆卷全都有
环球看点!Vulnhub Fall Walkthrough
环球消息!苹果在线服务又出Bug:用户被迫反复输入Apple ID
每日视点!余承东罕见认错:还连甩五项重磅技术更新
《灌篮高手》赤木刚宪预告 大猩猩怒吼霸气登场
每日看点!Visual Studio Code开发常用的工具栏选项,查看源码技巧以及【vscode常用的快捷键】
环球快资讯丨也门和平进程迎来重要机遇
环球时讯:《流浪地球2》网播热度不减:上线后全网热度登顶
今日热文:深入理解 JVM ------ 调优案例分析与实战
观热点:1年内5名机车网红车祸身亡:靠摩托车来吸睛涨粉 已成“流量密码”
世界热点评!当心寄生虫!女生15元买15个螺肉疑为福寿螺 央视科普如何区分
FreeSWITCH添加iLBC编码及转码
世界最资讯丨负数有奇数和偶数吗_奇数和偶数是什么意思
华为鸿蒙HarmonyOS 4.0来了!余承东确定秋天发布
世界热点评!熊猫“蔓越煤”胡萝卜卡喉 饲养员海姆立克法施救:不愧是“生命的拥抱”
最新消息:《3D编程模式》写书-第3次记录
全球焦点!推荐给你让人震惊的网站集合
快看点丨迪士尼《小美人鱼》黑人鱼主演发声反对霸凌:要和我一样可爱
天天实时:国内首颗主动降水测量卫星成功发射!中国又拿下全球唯一
每日短讯:中国人民银行行长易纲会见印度尼西亚财长英卓华
【焦点热闻】使用 APT-mirror 四步配置 Ubuntu 本地软件仓库
环球快播:【见•闻】日本汽车界对合成燃料汽车赛道寄予厚望
最资讯丨超越“乔帮主” 库克成苹果任职时间最长的CEO
环球信息:存失速、起火风险!奔驰中国召回近25万辆汽车
天天滚动:清明过后教你美味简单的几道家常菜,好吃不容错过,上桌抢着吃
今亮点!14nm以上EDA工具国产化!华为:完成了软件/硬件开发78款工具的替代
每日热议!特斯拉降价是为打“价格战”?马斯克否认并透露原因
世界即时:女子鱼刺卡喉花1265元取出直呼贵!提醒:切勿自行处理
环球焦点!day01-Redis入门
销量大跌 资金链断裂!广汽本田一4S店老板“跑路”
坐燃油车从来不晕车 为何坐电动车很容易晕车?
每日精选:欧拉发布1080°女性安全架构:刹车自动增强、一键紧急呼救
环球要闻:华为4月17日首发全液冷超充架构 充电桩功率“遥遥领先”
今日视点:中国人自己的技术!比亚迪云辇-X实测:三个轮子行驶、过弯超平稳
今头条!卢拉访华:在国际外交舞台上演“王者归来”
预训练模型-从BERT原理到BERT调包和微调
【世界热闻】我的第一个项目(十) :处理全局变量(解决模块化后变量无法获取的问题)
【环球新视野】2023年Rust发展如何?
环球速看:可怕一幕!男子骑摩托车遭风筝线勒喉受伤 官方科普风筝线比刀还锋利
焦点信息:男子未悬挂号牌 竟是嫌老婆选的“250”车牌太丢人
【天天播资讯】为鼓励走出家门:韩国为宅男宅女每月发3400元补贴 网友直呼羡慕
世界热议:解决国产手机厂商5G卡脖子:国产射频滤波器搞定了 年产12万片项目落地
世界热头条丨女子吐槽领导隔监控点名员工加班 大家为工作不敢反抗:网友唏嘘
【世界聚看点】广东家常菜名字_广东家常菜
全球播报:socat的下载和基础使用
天天热文:比亚迪上海车展几号展台公布:比亚迪百万豪车在这里
当前焦点!2023LPL春季赛总决赛落幕 JDG 3:1击败BLG问鼎总冠军
全球最资讯丨宣传防盗、防电诈,送反诈螺蛳粉!柳州警方为企业守平安
【Visual Leak Detector】VS 中 VLD 输出解析
当前通讯!upload-labs writeup
每日视点!1克燃料等于8吨石油 日本明确首个核聚变战略:2050年发电
曝淄博酒店网上标价千元前台仅200元引热议:官方回应