链表是由一个个结点构成,而每一个结点都是由存储数据的数据域以及存储下一个结点地址的地址域两部分构成。

链表的一大优点就是,可以在任意两个数之间毫无限制的插入无限多的数据。在很多时候,我们都需要对数据做个查找工作,就比如,一个班的同学去上课,结果老师发现人数不对,于是就开始点名,点到后来发现某某某同学没有到,这就是典型的数据查找。那么如何实现对链表的数据元素的查找呢?

比如,我想知道链表的第5个元素的值是多少,我应该怎么做呢?由于,链表是依靠地址来查找数据的,那比如说链表的第一个结点的数据域中保存了某一个元素值,而它的地址域中则保存了下个结点的地址,也就是说,每一个结点的地址都被保存在上一个结点的地址域中。那么,很明显,第5个元素的地址被保存在了第4个元素的地址域中,那么,也就是说,我想知道第5个元素在哪个位置,我首先得知道第四个元素在什么位置,那么以此类推,就需要知道第1个元素的存储位置,也就是说,我想要知道第5个元素的存储的位置,我首先就得从链表的头部开始查找。那么,我想知道链表的第i个元素的位置,我还是得从表头开始查起。很明显,想要知道第i个元素的位置,就需要申明一个循环变量j以及一个指针变量p来遍历链表。

当然,想要查找链表的元素,前提还得是链表不能为空,如果为空,那元素怎么可能查得到。这就好比,一个班的同学都没去上课,那老师还用的着点名吗,根本就没有点名的必要性了。

那么,查找单链表的一个元素,代码如下:

