1.单链表的整表创建

顺序存储结构的创建,其实就是一个数组的初始化,即声明一个类型和大小的数组并赋值的过程。而单链表和顺序存储结构就不一样,他不像顺序存储结构那么集中,他可以很分散,是一种动态结构。对于每个链表来说,它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成。

所以,创建单链表的过程就是一个动态生成链表的过程。即从“空表”的初始状态起,一次建立各元素结点,并逐个插入链表。

单链表整表创建的算法思路:

(1)声明一节点p和计数器变量i;

(2)初始化一空链表L;

(3)让L的头结点的指针指向NULL,即建立一个带头结点的单链表;

(4)循环:生成一新结点赋值给P; 随机生成一数字赋值给p的数据域p->data; 将p插入到头结点与前一个新节点之间(头插法)。

头插法实现代码算法:

事实上,我们也可以不这样做。为什么不把新节点都放在最后呢?这种应该说才是排队的正常思维,及先来后到。这种方法又称为“尾插法”。

实现代码算法如下:

void CteateListTail( LinkList* L, int n)
{
LinkList p,r;
int i;
srand( time(0) );
*L = (LinkList) malloc ( sizeof(Node) );
r = *L;
for (i=0; i<n; i++)
{
p = (Node*)malloc( sizeof (Node) );
p->data = rand()%100+1;
r->next = p;
r = p; //保证r代表最后的结点
}
r->next = NULL;
}

2.单链表的整表删除

当我们不打算使用这个单链表时,我们需要把它销毁,其实也就是在内存中将他释放掉,以便于留出空间给其他程序或软件使用。
单链表整表删除的算法思路如下:
(1)声明一结点p和q;
(2)将第一个结点赋值给p;
(3)循环:将下一个结点赋值给q,释放p,将q赋值给p。
实现代码算法如下:

[cpp] view plaincopy
  1. <span style="font-size:18px;">Status ClearList( LinkList* L)
  2. {
  3. LinkList p,q;
  4. p = (*L)->next;
  5. while(!p)
  6. {
  7. q = p->next;
  8. free(p);
  9. p = q;
  10. }
  11. (*L)->next = NULL;
  12. return OK;
  13. }</span>

3.单链表结构与顺序存储结构优缺点

单链表结构

顺序存储结构

存储分配方式

采用链式存储结构,用一组任意的存储单元存放线性表元素

用一段连续的存储单元一次存储线性表的数据元素

时间性能

查找:O(n)
插入:O(1)
删除:O(1)

查找:O(1)
插入:O(n)
删除:O(n)

空间性能

不需要分配存储空间,只要有就可以分配,元素个数也不受限制

需要预分配存储空间,分配大了,浪费,分配小了,易发生上溢

经验性的结论:

(1)当线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除操作时,宜采用单链表结构。比如说,游戏开发中,对于用户注册的个人信心,除了注册时插入数据外,绝大多数情况都是读取,所以应该老吕用顺序存储结构。而游戏的玩家的武器或者装备列表,随着玩家的游戏过程中,可能会随时增加或删除,此时再用顺序存储就不太合适,应该偏向使用单链表结构。
(2)当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题。而如果事先知道线性表的大致长度,比如一年12个月,一周就是星期一至星期日共七天,这种用顺序存储结构效率会高很多。

4.循环链表

对于单链表,由于每个结点只存储向后的指针,到了尾标志就停止了向后的操作。这样,当中某一节点就无法找到它的前驱结点,难以查阅前方数据。

将单链表中终端结点的指针端由空指针改为指向头结点,就使整个链表形成一个环,这种头尾项链的单链表称为单循环链表,简称循环链表。

其实,循环链表和单链表的主要差异就在于循环的判断条件上,原来是判断p->next = NULL??,现在则是判断p->next是不是等于头结点,若不等于,则循环未结束。

在单链表中,我们有了头结点时,我们可以用O(1)的时间访问第一个结点,但是对于要访问的最后一个结点,却要用O(n)时间,因为我们需要将单链表全部扫描一遍。

有没有可能用O(1)的时间由链表指针访问到最后一个结点呢?当然可以,不过我们需要改造一下这个循环链表,不用头指针,而是用指向终端结点的尾指针来表示循环链表。

此时,查找开始结点和终端结点就很方便了。如果终端结点用尾指针rear指示,则查找终端节点是O(1),而开始结点,其实就是rear->next->next,其时间复杂度也为O(1)。

5.双向链表

在单链表中,有了next指针,这就使得我们要查找下一节点的时间复杂度为O(1)。可是,如果我们要查找的是上一节点的话,那最坏的时间复杂度就是O(n),因为我们每次都要从头开始遍历查找。

为了克服链表单向性这一弊端,相关研究人员设计了双向链表。双向链表是在单链表的每个节点中,在设置一个指向其前驱结点的指针域。所以,在双向链表中的结点都有两个指针域,一个是指向直接后继,一个是指向直接前驱。

