大话数据结构:线性表(3)

原创 2016年05月31日 16:51:30

1.单链表的整表创建

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

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

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

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

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

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

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


头插法实现代码算法:

void CreateListHead( LinkList* L, int n )
{
LinkList p;
int i;
srand( time(0) ); //初始化随机数种子
*L =(LinkList)malloc (sizeof(Node));
(*L)->next = NULL;
for(i=0;i<n;i++)
{
p = ( LinkList )malloc( sixeof(Node) );
p->data = rand()%100+1;
p->next = (*L)->next;
(*L)->next = 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 plain copy
 在CODE上查看代码片派生到我的代码片
  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),因为我们每次都要从头开始遍历查找。

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



版权声明:本文为博主原创文章,未经博主允许不得转载。

大话数据结构之三:线性表

1.定义: 线性表表示0个或者多个数据元素的有限序列 线性表的特性有: 除第一个元素外,每一个元素均有一个直接前驱 出最后一个元素外,每一个元素均有一个直接后继 2.线性表抽象数据类型 ...
  • longshengguoji
  • longshengguoji
  • 2013年06月27日 23:38
  • 3487

大话数据结构3线性表

1、线性表:零个或多个数据元素的有限序列 2、线性表元素的个数n(n > 0)定义为线性表的长度,当n=0时,称为空表 3、线性表的抽象数据类型: ADT 线性表 Data 线性表的数据对象...
  • Echo_Ana
  • Echo_Ana
  • 2016年11月20日 22:11
  • 202

大话数据结构:线性表(3)

1.单链表的整表创建 顺序存储结构的创建,其实就是一个数组的初始化,即声明一个类型和大小的数组并赋值的过程。而单链表和顺序存储结构就不一样,他不像顺序存储结构那么集中,他可以很分散,是一种动态结构...
  • shenziheng1
  • shenziheng1
  • 2016年08月25日 22:08
  • 263

数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)

一,线性表顺序存储 #include #include #include #include #include #include #include #define ...
  • acm_hmj
  • acm_hmj
  • 2016年04月07日 17:50
  • 1331

大话数据结构与算法:基础篇

1.数据结构的重要性         数据结构是计算机软件相关专业的基础课程,几乎可以说,要想从事编程工作,无论是否是科班出身(比如我,标准的非科班人员,我是学医的,哈哈)都不可以绕过数据结构与算法...
  • shenziheng1
  • shenziheng1
  • 2016年05月26日 13:52
  • 1270

《大话数据结构》读书笔记(一)

学科起源数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。 程序设计的本质是对确定的问题选择一种好的结构,加上设计一种好的算法, 程序设计 = 数...
  • gao_yu_long
  • gao_yu_long
  • 2017年06月06日 15:25
  • 206

[数据结构]程杰《大话数据结构》单链表代码

#include "stdio.h" #include "string.h" #include "ctype.h" #include "stdlib.h" #include "math.h" #inc...
  • ilikeprograming
  • ilikeprograming
  • 2013年10月01日 23:56
  • 2033

大话数据结构小结1

由于图片看不了,大家可以看这个百度云笔记,我看完大话数据结构整理的,里面有些内容我还不太明白,等过段时间还需要仔细回顾回顾。点击打开链接 一.数据及数据结构的基本概念 数据结构...
  • aiyingwo
  • aiyingwo
  • 2015年11月19日 11:02
  • 697

大话数据结构十一:字符串的模式匹配(KMP算法)

1. KMP算法简介: kmp算法是一种改进的字符串匹配算法,相比朴素算法,KMP算法预先计算出了一个哈希表,用来指导在匹配过程中匹配失败后尝试下次匹配的起始位置,以此避免重复的读入和匹配过程。这个...
  • zdp072
  • zdp072
  • 2013年10月27日 09:14
  • 2734

大话数据结构——图

图(Graph)是由定点的又穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。一、各种图的定义图按是否有方向分可分为有向图和无向...
  • u013159040
  • u013159040
  • 2016年06月14日 16:31
  • 591
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大话数据结构:线性表(3)
举报原因:
原因补充:

(最多只允许输入30个字)