Status GetElem ( LinkList L, int i, ElemType e *e )
{int j;LinkList p;j = 1;p = L->next;while ( p != NULL && j < i ){p = p->next;   //p指向下一个结点++j;}if ( p == NULL || j > i )return ERROR;*e = p->data;}

接下来,就是关于单链表的元素插入了。假设,一个链表有5个元素,也就是它有1~5这五个结点,那么我想在第4个结点之前插入一个新的元素,那我该怎么做呢?也就是说,这个元素我会插入在第3和第4个元素之间。很明显的一点就是,第4个结点的地址保存在第3个结点的后继指针中,那么,我想插入这个结点s,那岂不是我首先要把第4个结点的地址保存下来,也就是说我首先要向第3个结点索要第4个结点的地址,然后,再把s的地址给第3个结点p。

代码如下:

s->next = p->next;
p->next = s;

因为,之前我们是假设有5个元素,并且是假设在第4个元素之前插入数据,那假设我要在第6个元素之前插入数据,那么怎么办呢?很多人就说了,这不可能的,因为,一共就5个数据,你怎么插入在第6个元素之前,你这不是扯淡吗。没错,但是,程序并不知道,如果,我们从键盘输入的是第6个数据,那么,毫无疑问的程序就会出现bug。所以,我们在做元素的插入之前,我们的判断插入的位置合不合理。如果不合理,那么我们就返回一个ERROR值。代码如下:

Status ListInsert ( LinkList *L, int i, ElemType e )
{int j;LinkList p;p = *L;j = 1;while ( p != NULL && j < i ){p = p->next;++j;}if ( p == NULL || j > i )return ERROR;s = ( LinkList ) malloc ( sizeof ( struct Node ) );  //动态申请一个结点s->data = e;s->next = p->next;p->next = s;return OK;}

最后,就是单链表元素的删除操作。与元素的插入操作类似,我们在删除之前要判断它删除点是否有问题,如果删除点有问题,那么就返回一个ERROR。

那么,我们应该如何删除一个结点元素呢?假设我们仍然有5个结点元素,现在我们想要删除第3个结点的元素。那么我们应该如何做呢?首先,我们很清楚的是,第3个结点的后继指针中保存着第4个结点的地址,如果,删除第3个结点,那么岂不是第4个结点的地址也跟着丢失了,那岂不是这根链表就断开来了。所以,在删除第3个结点之前,就得把第3个结点的后继指针中的值保存下来。然后,将第3个结点的地址保存在第2个结点的后继指针中。代码如下:

q = p->next;
p->next = q->next;

其实,以上两条语句可以用一条语句来代替,

p->next = p->next->next;

最后,删除了结点之后,还得释放该结点。

代码如下:

Status ListDelete ( LinkList *L, int i, ElemType *e )
{int j;LinkList p;LinkList q;p = *L;j = 1;while ( p != NULL && j < i ){p = p->next;++j;}if ( p == NULL || j > i )return EEROR;q = p->next;p->next = q->next;free ( q );return OK;}

到这里,基本上,对单链表的插入,删除,以及元素的获取就差不多了。事实上,对单链表的操作并不复杂,只要,对几个关键数据进行预先判别,那么,出现bug的几率就会降低很多。

转载于:https://blog.51cto.com/chen0547/1965926

单链表的读取、插入与删除相关推荐

  1. 单链表的基本操作---插入,删除,交,并,相邻元素的交换等

    这个链表是带有表头的单链表.实现链表的一些规范操作,初始化,插入,删除等.包括两个头文件list.h,fatal.h,库函数list.c,测试函数testlist.c.头文件放的都是函数声明,库函数l ...

  2. 单链表的读取,插入与删除

    一:单链表的读取 获得链表第i个数据,算法思路: 1.声明一个指针p指向链表的第一个结点,初始化j从1开始: 2.j<i时,遍历链表,p指针后移,j+1: 3.到链表尾部p为空或者j>i时 ...

  3. SDUT_2122 数据结构实验之链表七:单链表中重复元素的删除

    提交代码 数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Proble ...

  4. python链表删除尾部节点_python单链表中如何查找和删除节点?

    在之前的文章[python单链表中如何插入和输出节点?]中给大家介绍了单链表是什么,以及如何进行添加节点.输出所以节点.下面本篇文章给大家介绍如何查找和删除节点,希望对大家有所帮助. 如何从单链表中查 ...

  5. 数据结构实验之链表七:单链表中重复元素的删除

    Description 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个). Input 第一行输入元素个数 n (1 <= n &l ...

  6. 7-6 数据结构实验之链表七:单链表中重复元素的删除 (20 分)

    按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个). 输入格式: 第一行输入元素个数 n (1 <= n <= 15): 第二行 ...

  7. python 单链表添加节点_黄哥Python:单链表的尾部插入方法

    单链表的尾部插入方法: 1.先判断头结点是不是为None 2.设置一个当前结点node,循环下一个结点,当node.next 为None 时,就到尾部,也就是找到插入点了. 请看下面Python 代码 ...

  8. 单链表的基本操作-插入结点、删除结点、新建链表、查找结点位置

    ** C语言新手小白的学习笔记-------------目前持续更新中 ** 本人90后电气工程及其自动化大学生,大二开始接触C语言,写过前端,Python,但是都不精通,通过许多认识后明白了自身的许 ...

  9. 数据结构与算法——链式存储(链表)的插入及删除

    持续分享嵌入式技术,操作系统,算法,c语言/python等,欢迎小友关注支持 上篇文章我们讲述了链表的基本概念及一些查找遍历的方法,本篇我们主要将一下链表的插入删除操作,以及采用堆栈方式如何创建链表. ...

最新文章

  1. 针孔相机模型之再学习
  2. Java泛型深入理解小总结
  3. java访问远程共享文件
  4. 【Python科学计算系列】概率论与数理统计
  5. S5PV210裸机之GPIO
  6. linux普通用户配置自己的python环境
  7. c语言中宽字节,fgetwc读取的是宽字节么?
  8. 经典算法大全之费式数列
  9. EA量化交易是什么?外汇EA量化交易可靠吗?
  10. C# 滑块/滑杆/拖动条控件trackBar
  11. 白屏时间first paint 和可交互时间dom ready的关系
  12. 小目标检测算法SNIPER—— SNIP的实战版本 (目标检测)(two-stage)(深度学习)(Arvix 2018)
  13. 让Flows感知生命周期
  14. SQL注入--报错和盲注
  15. 软件工程一位大三学生成功上大学的案例
  16. js中回调函数的理解 举例说明js回调函数
  17. 工作的IT公司面临倒闭,该怎么办?
  18. android studio文件存储路径,配置Android Studio的缓存文件路径(释放你的C盘)
  19. 全球气象数据下载总结-CRU数据,ERA数据NCEP-2数据
  20. Autodesk 3ds Max 2012 安装破解图文教程

热门文章

  1. VB添加listbox 的水平卷动轴
  2. 首个中国AI芯片收购案完成:深鉴创立2年后并入赛灵思
  3. 我是京东智能配送机器人,已抵达您的楼下
  4. 全球AI芯片企业排行:英伟达第1,华为第12(七家中国公司入围Top24)
  5. 无监督学习才不是“不要你管”
  6. 厉害了!浙大研发出踹不倒四足机器人“绝影”,中国版波士顿动力来了
  7. lvs + keepalived + nginx 实现高可用
  8. python获取指定日期的前N天日期和后N天日期
  9. Linux -单用户模式(忘记Linux的root密码)
  10. 洛谷——P1680 奇怪的分组