目录:

一:什么是单链表

(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. 链表——单链表、单向循环链表、双向链表

    目录 1 单链表 节点实现 单链表操作 单链表实现 测试 链表与顺序表对比 2 单向循环链表 操作 实现 测试 3 双向链表 操作 实现 测试 1 单链表 单向链表也叫单链表,是链表中最简单的一种形式 ...

  3. 数据结构上机-尾、头插法建立单链表-单链表遍历C语言完整代码实现

    点击此处跳转视频链接:数据结构上机-尾.头插法建立单链表-单链表遍历C语言完整代码实现

  4. 数据结构学习(C++)——单链表应用(一元多项式【1】) (转)

    数据结构学习(C++)--单链表应用(一元多项式[1]) (转)[@more@] 总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了.但是很不幸,如果你和我一样看的是那本书,到 ...

  5. 建立单链表 单链表的插入_单链列表插入

    建立单链表 单链表的插入 All possible cases: 所有可能的情况: Inserting at beginning 开始插入 Inserting at the ending 在末尾插入 ...

  6. 数据结构之链表--单链表

    Hello,大家好!好久不见了,之前一直在忙于一些琐事,最近半个月内会将数据结构的各种数据结构实现出来,一个挺有意思的东西. 这次我将要介绍的是链表.链表有单链表,单向循环链表,双向链表,双向循环链表 ...

  7. Java数据结构第三个-链表-单链表

    数据结构-单链表 一.介绍 链表是有序的列表,但是它在内存中是存储如下: 小结: 链表是以节点的方式来存储,是链式存储. 每个节点包含 data 域, next 域:指向下一个节点. 如上图:发现链表 ...

  8. 数据结构初阶——第三节-- 单链表

    链表 1. 链表的概念及结构 1.1 链表的概念及结构 1.2 链表的实现(无头+单向+非循环链表增删查改实现) 1. 动态申请一个节点 2. 单链表打印 3. 单链表尾插 1. 找尾用 tail - ...

  9. 【数据结构】线性表之单链表

    目录 一.链表的概念 1.概念 2.分类 3.重点 二.单链表模拟实现 1.准备 2.头插法 3.尾插法 4.指定下标插入 5.遍历 6.删除第一次出现的元素key 7.删除所有的key 8.双指针删 ...

最新文章

  1. pandas使用query函数删除dataframe中两个数据列加和小于某一特定值的数据行(removing rows based on multiple dataframe column value
  2. SAP MRKO Error - For document type RE, an entry is required in field Reference -
  3. 自己动手实现的 Spring IOC 和 AOP - 上篇
  4. 防火墙虚拟系统互访配置实例
  5. 《Java和Android开发学习指南(第2版)》——第1章,第1.5节本章小结
  6. 使用 Fiddler Hook 报错:502 Fiddler - Connection Failed
  7. linux rm 文件找回_Linux下用rm删除的文件的恢复方法
  8. 机器学习:sklearn模型指标和特征贡献度查看
  9. git push时 please tell me who you are 或 git fatal: empty ident name (for <>) not llowed
  10. python eel 多线程_Python的一个轻量级桌面GUI开发第三方库:Eel
  11. 自学python网站-杭州python自学网站
  12. iOS 並行編程初步
  13. DDR设计之地址和容量计算、Bank理解
  14. gaussdb 优化建议
  15. HihoCoder - 1847
  16. 【墨天轮专访第四期】华为云GaussDB:发挥生态优势,培养应用型DBA
  17. python库下载超时_Python的请求库超时,但是得到了响应
  18. canvas画地图运动轨迹【自己定位】
  19. 2003-2019年各省数据GDP、人均GDP、城镇化率、年末人口数、人口自然增长率
  20. 【智能制造】智能制造解决方案

热门文章

  1. 【刚好遇见Kotlin】使用Kotlin开发——搭建Kotlin 编译环境
  2. TiDB 在 2021 易车 818 汽车狂欢节的应用
  3. 力扣算法学习计划打卡:第五天
  4. C++基础面试(持续更新~~~)
  5. 一个图层隶属下一个图层
  6. Multisim14.0 简易交通灯设计
  7. 英语口语学习(13-14)
  8. ifconfig eth0 down禁用网卡操作致使ssh连接不上,ping不通机器
  9. Android Google Map实例 - 在地图和卫星图之间切换(Android mapview)
  10. 关于RTT、TTL、MSL的概念解释