文章目录

  • 1. 链表
    • 1.1 链表的概念及结构
    • 1.2 链表的分类
    • 1.3 链表的实现
    • 1. 4 结尾

1. 链表

之前我们实现了顺序表,接下来来学习链表,并且理解顺序表和链表的区别

1.1 链表的概念及结构

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

注意:

  1. 从上图可看出,链式结构在逻辑上是连续的,但是在物理上不一定连续
  2. 现实中的节点一般都是从堆上申请出来的
  3. 从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续

假设在32为系统上,节点中值域为int类型,则一个节点的大小为8个字节,则也可能有下述链表:

1.2 链表的分类

实际中链表的结构非常多样,一下情况组合起来就有8种链表结构:

  1. 单向或者双向
  1. 带头或者不带头
  1. 循环或者非循环

以上情况进行随机组合,共有8种。
虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:

  1. 无头单向非循环链表结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
  2. 带头双向循环链表结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。

我们来实现这两种链表,那么其它链表就十分简单了。

1.3 链表的实现

和写顺序表一样,我们来写接口函数,来想一想链表的一些结构。

//首先我们得想一想节点的结构有哪一些?
typedef int SLTDataType;//想修改数据的类型在这里修改就足够了typedef struct SLTNode {//创建节点,节点有值,有下一个节点的地址SLTDataType val;struct SLTNode* next;//next有下个节点的地址
}SLTNode;//重命名,有助于节省代码
//想好了节点的结构,那我们得创建节点了,写个创建节点函数。
//将想要赋数据值传过来
SLTNode* BuySLTNode(SLTDataType x)//创建节点就要向内存申请空间,那么返回空间的地址就行了
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL)//如果开辟失败进行报错{perror("malloc fail");//开辟失败则返回错误信息return NULL;}newnode->next = NULL;//及时将第一个节点的next置为空,不能为野指针newnode->val = x;//将数据置为x   return newnode;
}
//申请完节点时,想一个问题,单链表能不能打印?我们知道顺序表是空的不能打印,顺序表是空的代表申请空间失败,但是单链表是空的可以打印
void SLTNodePrint(SLTNode* phead)//这里不用断言指针是否为空,因为空链表可以进行打印
{if (phead == NULL)return;SLTNode* cur = phead;//最好创建一个新的指针来接收地址while (cur)//循环遍历,一个一个数据打印,将cur指向下个节点,为空代表节点遍历完了{printf("%d->", cur->val);cur = cur->next;}printf("NULL\n");
}
//我们来进行数据的插入,首先是尾部插入节点
void SLTNodePushBack(SLTNode** pphead, SLTDataType x)
//这里使用二级指针是因为我们要修改一级指针的值。
{assert(pphead);//断言判断一级指针的地址不能为空SLTNode* newnode = BuySLTNode(x);//申请一个节点,返回地址if (*pphead == NULL)//如果为空链表直接将新的地址作为新的节点{*pphead = newnode;}else//链表不为空{SLTNode* tail = *pphead;while (tail->next){tail = tail->next;//一个循环遍历,找到最后一个节点}tail->next = newnode;//将新的节点接到最后一个节点上,自己成为最后一个节点}
}
//进行头部插入节点
//一样的,修改值就要传地址过来
void SLTNodePushFront(SLTNode** pphead, SLTDataType x)
{assert(pphead);//断言SLTNode* cur = *pphead;SLTNode* newnode = BuySLTNode(x);//头插申请一个新的节点newnode->val = x;newnode->next = cur;//让新的节点next指向之前的节点(*pphead) = newnode;//将指针指向的地址改变
}
//进行尾删
void SLTNodePopBack(SLTNode** pphead)
{assert(pphead);//断言if (*pphead == NULL)//要判断链表为空的情况return;SLTNode* tail = *pphead;SLTNode* prev = tail;while (tail->next)//找到最后一个节点{prev = tail;tail = tail->next;}free(tail);//删除链表时,要记得及时释放空间prev->next = NULL;//将前一个链表的next置为空,否则就是野指针
}
//进行头删
void SLTNodePopFront(SLTNode** pphead)
{assert(pphead);//断言if (*pphead == NULL)//当为空链表时,直接返回return;SLTNode* cur = *pphead;*pphead = cur->next;//将*pphead指向下一个节点的地址cur->next = NULL;//及时将指针置为空free(cur);}
//进行插入节点操作,我们在指定节点后插入一个新的节点
//为什么不在指定节点插入节点呢?因为单链表没有存储上个节点的地址,只存储了下个节点的地址,所以在指定节点插入节点会有点麻烦,我们就在指定节点后插入一个节点。
void SLTNodeInsertAfter(SLTNode* pos, SLTDataType x)
{assert(pos);//判断传的是不是空SLTNode* newnode = BuySLTNode(x);//申请一个新节点SLTNode* next = pos->next;//要记住后一个节点的位置pos->next = newnode;//在当前节点的next指向新节点newnode->next = next;//新节点的next指向指定节点的下一个节点
}
//进行删除操作
void SLTNodeEraseAfter(SLTNode* pos)
{assert(pos && pos->next);//要判断空或者只有一个节点的情况SLTNode* del = pos->next;pos->next = del->next;//要将指定节点的next指向被删除节点的next,要不然释放空间之后就是野指针了del->next = NULL;free(del);//记得释放空间
}
//进行数据的查找,找到了返回节点的地址
SLTNode* SLTNodeSerach(SLTNode*phead, SLTDataType x)
{assert(phead);//如果为空则不用找SLTNode* cur = phead;while (cur){if (cur->val == x)return cur;//找到了就返回当前节点的地址cur = cur->next;//指向下一个节点}return NULL;//没找到就返回空
}
//进行链表的销毁
void SLTNodeDestroy(SLTNode** pphead)
{assert(pphead);//断言if (*pphead == NULL)//空链表就不用销毁了return;SLTNode* cur = *pphead;SLTNode* del = *pphead;while (cur){del = cur;//一个要删除节点的地址cur = cur->next;//一个保存下个节点的地址del->next = NULL;free(del);//释放空间}
}

1. 4 结尾

当前我们学习单链表,下次学习双向链表,自己也可以去力扣网站上刷一些题,来巩固链表相关的知识,我也会不定时写一些我自己的解题看法
https://leetcode.cn/tag/linked-list/problemset/

o_0

龙吟虎啸,凤翥鸾翔,大丈夫之气象。—格言联璧

【数据结构】单链表的实现相关推荐

  1. 20175330 数据结构-单链表(选做)

    要求 参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 ``` public class MyList {     public static void mai ...

  2. php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...

    浅谈PHP链表数据结构(单链表) 链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个 ...

  3. 数据结构——单链表的C++实现

    数据结构--单链表的C++实现 \qquad单链表的创建.求长度.查找.插入和删除的C++实现. #include<iostream> using namespace std;//1.定义 ...

  4. php mysql 链表_浅谈PHP链表数据结构(单链表)

    链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(堆区, ...

  5. python 单链表是否有回路_(Python3)数据结构--单链表之判断链表是否有环

    前言 有Python基础 有数据结构单链表基础,没接触过的可以看下面链接 https://blog.csdn.net/sf9898/article/details/104946291 原理和实现 有一 ...

  6. 数据结构 —— 单链表(超详细图解 接口函数实现)

    系列文章目录 数据结构 -- 顺序表 数据结构 -- 单链表 数据结构 -- 双向链表 数据结构 -- 队列 数据结构 -- 栈 数据结构 -- 堆 数据结构 -- 二叉树 数据结构 -- 八大排序 ...

  7. C语言数据结构单链表链表

    数据结构–单链表 学习了顺序表,我们发现顺序表在向里面存放数据的时候很麻烦,比如我们要使用头插法存放一个数据到顺序表的时候,我们要将整个表都向后挪一位,这个操作就让人很难受.那么有没有一种结构可以让我 ...

  8. 数据结构——单链表(小白入门第二天)

    一.什么是单链表? 定义:每个结点 除了存放数据元素外,还要存储指向下一个节点的指针: 优点:不要求大片连续空间,改变容量方便: 缺点:不可随机存取,要耗费一定空间存放指针 局限性:无法逆向检索 二. ...

  9. 数据结构-单链表基本操作(C语言实现)

    参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉)​​ 单链表定义 单链表是线性表的链式存储,通过一组任意的存储单元来存 ...

  10. 数据结构 -- 单链表

          快要放假了,实在是待不住了,论文也看不下去,也没啥其他的事做,就写写常用的数据结构吧,正好下个学期就要找工作了,也是方便以后自己使用这些数据结构,好吧,这里实现的数据结构没有太多的错误控制 ...

最新文章

  1. 图集打包算法_UGUI打包图集工具-插件Simple Sprite Packer详解
  2. mysql 换行_教你如何用Python 连接 MySQL
  3. 苹果官方Instruments工具之Automation的介绍
  4. css padding效果,CSS Padding(填充)
  5. java swing 图层_用Swing制作精美的图层叠加图
  6. C#程序集Assembly学习随笔(增补版,附图)_AX
  7. 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...
  8. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT
  9. POJ3122-Pie
  10. wifi密码本 字典(免费)
  11. axure手机页面设计说明_Axure中移动端原型设计方法
  12. BZOJ2330【SCOI2011】糖果
  13. Android自定义日历控件
  14. 你是哪个级别?(工程师级别划分)
  15. 机器学习(五)贝叶斯分类器之估算收入阶层
  16. “Android开发3年老板嫌我工资高,把我辞了…”
  17. Mysql 1146错误 出现Table 'mysql.proc' doesn't exist ( 1146 )
  18. 【Git常用】之回滚
  19. word无法打开请去应用商店_爱不释手的PPT小工具,请收好
  20. web4——bugku

热门文章

  1. 微软官方的 Power Apps 介绍和视频 来自于youtub 网站
  2. 惠普暗影精灵8和惠普暗影精灵8 Plus 评测
  3. 尺子英语怎么读计算机英语怎么读,尺子的英文是什么用英语怎么说
  4. clickhouse 集群异常排查处理总结
  5. 【fpdlink】FPDlink接口---TI954解串器功能分析
  6. 游戏技巧-《七日杀》存档位置
  7. 通过java解析域名获得IP地址
  8. 挑逗新兴科技创业圈兴奋中枢,保险极客“百万医疗”搞事情
  9. B1029/A1084 旧键盘——测试点4
  10. Eclipse报错:The project: WMY which is referenced by the classpath, does not exist.