最新要闻
- 当前头条:日本最大啤酒商要重返中国:你爱日啤、德啤还是国啤?
- 3999元起 华为Vision智慧屏3开售:720P秒变4K
- 刀塔循环圈单机地图 刀塔循环圈-天天即时看
- “暖蜂驿站”温暖“两新”群体 相城区太平街道打造“15分钟暖蜂服务圈”-每日关注
- 首发2999元 联想百应新款迷你主机上架:13代i5、机身仅0.5L 全球快消息
- 满油满电续航1370公里 加速7秒内!吉利银河L7上市:13.87万起|世界观焦点
- NVIDIA发布535.98驱动更新:大幅提升《暗黑破坏神4》帧数 每日快讯
- 当前观察:4799元开售!一图看懂努比亚Z50 Ultra摄影师版:玻璃“皮革”独一家
- 市场监管总局:CCC认证制度实施以来,儿童玩具合格率显著提升 每日关注
- 从蔚小理到理小蔚 蔚来汽车做高端砸换电能否逆袭?|今日报
- 华为凌霄子母路由Q6E正式开售:电线变网线 全屋Wi-Fi满格
- 《小美人鱼》内地票房突破2000万!累计观影人次达54.7万 全球报道
- 摩尔线程显卡支持DX11游戏!国产第一家
- 针刺只是小儿科!吉利银河L7电池遭“蹂躏”:跌落水泡火烧撞击均无碍
- 航天宏图: 公司无人机业务:业务领域覆盖国土测绘、环保监测、河道监测、电力巡检、管道巡线、灾情监测等
- 或有剧毒!印度学生午餐中现20厘米死蛇:多人进餐后呕吐昏迷 环球要闻
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
全球新动态:2.单向链表
1.为什么需要链表?
链表是一种灵活的数据结构,它允许在内存中动态地存储和操作元素。以下是一些需要使用链表的原因:
1. 动态数组的缺点:数组的大小是在程序运行时固定的,如果需要添加或删除元素,就需要重新分配内存并复制数据。这会导致大量的内存浪费和性能问题。而链表可以动态地调整大小,只需要增加或删除节点即可。2. 插入和删除操作的效率:在链表中插入和删除元素比在数组中高效得多。因为链表中的节点不需要移动整个数组,只需要修改指针指向即可。这使得链表在处理大量数据时具有更高的效率。3. 随机访问的效率:链表的随机访问效率较低,因为需要从头结点开始遍历整个链表才能找到目标元素。但是,链表可以通过哈希表等数据结构来优化随机访问效率。4. 适用场景:链表适用于那些需要频繁插入和删除元素的场景,例如缓存、队列、栈等数据结构。此外,链表还可以用于实现一些高级算法,如广度优先搜索(BFS)和深度优先搜索(DFS)。
总之,链表是一种非常有用的数据结构,它可以在某些情况下提供比数组更好的性能和灵活性。
2.链表基本概念
链表(Linked List)是一种数据结构,它允许在单个内存位置中存储多个元素。与数组不同,链表中的元素不是连续存储的,而是通过指针相互连接。链表的主要优点是动态地添加和删除元素,而不需要像数组那样需要预先分配固定大小的空间。
【资料图】
链表的基本概念包括:
1. 头结点(Head Node):链表的第一个节点通常被称为头结点。头结点本身不存储实际的数据,它仅用于指向链表的下一个节点。2. 尾节点(Tail Node):链表的最后一个节点通常被称为尾节点。尾节点同样不存储实际的数据,它仅用于指向链表的第一个节点的前一个节点。3. 指针(Pointer):指针是一个变量,它存储另一个变量的地址。在链表中,指针用于连接各个节点。每个节点包含一个指向下一个节点的指针,这样可以形成一个单向链。4. 访问(Accessing):要访问链表中的某个元素,首先需要找到该元素所在的节点。然后,可以通过解引用指针来访问该节点的数据部分。例如,如果有一个指向头结点的指针p,可以使用*p来访问头结点的数据部分。5. 插入(Insertion):在链表中插入一个新元素时,需要先找到合适的位置。可以将新元素插入到头结点之后、尾节点之前的位置,或者尾节点之后的位置。具体操作取决于所选位置是否为空闲状态。插入操作可能涉及修改指针的指向,以便将新元素链接到正确的位置。6. 删除(Deletion):从链表中删除一个元素时,需要找到该元素所在的节点。然后,可以将该节点的指针设置为其后继节点的指针,从而删除该节点。删除操作可能涉及修改指针的指向,以便更新整个链表的结构。
3.链表的形成方式
链表是由包含数据的多个结点前后连接形成的链式结构1.结点:每一个结点是一小片连续的、存放了数据的内存空间,是形成链表的基本单元2.结点的构成:每个结点由两方面内容组成:(1)数据域:真正要处理的数据,可以是单个基本类型的数据,也可以是多个不同类型的数据共同构成。(2)指针域:一般用来存放另一结点的首地址,即指针域是用来指向另一个结点的(或者赋值为NULL,即不指向任何结点。)
4.简单链表的形成
链表正是通过指针域将各个结点有机地联接成一个整体。设有A、B、C、D四个结点,按下图形成链表注意(1)head:设计的头部指针, 指向链表头结点(2)NULL:尾部结点的指针域为空,不指向任何结点。(3)前一节点的指针域存放下一结点的首地址
节点结构体:
//节点结构体struct LinkNode{//数据域void * data;//指针域struct LinkNode * next;};
链表结构体
//链表结构体struct LList{//头节点struct LinkNode pHeader;//链表长度int m_size;};
//不让用户直接访问LListtypedef void * LinkList;
————————————————版权声明:本文为CSDN博主「刘鑫磊up」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/liu17234050/article/details/110502629
5.链表的操作
5.1初始化链表
LinkList init_LinkList(){ struct LList * myList = malloc(sizeof(struct LList)); if (myList == NULL) { return NULL; } myList->pHeader.data = NULL; myList->pHeader.next = NULL; myList->m_size = 0; return myList;}//初始化链表LinkList mylist = init_LinkList();
5.2链表的插入操作
//需要做插入操作的链表是list,插入位置是pos,插入的数据是datavoid insert_LinkList(LinkList list, int pos, void * data)if (list == NULL){return;}if ( data == NULL){return;}//将list还原成 struct LList数据类型struct LList * myList = list;if (pos < 0 || pos > myList->m_size){//无效位置 强制做尾插pos = myList->m_size;}//找到插入节点的前驱节点位置struct LinkNode * pCurrent = &myList->pHeader;for (int i = 0; i < pos;i++){pCurrent = pCurrent->next;}//pCurrent 要插入节点的前驱//创建新节点 struct LinkNode * newNode = malloc(sizeof(struct LinkNode));newNode->data = data;newNode->next = NULL;//建立节点关系newNode->next = pCurrent->next;pCurrent->next = newNode;//更新链表长度myList->m_size++;}//准备数据struct Person p1 = { "亚瑟", 18 };struct Person p2 = { "妲己", 20 };struct Person p3 = { "安琪拉", 19 };struct Person p4 = { "凯", 21 };struct Person p5 = { "孙悟空", 999 };struct Person p6 = { "李白", 999 };//插入数据insert_LinkList(mylist, 0, &p1);insert_LinkList(mylist, 0, &p2);insert_LinkList(mylist, -1, &p3);insert_LinkList(mylist, 0, &p4);insert_LinkList(mylist, 1, &p5);insert_LinkList(mylist, 0, &p6);
5.3链表的遍历操作
//遍历链表void foreach_LinkList(LinkList list, void(*myForeach)(void *)){if (list ==NULL){return;}struct LList * mylist = list;struct LinkNode* pCurrent = mylist->pHeader.next;for (int i = 0; i < mylist->m_size;i++){myForeach(pCurrent->data);pCurrent = pCurrent->next;}}//遍历struct Person{char name[64];int age;};void myPrintPerson(void * data){struct Person * p = data;printf("姓名:%s 年龄:%d\n", p->name, p->age);}foreach_LinkList(mylist, myPrintPerson);
5.4链表的删除操作
//删除链表 按位置void removeByPos_LinkList(LinkList list, int pos){if ( list == NULL){return;}struct LList * mylist = list;if (pos < 0 || pos > mylist->m_size - 1){return;}//找到待删除节点的前驱节点struct LinkNode * pCurrent = &mylist->pHeader;for (int i = 0; i < pos;i++){pCurrent = pCurrent->next;}//记录待删除的节点struct LinkNode * pDel = pCurrent->next;//重新建立节点关系pCurrent->next = pDel->next;free(pDel);pDel = NULL;//更新链表长度mylist->m_size--;}
//按照值删除链表void removeByValue_LinkList(LinkList list, void* data, int(*myCompare)(void*, void*)){if (list == NULL){return;}if (data == NULL){return;}struct LList* mylist = list;//创建两个辅助指针struct LinkNode* pPrev = &mylist->pHeader;struct LinkNode* pCurrent = pPrev->next;for (int i = 0; i < mylist->m_size; i++){//pCurrent->data data 将两个指针比较利用回调 交给用户if (myCompare(pCurrent->data, data)){pPrev->next = pCurrent->next;free(pCurrent);pCurrent = NULL;mylist->m_size--;break;}//没找到 辅助指针后移pPrev = pCurrent;pCurrent = pCurrent->next;}}
5.5清空链表
//清空链表void clear_LinkList(LinkList list){if (list == NULL){return;}struct LList* mylist = list;struct LinkNode* pCurrent = mylist->pHeader.next;for (int i = 0; i < mylist->m_size; i++){struct LinkNode* pNext = pCurrent->next;free(pCurrent);pCurrent = pNext;}mylist->pHeader.next = NULL;mylist->m_size = 0;}
5.6返回链表长度
//返回链表长度int size_LinkList(LinkList list){if (list == NULL){return -1;}struct LList* mylist = list;return mylist->m_size;}
5.7销毁链表
//销毁链表void destroy_Linklist(LinkList list){if (list == NULL){return;}//清空链表clear_LinkList(list);free(list);list = NULL;}
5.8完整代码
#define _CRT_SECURE_NO_WARNINGS#include#include#include//节点结构体struct LinkNode{//数据域void* data;//指针域struct LinkNode* next;};//链表结构struct LList{//头结点struct LinkNode pHeader;//链表长度int m_size;};typedef void* LinkList;//初始化链表LinkList init_LinkList(){struct LList* myList = malloc(sizeof(struct LList));if (myList == NULL){return NULL;}myList->pHeader.data = NULL;myList->pHeader.next = NULL;myList->m_size = 0;return myList;}//插入链表void insert_LinkList(LinkList list, int pos, void* data){if (list == NULL){return;}if (data == NULL){return;}//将list还原成struct LList数据类型struct LList* myList = list;if (pos < 0 || pos > myList->m_size){//无效位置 强制做尾插pos = myList->m_size;}//找到插入节点的前驱节点位置struct LinkNode* pCurrent = &myList->pHeader;for (int i = 0; i < pos; i++){pCurrent = pCurrent->next;//通过循环找到待插入位置的前驱节点}//pCurrent要插入节点的前驱//创建新节点struct LinkNode* newNode = malloc(sizeof(struct LinkNode));newNode->data = data;newNode->next = NULL;//建立节点关系newNode->next = pCurrent->next;pCurrent->next = newNode;//更新链表长度myList->m_size++;}//遍历链表void foreach_LinkList(LinkList list, void(* myForeach)(void *)){if (list == NULL){return;}struct LList* mylist = list;struct LinkNode* pCurrent = mylist->pHeader.next;//头结点数据域没必要访问for (int i = 0; i < mylist->m_size; i++){myForeach(pCurrent->data);pCurrent = pCurrent->next;}}//测试struct Person{char name[64];int age;};void myPrintPerson(void* data){struct Person* p = data;printf("姓名:%s,年龄:%d\n", p->name, p->age);}void test01(){//准备数据struct Person p1 = { "亚瑟", 18 };struct Person p2 = { "妲己", 20 };struct Person p3 = { "安其拉", 19 };struct Person p4 = { "凯", 21 };struct Person p5 = { "孙悟空", 899 };struct Person p6 = { "李白", 899 };//初始化链表LinkList mylist = init_LinkList();//插入数据insertinsert_LinkList(mylist, 0, &p1);insert_LinkList(mylist, 0, &p2);insert_LinkList(mylist, -1, &p3);insert_LinkList(mylist, 0, &p4);insert_LinkList(mylist, 1, &p5);insert_LinkList(mylist, 0, &p6);//李白 凯 孙悟空 妲己 亚瑟 安其拉//遍历foreach_LinkList(mylist, myPrintPerson);}int main(){test01();system("pause");return EXIT_SUCCESS;}
参考资料来源:
黑马程序员
关键词:
全球新动态:2.单向链表
Quartz任务调度框架 世界报资讯
视点!掌握嵌入式Linux编程0简介
月度回望|“资产荒”逻辑未破 5月债市现券收益率曲线陡峭下移
当前头条:日本最大啤酒商要重返中国:你爱日啤、德啤还是国啤?
3999元起 华为Vision智慧屏3开售:720P秒变4K
刀塔循环圈单机地图 刀塔循环圈-天天即时看
React Native+小程序容器=更高的开发效率_焦点热门
全球热议:uniapp uni-number-box组件 步长为1,还能输入小数思路分享
Linux工作原理3设备 天天简讯
2023-05-31:给定一个整数数组 A,你可以从某一起始索引出发,跳跃一定次数 在你跳跃的过程中,第 1、3、5... 次跳跃称为奇数跳跃 而第 2、4、6
世界微动态丨货币市场日报:5月31日
“暖蜂驿站”温暖“两新”群体 相城区太平街道打造“15分钟暖蜂服务圈”-每日关注
首发2999元 联想百应新款迷你主机上架:13代i5、机身仅0.5L 全球快消息
满油满电续航1370公里 加速7秒内!吉利银河L7上市:13.87万起|世界观焦点
NVIDIA发布535.98驱动更新:大幅提升《暗黑破坏神4》帧数 每日快讯
当前观察:4799元开售!一图看懂努比亚Z50 Ultra摄影师版:玻璃“皮革”独一家
c#使用内存映射像处理内存一样去快速处理文件_全球热头条
重学c#系列——DiagnosticListener [三十五]|每日热门
市场监管总局:CCC认证制度实施以来,儿童玩具合格率显著提升 每日关注
从蔚小理到理小蔚 蔚来汽车做高端砸换电能否逆袭?|今日报
华为凌霄子母路由Q6E正式开售:电线变网线 全屋Wi-Fi满格
《小美人鱼》内地票房突破2000万!累计观影人次达54.7万 全球报道
摩尔线程显卡支持DX11游戏!国产第一家
针刺只是小儿科!吉利银河L7电池遭“蹂躏”:跌落水泡火烧撞击均无碍
天天热头条丨记录--Js基础练习题目
Apache DolphinScheduler 3.0.6 发布,或将是最后一个 3.0.X 版本|当前播报
债市日报:5月31日
航天宏图: 公司无人机业务:业务领域覆盖国土测绘、环保监测、河道监测、电力巡检、管道巡线、灾情监测等
或有剧毒!印度学生午餐中现20厘米死蛇:多人进餐后呕吐昏迷 环球要闻
风头盖过马斯克访华 贾跃亭新车220万开卖!FF 91最全解析 世界速递
全球今日讯!新型太阳能电池问世:柔韧性极高 弯曲角度可超360度
中兴晴天墙面路由器上手:新一代WiFi 6穿墙神器
明星餐饮为何逃不出短命魔咒?专家解释原因 全球速读
深圳电网用电负荷连续第三年突破2000万千瓦 当前热点
1499元起 OPPO K11x今晚开售:1亿像素+67W快充
全球今亮点!618最值得买的数码好物!华为家庭存储七大核心优势:比NAS好用多了
四川南充暴雨 下水道喷出1米高水柱!网友:趵突泉南充分泉
预售18:00截止!B站大会员年卡仅需88元
世界热议:手机PC秒变4TB硬盘空间!华为家庭存储图赏
理论+实操|一文掌握 RFM 模型在客户数据洞察平台内的落地实战|焦点速讯
热讯:TSN流量记录器:验证汽车网络中的以太网聚合,经济高效的解决方案
MySQL之常用数据类型
Spring MVC官方文档学习笔记(二)之DispatcherServlet
Python海龟有了新技能,这回画了个印度美女。它正在一丝不苟地给它画像,Python洪水填充fill命令用法。-微动态
天天报道:杀疯了!比亚迪新款元Pro上市:9.58万起 比预售价低4000
【环球速看料】海外版“坦克300”即将国产? 福特烈马国内路试谍照曝光!
台湾大王具足虫拉面341元一碗 学者:海蟑螂远亲 可能会中毒
日本赛马撞线后猝死:前骑手嘲讽哀悼网友“伪君子”引争议
今日要闻!苹果618大跌:iPhone 12/256GB 3499元、iPhone 14 4999元
仙佑医药科技有限公司怎么样? 仙佑集团口碑为什么这么好?
视觉盛宴:探索可视化大屏的无限魅力 世界独家
1.动态数组
TMC2160步进电机驱动芯片
简易视频直播系统的搭建实践
TF无法识别问题分析_环球观速讯
【环球聚看点】数据真空期机构情绪持稳 日债收益率多数小幅回落
世界滚动:收评:五月收官!创业板指跌超1% 英伟达概念股活跃
全球观焦点:2099元!尼康尼克尔Z DX 24mm f/1.7正式发布:夜拍画质绝
最新快讯!新掌机或将用上:高通与索尼、任天堂磋商掌机芯片
vivo S17系列发布:拍人像最好的手机 2499元起
微速讯:269元 vivo TWS Air Pro耳机发布:3D全景音频、续航长达30小时
前置5000万广角柔光!vivo S17 Pro图赏
绍兴二手车交易市场1万2万_绍兴二手车交易市场
别再满屏找日志了!推荐一款 IDEA 日志管理插件,看日志轻松多了!
docker安装redis-世界快讯
天天即时:方萍萍:黄金短期应该是要调整一下
华为最贵笔记本!MateBook X Pro微绒典藏版开卖:13999元
AI可能灭绝人类!ChatGPT之父发出警告:三巨头AI公司CEO力挺-全球快看点
【播资讯】九年造一车!贾跃亭感谢李想支持:期待来FF洛杉矶总部交流指导
两年前魅族18系列“宝刀未老”!获Flyme 10首个稳定版全量推送
女子酒驾后谎称喝了藿香正气水 结果被一招识破 环球动态
人物传记《当今奇人周兴和》七十二 春风得意马蹄急 新视野
每日资讯:基于 Web 实现 m3u8 视频播放的简单应用示例
【经验分享】锐捷EVE在火狐游览器中,取消一律打开此应用的选项,重新选择默认打开应用,如SecureCRT-动态焦点
当前讯息:淘宝太细了:mysql 和 es 的5个一致性方案,你知道吗?
世界热点!2022 Kube-OVN开源社区年度报告
天天视讯!可配置Modbus网关 嵌入式设备联网解决方案
从三岁到八十二岁的武则天(转载)---王晓磊著 之简介|每日视讯
现场视频可怕!四川一特斯拉撞飞路人致身亡:被撞者腾空而起-热门
6月1日开市!大观园早市回来啦
全球视讯!69㎡三房,72㎡四房,广州的户型都卷成这样了?
可视化探索开源项目的 contributor 关系 环球最新
蛋白质纳米“计算机”问世:未来有望治疗癌症
贾跃亭造车梦成 李想:理想很多优秀负责人都来自法拉第未来 当前信息
快看:高颜值更有强悍性能 超频可解锁200W!影驰RTX 4060 Ti星曜OC显卡评测
砸手里了!推特估值大减:只剩马斯克收购价三分之一
马斯克高调收购“看走眼”?Twitter最新估值大跌近70%_世界时快讯
火狐也将放弃旧平台:Firefox 115将是支持Win7/8.1最后版本
环球新动态:MySQL之DDL表创建及DML数据处理操作
今日视点:直播软件源码,审核的“中坚力量”鉴黄功能!
环球快消息!福星股份董秘回复:截止5月29日公司股东人数约为5.48万
仓网升级,链通全国 顺丰供应链为小米打造原料央仓
性能超苹果A17 天玑9300卷出新高度:4个X4超大核详细规格出炉
【新视野】捷克一女婴出生2天就被母亲打耳洞 妈妈:应该是不疼的
微星发布全新Z790系主板:首次支持Wi-Fi 7 及5千兆网卡 世界热消息
又稳又圆 比亚迪仰望U8原地掉头为何这么慢?比快更难实现!
肯德基麦当劳儿童节玩具断货:黄牛线上倒卖 焦点热门
猛打价格战,手术机器人市场要变天了
柏子滋心丸怎么样