数据结构:(c实现)单向链表,单链表的头增,尾增,头删,尾删,任意位置的删除与插入。
目录:
一:什么是单链表
(1)单链表节点数据结构
(2)单链表结构物理图解
二:单链表的几种接口函数的实现
(1)单链表的尾插函数(顺序插入)
(2)单链表的尾删函数
(3)单链表的头增函数
(4)单链表的头删函数
(5)单链表查询函数
(6)单链表任意位置插入数据
(7)单链表任意位置删除函数
一:什么是单链表
(1)单链表节点数据结构
链表一般分成两块:一部分存储数据,另一部分存储下一个节点的地址。
(2)单链表结构物理图解
链表与顺序表不同,链表的存储形式不是一块物理地址连续的空间。而是在内存中随机存储。需要存入一个新的数据时,就malloc开辟一个新的节点。并将新开辟的空间的地址放置到上一个节点的指针中。 再将该节点的指针赋NULL。
而plist就是这个单链表的头,它存储的就是该链表的表头的地址。
二:单链表的几种接口函数的实现
(1)单链表的尾插函数(顺序插入)
1:因为是从该链表的尾部插入数据,所以先需要找到尾。(找尾)
尾部唯一的标识就是,该节点的指针域存储的数据为NULL(不指向任何空间)。那么我们可以通过这个条件,去遍历这个链表,找到尾。
void SList_push_tail(SList* *ps, SListdata tmp)
{//如果该链表还是空的SList* cur = (*ps);SList* newnode = (SList*)malloc(sizeof(SList));newnode->datd = tmp;newnode->next = NULL;if ((*ps) == NULL){(*ps) = newnode;return;}//说明已经有了一个或者多个节点//此时就需要找尾else{while (cur->next != NULL){cur = cur->next;}//出这个循环时,说明cur->next中存储的是NULL//找到尾了cur->next = newnode;}
}
(2)单链表的尾删函数
将该链表的最后一个节点删除,那么同样的,我们也需要遍历该链表,找到尾。!!
但是在删除的同时,也需要将表尾的前一个节点的指针置NULL。但是对于单链表来说,如果我使用一个指针,遍历到了链表尾部,那就不能通过尾部的这个节点,找到上一个节点。
所以我们使用两个指针去遍历这个顺序表,指针ptr向后遍历,发现这个节点不是表尾,就将这个节点地址交给cur,自己去下一个节点。当ptr->next==NULL时,直接释放该空间,并将cur->next置空。(当然还需要考虑只有一个节点,或者没有节点的情况。)
void SList_pop_tail(SList* *ps)
{SList* cur = *ps;SList* perv = *ps;if (*ps == NULL){return;}else{if ((*ps)->next == NULL){//只有一个节点free(*ps);*ps = NULL;}//找尾else{while (perv->next != NULL){cur = perv;perv = perv->next;}free(perv);cur->next = NULL;} }
}
(3)单链表的头增函数
单链表的头增,因为在定义时,我们始终有一个指针,指向该链表的表头(我称其为表头指针)。所以我们只需要将新生成的空间地址传给这个表头即可,并将刚才的表头指针指向的那个节点地址,交给现在的表头。
//头增
void SList_push_head(SList* * ps, SListdata tmp)
{SList* cur = *ps;SList* newnode = (SList*)malloc(sizeof(SList));newnode->datd = tmp;newnode->next = NULL;if (cur == NULL){//没有节点(*ps) = newnode;}else{newnode->next = cur;(*ps) = newnode;}
}
(4)单链表的头删函数
先将表头指针指向该链表的第一个节点,然后将第一个节点的空间直接释放掉。就可以完成操作。
//头删
void SList_pop_head(SList* * ps)
{SList* cur = *ps;if (cur == NULL){//如果没有节点return;}//如果只有一个节点else if (cur->next == NULL){free(cur);(*ps) = NULL;}else//有一个以上节点{(*ps) = cur->next;free(cur);}
}
(5)单链表查询函数
遍历查询单链表中的数据,查询到了,返回该数据的地址,否则返回空指针。
//查询函数,查询到这个数据的节点,返回该节点的地址
SList* SList_chage(SList* ps, SListdata tmp)
{if (ps == NULL){return NULL;}else{while (ps->next != NULL){//有多个节点if (ps->datd == tmp){return ps;}ps = ps->next;}if (ps->datd == tmp){//最后一个节点前面插入return ps;}}return NULL;
}
(6)单链表任意位置插入数据
根据上面的查询函数去实现,先找到哪个数据前面插入数据。找到了就插入,找不到默认尾插。(当然可以自己设置
//在数据3前面插入一个10
SList* pos=SList_chage(plist, 3);if (pos != NULL){SList_push_any(&plist, pos, 10);}else{SList_push_tail(&plist, 10);}
//上面是主函数中的代码,找到了就在该数据前面插入,找不到默认尾插。//下面是任意插入函数的代码void SList_push_any(SList* * ps, SList* pos, SListdata tmp)
{SList* cur = *ps;SList* ptr = *ps;SList* newnode = (SList*)malloc(sizeof(SList));newnode->datd = tmp;newnode->next = NULL;if (cur == NULL){printf("目的空间地址错误\n");return;}else{if (cur == pos){//头插SList_push_head(ps, tmp);return;}else{while (cur->next != NULL){if (cur->next == pos){newnode->next = pos;cur->next = newnode;return;}ptr = cur;cur = cur->next;}}}
}
(7)单链表任意位置删除函数
还是需要利用到之前的数据查询函数,当查询到了那个数据,就去删除那个节点,并将该节点前后两个节点链接起来。
//查询函数,写在主函数中测试的pos = SList_chage(plist, 18);if (pos != NULL){SList_pop_any(&plist, pos);}//删除任意位置
void SList_pop_any(SList** ps, SList* pos)
{SList* cur = *ps;SList* ptr = *ps;if (cur == NULL){//空链表printf("目的空间地址错误\n");return;}else{if (cur == pos){ //头删SList_pop_head(ps);}else{while (cur->next != pos){ptr = cur;cur = cur->next;}ptr = cur;cur = cur->next;ptr->next = cur->next;free(cur);}}
}
数据结构:(c实现)单向链表,单链表的头增,尾增,头删,尾删,任意位置的删除与插入。相关推荐
- 数据结构与算法笔记(三)—— 链表(单链表、循环链表、双向链表)
一.前沿 1.1.为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活. 链表结构可以充分利用计算机内存空间,实现灵活的内 ...
- 链表——单链表、单向循环链表、双向链表
目录 1 单链表 节点实现 单链表操作 单链表实现 测试 链表与顺序表对比 2 单向循环链表 操作 实现 测试 3 双向链表 操作 实现 测试 1 单链表 单向链表也叫单链表,是链表中最简单的一种形式 ...
- 数据结构上机-尾、头插法建立单链表-单链表遍历C语言完整代码实现
点击此处跳转视频链接:数据结构上机-尾.头插法建立单链表-单链表遍历C语言完整代码实现
- 数据结构学习(C++)——单链表应用(一元多项式【1】) (转)
数据结构学习(C++)--单链表应用(一元多项式[1]) (转)[@more@] 总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了.但是很不幸,如果你和我一样看的是那本书,到 ...
- 建立单链表 单链表的插入_单链列表插入
建立单链表 单链表的插入 All possible cases: 所有可能的情况: Inserting at beginning 开始插入 Inserting at the ending 在末尾插入 ...
- 数据结构之链表--单链表
Hello,大家好!好久不见了,之前一直在忙于一些琐事,最近半个月内会将数据结构的各种数据结构实现出来,一个挺有意思的东西. 这次我将要介绍的是链表.链表有单链表,单向循环链表,双向链表,双向循环链表 ...
- Java数据结构第三个-链表-单链表
数据结构-单链表 一.介绍 链表是有序的列表,但是它在内存中是存储如下: 小结: 链表是以节点的方式来存储,是链式存储. 每个节点包含 data 域, next 域:指向下一个节点. 如上图:发现链表 ...
- 数据结构初阶——第三节-- 单链表
链表 1. 链表的概念及结构 1.1 链表的概念及结构 1.2 链表的实现(无头+单向+非循环链表增删查改实现) 1. 动态申请一个节点 2. 单链表打印 3. 单链表尾插 1. 找尾用 tail - ...
- 【数据结构】线性表之单链表
目录 一.链表的概念 1.概念 2.分类 3.重点 二.单链表模拟实现 1.准备 2.头插法 3.尾插法 4.指定下标插入 5.遍历 6.删除第一次出现的元素key 7.删除所有的key 8.双指针删 ...
最新文章
- pandas使用query函数删除dataframe中两个数据列加和小于某一特定值的数据行(removing rows based on multiple dataframe column value
- SAP MRKO Error - For document type RE, an entry is required in field Reference -
- 自己动手实现的 Spring IOC 和 AOP - 上篇
- 防火墙虚拟系统互访配置实例
- 《Java和Android开发学习指南(第2版)》——第1章,第1.5节本章小结
- 使用 Fiddler Hook 报错:502 Fiddler - Connection Failed
- linux rm 文件找回_Linux下用rm删除的文件的恢复方法
- 机器学习:sklearn模型指标和特征贡献度查看
- git push时 please tell me who you are 或 git fatal: empty ident name (for <>) not llowed
- python eel 多线程_Python的一个轻量级桌面GUI开发第三方库:Eel
- 自学python网站-杭州python自学网站
- iOS 並行編程初步
- DDR设计之地址和容量计算、Bank理解
- gaussdb 优化建议
- HihoCoder - 1847
- 【墨天轮专访第四期】华为云GaussDB:发挥生态优势,培养应用型DBA
- python库下载超时_Python的请求库超时,但是得到了响应
- canvas画地图运动轨迹【自己定位】
- 2003-2019年各省数据GDP、人均GDP、城镇化率、年末人口数、人口自然增长率
- 【智能制造】智能制造解决方案