大话数据结构:线性表(3)相关推荐

  1. 数据结构——线性表(2)

    上接 数据结构--线性表(1) 上文中介绍了线性表的顺序存储结构和单链表的介绍与代码实现,接下来,继续介绍线性表的链式存储 循环链表   在座的各位都很年轻,不会觉得日月如梭.可上了点年纪的人,比如我 ...

  2. 数据结构-线性表之用队列实现栈用栈实现队列

    文章目录 **********用队列实现栈 一:思路 二:实现 (1)结构体定义 (2)初始化和销毁 (3)进"栈" (4)出"栈" 三:代码 ******** ...

  3. 数据结构-线性表之带头结点的双向循环链表

    文章目录 前言 实现 (1)结构定义 (2)基本函数 (3)操作实现 测试 代码 前言 链表的类型有很多种(根据带头或不带头,循环或非循环等等),但是我们重点研究的只有两种,一种结构非常简单是无头单向 ...

  4. 数据结构摧毁线性表用c语言,[简述]数据结构-线性表(c语言实现)

    [简述]数据结构-线性表(c语言实现)second60 20180422 1. 线性表的定义 线性表是具有相同特性的数据元素的一个有限序列. 2. 线性表抽象数据类型描述 ADT  List { 数据 ...

  5. 王道数据结构线性表:有读者认为直接去掉p结点会造成断链?

    王道数据结构线性表:有读者认为直接去掉p结点会造成断链? 我用图解的方式来说明一下,文字有点多,看起来比较眼疼,但是内容不多,希望能对你有帮助. 书上的代码 解释 (ps:对上面解释的一点补充↓)

  6. 数据结构——线性表(三)

    数据结构--线性表(三) 作者:黑衣侠客 一.线性表的定义 线性表,从名字来看,可以发现,是具有像线一样性质的表 线性表:零个或多个数据元素的有限序列. 首先,它是一个序列,也就是说,元素之间是有顺序 ...

  7. 数据结构-线性表(严书代码实现)

    数据结构-线性表的顺序表示代码 //头文件内容实现 #ifndef SEQLIST_H_INCLUDED #define SEQLIST_H_INCLUDED #include<string.h ...

  8. 数据结构-线性表-思维导图+小结

    数据结构-线性表思维导图+小结 1 数据结构-第二章-线性表-思维导图 2 数据结构-第二章-线性表-习题小结 2.1 概念性习题小结 2.2 操作性习题小结 1 数据结构-第二章-线性表-思维导图 ...

  9. 数据结构线性表基本操作

    数据结构线性表基本操作 基本内容 线性表的顺序表示和实现 线性表的顺序存储表示 顺序表中基本操作的实现 1.顺序表的初始化 2.取值 3.查找 4.插入 5.删除 线性表的链式表示和实现 单链表的定义 ...

最新文章

  1. 分布式系统中节点之间的同步形成区块链
  2. 李彦宏乌镇谈人工智能:百度会很快和雄安宣布一个大的智能城市计划
  3. boost::mpl模块实现partition相关的测试程序
  4. php 过滤微信符号昵称,PHP方法处理微信昵称特殊符号过滤
  5. linux系统引导分区,揭秘Linux(二)——操作系统引导与硬盘分区
  6. 35解释器模式(Interpreter Pattern)
  7. Javascript Math.ceil与Math.round与Math.floor区别
  8. 商汤 CVPR 2021的优异成绩单!
  9. 再谈共相式GIS和ArcObjects
  10. 视讯稳定的程序在gpu 那台电脑上没有问题 在自己的电脑上一直报一个错误
  11. Mego(05) - Mego Tools使用教程
  12. [译] 如何用 Python 写一个 Discord 机器人
  13. 汇编心得(一)在32位机上实现64位数的相加
  14. 2019语言与智能技术竞赛
  15. usb抓包工具 安卓_android 抓包工具的使用
  16. HTML基础标签与相关案例
  17. C# 蓝牙编程(InTheHand.Net.Personal.dll-32feet),教程地址
  18. 世界上最经典的二十四句草根哲理
  19. 【开发教程3】AI语音人脸识别(会议记录仪/人脸打卡机)-CC3200简介
  20. Mac已安装应用启动台不显示

热门文章

  1. flex使用FlexPrintJob打印问题
  2. red hat 5 和 oracle
  3. Oracle 1204 RAC failover 测试 (五)
  4. nyoj 202红黑树 (搜索)
  5. android设置系统横屏方案
  6. 用 Scikit-Learn 和 Pandas 学习线性回归
  7. 【VS开发】Wix 安装教程
  8. XML学习笔记(二)-- DTD格式规范
  9. Webstorm 10.0.4 配置
  10. ORACLE AWR 和 ASH