最新要闻
- 沃尔核材拟3.7亿元投建洪山区新能源产业园项目
- 魔魔打勇士攻略,魔魔打勇士必备攻略_1
- 2023江汉区幼升小补录报名需要什么?(附条件+资料)
- 《洪涝灾区动物防疫技术指南(2023年版)》发布
- 湖北省宜昌市兴山县突发山体岩石崩塌致7人死亡
- 海报 | 全国生态日,来看海南工程项目中的生态“微”场景
- 服务企业 助力发展 | “企业之事无小事”——双阳分局破获非法销售液化石油气案
- 2023年兰州医保报销范围有哪些?
- 网配cv有工资吗(网配)
- 2023未来科学大奖名单公布,涉及高温超导、人工智能、生命科学
- 《封神》热映!费翔主演电影票房破40亿
- 12.5万元起 大疆DJI FlyCart 30运载无人机发布:6000米飞行海拔高度
- 北京市房地产中介行业协会微信号(北京市房地产中介行业协会)
- 新北市黄金博物馆遗失329件馆产 市文化局:虚心检讨
- 腾远钴业:8月15日融资买入525.79万元,融资融券余额1.68亿元
- 澜沧古茶港股上市更近一步,行业内控“顽疾”待解
广告
手机
一拍惊人!大中矿业溢价1317倍竞得川西锂矿,42亿成交价钱从何来?
《文字来找茬》保龄球杂技过关攻略
- 一拍惊人!大中矿业溢价1317倍竞得川西锂矿,42亿成交价钱从何来?
- 《文字来找茬》保龄球杂技过关攻略
- 海丰国际(01308)拟于9月14日派中期息每股0.6港元
- 凯恩股份:强云科技定位为数字化服务整体解决方案提供商,目前该公司已变更成公司之参股公司
- 鲁西新区:疏通企业发展“难点”“痛点”
- 星河中学教育集团小升初派位生招生2023
家电
顺序表与链表
(资料图片仅供参考)
顺序表与链表
前言
基础数据结构的学习主要包括两个部分,即【结构定义】与【结构操作】。顾名思义,结构定义就是定义某种或多种性质,再通过相关的结构操作去维护这种性质。对于初学者来说数据结构的学习不能抽象的理解,还需要结合动态的、可视化的工具去理解。下面给出美国旧金山大学数据结构可视化的网站,帮助理解。 美国旧金山大学数据结构可视化网站
顺序表
【概念】
顺序表就是线性表的顺序存储形式,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
【结构特点】
支持随机存取
插入删除不方便
存储密度高
【结构操作】
- 初始化【init】
Vector *init(int n) { Vector *v = (Vector *)malloc(sizeof(Vector)); v->data = (int *)malloc(sizeof(int) * n); v->len = 0; v->size = n; return v;}//数组空间初始化
- 删除【delete】
int delete(Vector *v, int ind) { if (v == NULL) return 0; if (ind < 0 || ind >= v->len) return 0; for (int i = ind; i < v->len; i++) { v->data[i] = v->data[i + 1]; } v->len--; return 1;}//删除指定位置的元素
- 销毁【clear】
void clear(Vector *v) { if (v == NULL) return ; free(v->data); free(v); return ;}//销毁顺序表
- 插入【insert】
int insert(Vector *v, int ind, int val) { if (v == NULL) return 0; if (ind < 0 || ind > v->len) return 0; if (v->len == v->size) { //扩容操作 if (!expand(v)) return 0;//扩容失败 printf("expand is successfuly ~~~\n"); } for (int i = v->len; i > ind; i--) { v->data[i] = v->data[i - 1]; } v->data[ind] = val; v->len++; return 1;}//插入元素
- 扩容【expand】
int expand(Vector *v) { int tmp_size = v->size; int *p; while (tmp_size) { p = (int *)realloc(v->data, sizeof(int) * (tmp_size + v->size));//重新分配空间 if (p) break; tmp_size /= 2; } if (p == NULL) return 0; v->data = p; v->size += tmp_size; return 1;}//扩容操作
- 查找【search】
int search(Vector *v, int ind) { if (v == NULL) return 0; if (ind < 0 || ind >= v->len) return 0; return v->data[ind];}//获取指定位置元素的值
【问题记录】
- 当使用realloc重新分配数组空间失败后,返回的是什么值?【NULL】
- 当calloc、malloc、realloc申请的空间为0个能不能申请成功?
- 可以申请成功,并且不为空。
- 注意:但是此时申请的地址空间不可使用
- 顺序表插入一个新元素val到ind位置的思路:1.判断ind是否合法,即0 ≤ ind < vector.len;2.判断顺序表的长度是否大于空间大小(vector.len ≥ vector.size)3.从顺序表最后一个元素开始向后移动一位,直到移动到下标为ind位置为止4.将vector[ind] = val; 完成顺序表元素插入5.vector.len += 1;
- 顺序表删除指定位置ind的思路:1.判断要删除的位置ind是否合法,即 0 ≤ ind < vector.len;2.指针走到下标为ind的位置,将ind + 1的元素复制到ind位置,直到指针走到顺序表最后一个元素。3.vector.len -= 1;
- 顺序表数组空间扩容的思路:1.判断顺序表长度是否等于数组空间的大小,即 vector.len ?= vector.size2.若len 等于 size 则触发扩容操作,将原始空间大小 size 保存下即:tmp_size = size;3.为了防止重新分配空间失败,申请指针p , 采用while循环通过不断缩减temp_size的大小(tmp_size /= 2)申请重新分配地址空间。4.退出循环后判断p是否为NULL, 不为空就将p赋值给原始指针。并更新空间大小。
- 顺序表数组空间销毁的思路:1.首先判断vector是否为NULL2.不为空则销毁数据空间3.最后销毁vector
- 顺序表查询指定位置元素的思路:1.判断查询位置是否合法(即:0 ≤ ind < vector.len)2.直接根据索引即可查询到(即:return vector.data[ind])
顺序表完整代码
点击查看代码
#include#include#include/*顺序表:初始化、插入、删除、销毁、扩容、查找*/typedef struct Vector { int *data; int len, size;}Vector;Vector *init(int n) { Vector *v = (Vector *)malloc(sizeof(Vector)); v->data = (int *)malloc(sizeof(int) * n); v->len = 0; v->size = n; return v;}//数组空间初始化int expand(Vector *v) { int tmp_size = v->size; int *p; while (tmp_size) { p = (int *)realloc(v->data, sizeof(int) * (tmp_size + v->size));//重新分配空间 if (p) break; tmp_size /= 2; } if (p == NULL) return 0; v->data = p; v->size += tmp_size; return 1;}//扩容操作int insert(Vector *v, int ind, int val) { if (v == NULL) return 0; if (ind < 0 || ind > v->len) return 0; if (v->len == v->size) { //扩容操作 if (!expand(v)) return 0;//扩容失败 printf("expand is successfuly ~~~\n"); } for (int i = v->len; i > ind; i--) { v->data[i] = v->data[i - 1]; } v->data[ind] = val; v->len++; return 1;}//插入元素int delete(Vector *v, int ind) { if (v == NULL) return 0; if (ind < 0 || ind >= v->len) return 0; for (int i = ind; i < v->len; i++) { v->data[i] = v->data[i + 1]; } v->len--; return 1;}//删除指定位置的元素int search(Vector *v, int ind) { if (v == NULL) return 0; if (ind < 0 || ind >= v->len) return 0; return v->data[ind];}//获取指定位置元素的值void clear(Vector *v) { if (v == NULL) return ; free(v->data); free(v); return ;}//销毁顺序表void output(Vector *v) { if (v == NULL) return ; printf("Vector[%d] ==> [", v->len); for (int i = 0; i < v->len; i++) { i && printf(","); printf("%d", v->data[i]); } printf("]\n"); return ;}//遍历顺序表int main() { #define max_op 10 Vector *v = init(max_op);/*初始化数组空间*/ srand(time(0)); int op, ind, val; for (int i = 0; i < max_op; i++) { op = rand() % 4; ind = rand() % (v->len + 1); val = rand() % 100; switch (op) { case 0: case 1: case 2: { /*插入元素*/ printf("Vector insert val[%d] into ind[%d] is %s\n", val, ind, insert(v, ind, val) ? "successfully" : "fail"); } break; case 3: { /*删除指定位置的元素*/ printf("Vector delete ind[%d] is %s\n", ind, delete(v, ind) ? "successfully" : "fail"); } break; } output(v); } printf("请输入要查找的位置:"); while (~scanf("%d", &ind)) { val = search(v, ind); if (val) printf("search ind[%d] is val[%d]\n", ind, val); else printf("对不起, 你查找的位置不合法。请重新输入!\n"); printf("请输入要查找的位置:"); } putchar(10); #undef max_op clear(v);/*销毁顺序表*/ return 0;}
链表
【概念】
使用任意的存储单元存储线性表的数据元素,该存储单元可以是连续的也可以是不连续的。采用结点表示每一个线性表的元素,结点包括指针域、数据域。数据域存储数据元素的值、指针域存储下一个结点的地址。
【结构特点】
插入删除效率高
内存利用率高
操作灵活
【结构操作】
- 初始化【init】
List *init() { List *l = (List *)malloc(sizeof(List)); l->head = (Node *)malloc(sizeof(Node)); l->head->next = NULL; l->len = 0; return l;}/*初始化链表*/
- 插入【insert】
int insert(List *l, int ind, int val) { if (l == NULL) return 0; if (ind < 0 || ind > l->len) return 0; /*插入位置不合法*/ Node *p = l->head, *q; while (ind--) p = p->next; q = p->next; p->next = getNewNode(val); p = p->next; p->next = q; l->len++; return 1;}/*插入新节点*/
- 销毁【clear】
void clearNode(Node *head) { if (head == NULL) return ; clearNode(head->next); free(head); return ;}/*销毁结点*/void clear(List *l) { if (l == NULL) return ; clearNode(l->head); free(l); return ;}/*销毁链表*/
- 删除【delete】
int delete(List *l, int ind) { if (l == NULL) return 0; if (ind < 0 || ind >= l->len) return 0;//删除位置不合法 Node *p = l->head, *q; while (ind--) p = p->next; q = p->next; p->next = q->next; free(q); l->len--; return 1;}/*删除结点*/
问题记录
- 链表如何插入一个新节点node到指定位置ind?
- 判断ind是否合法(即 ind > 0 && ind < list.len);
- 申请两个指针p 、q;
- p指向虚拟头结点,根据ind向后迭代 while (ind—)p = p→next;
- q指向p→next(防止内存泄漏)
- 将node插到p→next位置 :p→next = node;
- 此时p指向 p→next; p = p→next
- 重新挂载后面的数据 p→next = q;
- 链表删除指定元素?
- 指针p走到待删除的前一个结点位置。
- 将待删除结点的后面数据使用指针q指向
- 将指针p指向的结点的next指针域覆盖为待删除的结点后面的q;
链表完整代码
点击查看代码【单链表】
#include#include#include/*单链表:初始化、获取新节点、插入新节点、删除结点、销毁链表、遍历结点*/typedef struct Node { int data; struct Node *next;}Node;typedef struct List { Node *head;//虚拟头结点 int len;}List;/*获取新节点*/Node *getNewNode(int val) { Node *p = (Node *)malloc(sizeof(Node)); p->data = val; p->next = NULL; return p;}List *init() { List *l = (List *)malloc(sizeof(List)); l->head = (Node *)malloc(sizeof(Node)); l->head->next = NULL; l->len = 0; return l;}/*初始化链表*/int insert(List *l, int ind, int val) { if (l == NULL) return 0; if (ind < 0 || ind > l->len) return 0; /*插入位置不合法*/ Node *p = l->head, *q; while (ind--) p = p->next; q = p->next; p->next = getNewNode(val); p = p->next; p->next = q; l->len++; return 1;}/*插入新节点*/int delete(List *l, int ind) { if (l == NULL) return 0; if (ind < 0 || ind >= l->len) return 0;//删除位置不合法 Node *p = l->head, *q; while (ind--) p = p->next; q = p->next; p->next = q->next; free(q); l->len--; return 1;}/*删除结点*/void output(List *l) { if (l == NULL) return ; printf("Linklis[%d] == [", l->len); int flag = 0; for (Node *p = l->head->next; p; p = p->next) { flag && printf("->"); printf("%d", p->data); flag = 1; } printf("]\n"); return ;}/*遍历链表结点*/void clearNode(Node *head) { if (head == NULL) return ; clearNode(head->next); free(head); return ;}/*销毁结点*/void clear(List *l) { if (l == NULL) return ; clearNode(l->head); free(l); return ;}/*销毁链表*/int main() { srand(time(0)); int op, ind, val; #define max_op 20 List *l = init(); for (int i = 0; i < max_op; i++) { op = rand() % 4; ind = rand() % (l->len + 1); val = rand() % 100; switch (op) { case 0: case 1: case 2: { printf("Linklist[%d] insert val = %d in the ind = %d is %s\n", l->len, val, ind, insert(l, ind, val) ? "YES" : "NO"); } break; case 3: { printf("Linklist[%d] delete the ind = %d is %s\n", l->len, ind, delete(l, ind) ? "YES" : "NO"); } break; } output(l); } clear(l); #undef max_op return 0;}
点击查看代码【双向链表】
//双向链表:初始化、插入、删除、销毁、遍历、获取ind位置的元素#include#include#includetypedef struct Node { int data; struct Node *next, *pir;}Node;typedef struct DLinkList { Node *head; int len;}DLinkList;//获取新节点Node *getNewNode(int val) { Node *p = (Node *)malloc(sizeof(Node)); p->next = p->pir = NULL; p->data = val; return p;}//获取新的双链表DLinkList *getNewDLinkList() { DLinkList *DL = (DLinkList *)malloc(sizeof(DLinkList)); DL->head = getNewNode(0);//头结点 DL->len = 0; return DL;}//插入int insert(DLinkList *DL, int ind, int val) { if (DL == NULL) return 0; if (ind < 0 || ind > DL->len) return 0;//插入位置不合法 Node *p = DL->head, *q, *new_node = getNewNode(val); while (ind--) p = p->next; new_node->next = p->next; new_node->pir = p; if (p->next) p->next->pir = new_node; p->next = new_node; DL->len += 1; return 1;}//删除int delete(DLinkList *DL, int ind) { if (DL == NULL) return 0; if (ind < 0 || ind >= DL->len) return 0;//删除的位置不合法 Node *p = DL->head; while (ind--) p = p->next; Node *q = p->next; p->next = q->next; if (q->next) q->next->pir = p; DL->len--; free(q); return 1;}//搜索第ind位置的元素int search(DLinkList *DL, int ind) { if (DL == NULL) return 0; if (ind < 0 || ind >= DL->len) return 0; Node *p = DL->head; while (ind--) p = p->next; return p->data;}//遍历void output(DLinkList *DL) { if (DL == NULL) return ; printf("["); Node *p = DL->head->next; int i = 0; for (Node * p = DL->head->next; p; p = p->next) { i++ && printf(", "); printf("%d", p->data); } printf("] <== DL[%d]\n", DL->len); return ;}//销毁双向链表void clearNode(Node *head) { if (head == NULL) return ; clearNode(head->next); return ;}void clear(DLinkList *DL) { if (DL == NULL) return ; clearNode(DL->head); free(DL); return ;}int main() { srand(time(0)); #define max_op 20 int op, val, ind; DLinkList *DL = getNewDLinkList();//获取一个双向链表 for (int i = 0; i < max_op; i++) { op = rand() % 4; ind = rand() % (DL->len + 1); val = rand() % 100; printf("op = %d ind = %d val = %d\n", op, ind, val); switch (op) { case 0: case 1: { //插入 printf("insert the ind = %d ,val = %d to the DL %s!\n", ind + 1, val, insert(DL, ind, val) ? "YES" : "NO"); } break; case 2: { //删除 printf("delete the element of ind = %d from the DL %s!\n", ind + 1, delete(DL, ind) ? "YES" : "NO"); } break; case 3: { //查找 val = search(DL, ind); printf("search the element of ind = %d from the DL is %d!\n", ind + 1, search(DL, ind)); } break; } output(DL); } clear(DL); #undef max_op return 0;}
关键词:
顺序表与链表
车评头条:全新GS4正式上市 广汽传祺新车针对外观进行了小幅调整
曝荣耀Magic V2 Lite将9月发布 硬刚Mate60和iPhone 15
《孤注一掷》曝片尾曲 希里娜依·高唱出劫后余生感
唐北电瓷时任董事会秘书(信息披露负责人)苑晓奇受到全国股转公司自律监管措施
沃尔核材拟3.7亿元投建洪山区新能源产业园项目
移远通信控股股东拟减持不超2%股份
7天网贷小额贷款不还会怎样
一拍惊人!大中矿业溢价1317倍竞得川西锂矿,42亿成交价钱从何来?
世界田联期待刘虹再上领奖台
排污沟→城市绿丝带 十万张照片见证长沙圭塘河变迁
《文字来找茬》保龄球杂技过关攻略
一二线城市二手房价降幅扩大 什么信号?
惯的笔顺(习惯的力量)
宝马全新i5申报图曝光 驾驶体验值得期待
通过机构贷款买了一辆车,担保公司说是要去办理贷款的抵押,由于办理抵押需要身份证原件
海科新源:东营工厂拥有医药级和食品级丙二醇资质 目前满负荷生产
四川电力职业技术学院2023年录取线(华西医科大2018录取线)
图片报:德赫亚向拜仁要2000万年薪,拜仁已首选奥尔特加
电光科技:公司在温州乐清新的生产基地预计在今年年底明年年初投产,其他子公司的产能也有所增加
房地产传出“小作文”,早盘房地产板块大幅飙升
海丰国际(01308)拟于9月14日派中期息每股0.6港元
SPD概念持续走强 零售板块开盘走低丨板块牛熊榜
全国生态日中央部委晒成绩单:可再生能源装机历史性超过煤电
中国银河给予中国黄金推荐评级,23H1业绩稳健,量价齐升推动主营黄金业务规模增长符合预期
白羽肉鸡行业深度报告:鸡肉消费深度剖析:预期的替代压制 现实的中枢上移
凯恩股份:强云科技定位为数字化服务整体解决方案提供商,目前该公司已变更成公司之参股公司
马鞍山市雨山区:小区治理“红”起来 居民生活“美”起来
魔魔打勇士攻略,魔魔打勇士必备攻略_1
受传闻刺激,券商股拉大盘!黑马选手今天抓住两个涨停!比赛报名火热,上车赢大奖!
国际滑联世界花滑大奖赛总决赛会徽“冰帆”发布
成都土拍:15宗地收金超150亿元 建发和保利各斩获两宗
甘肃省发布沙尘蓝色预警!干旱黄色预警!
较去年同期增长8.23%!2023年度青海湖夏候鸟监测结果来了
8月20日起,博山这条路半封闭施工!
锁喉对手,辱骂球童,罚!中国足协连开两张罚单
粤省事怎么使用广州电子社保卡进行医保支付?
【视频】飞来横祸!连人带车被货物砸倒,骑车人左腿膝盖骨折
央媒看四川丨来自大凉山的女孩吉好有果——用歌声唱出对未来的美好憧憬
2023江汉区幼升小补录报名需要什么?(附条件+资料)
九寨-黄龙:打造国际生态文化旅游目的地|聚焦建设世界重要旅游目的地④
邮储银行全力支持防汛救灾和灾后重建
“中华大粮仓”众志成城护安澜
【半月谈】大学生来这里面试,可申请免费住宿7天
美国佛罗里达州两艘汽艇相撞 致13人受伤
电脑怎么设置动态桌面? 电脑怎么设置动态桌面win11
更方便了!电子签章更便民 青岛医保服务协议开启无纸化网签模式
全国就指委持续发挥促就业作用 为高校毕业生就业冲刺加力
2023年郑州蔡琴演唱会(时间+地点+购票+演出简介)
江西省美术馆怎么预约门票?
灵武市2023年租房户新生入学相关通知
2023长春新区半程马拉松赛报名条件一览
天通股份:8月14日融资买入1107.97万元,融资融券余额10.72亿元
《洪涝灾区动物防疫技术指南(2023年版)》发布
湖北省宜昌市兴山县突发山体岩石崩塌致7人死亡
继承房产因姓名不同遇难题,民警多方查找档案终解决
时代光影 百部川扬 | 《成华发布〈既神秘又神圣的成都东郊〉》
海报 | 全国生态日,来看海南工程项目中的生态“微”场景
秋风过小院
鲁西新区:疏通企业发展“难点”“痛点”
服务企业 助力发展 | “企业之事无小事”——双阳分局破获非法销售液化石油气案
江阴银行:公司对碧桂园无集团授信
24小时不间断服务!县(市、区)全覆盖!
星河中学教育集团小升初派位生招生2023
兴业基金、工银瑞信基金旗下部分债基宣布降费
冠中生态:江西省浮梁县项目合同正在协商签订中
鏖战天伦湾
解馋又低脂!香脆滑嫩,我要连炫100串~
2023年兰州医保报销范围有哪些?
2023年8月16日正十二硫醇价格最新行情预测
招商轮船最新公告:以880万元出售1艘老旧集装箱船舶
招远市依法查处一起违法充装液化气案
乘联会:7月份皮卡市场销售3.9万辆 同比去年下降10%
招商银行合肥分行跨境金融便利化和数字化政策宣导会举办
2023未来科学大奖名单公布,涉及高温超导、人工智能、生命科学
Greenbelt5展览中体验雷克萨斯永恒的一面
网配cv有工资吗(网配)
数字金融创新提速,兴业数金“银行移动开发平台”摘得金奖
漫评:后街经济为城市发展提供新动能
重逢!新赛季勇士VS国王首战10月28日在国王主场开打&全美直播
2023未来科学大奖名单公布,涉及高温超导、人工智能、生命科学
美警误杀男子后获警局庇护 外媒:全美警察误杀平民事件已越发频繁
提速建设!国宏智能装备科技产业社区奋力打造科技创新新地标
魔毯悬架,新的谎话?
《封神》热映!费翔主演电影票房破40亿
12.5万元起 大疆DJI FlyCart 30运载无人机发布:6000米飞行海拔高度
前7月全国住宅新开工面积下降25%,“保交付”下住宅竣工面积增长20.8% 分析人士:没有一二线城市的回稳,很难带动全国楼市市场回归
巴菲特新买入3只房地产股 高瓴建仓游戏巨头减持拼多多
岩土工程行业发展特性 岩土工程行业市场发展分析2023
秋季开学后,还接受转学生的天津国际初中名单一览(附2023年学费)
新建区高中补课哪里好补?
北京市房地产中介行业协会微信号(北京市房地产中介行业协会)
高铁座位有A、B、C、D、F字母 为什么就是没有E?
我市一批农贸市场提质升级“华丽变身”
新时代中国调研行·长江篇丨滚滚长江,非遗无限
蔡醒华(关于蔡醒华简述)
如何冻结窗口某一行_如何冻结窗口
广外院:缅甸语专业和电诈相关联帖子系P图
威扬酒业控股(08509):解散投资管理委员会
汽车市场掀新一轮降价潮