《数据结构与算法基础 严蔚敏版》第二章 线性表

链接:https://pan.baidu.com/s/1z-kFKiNaezO0k2BWQ8l1Hw 
提取码:asdf

1.线性表的概念

定义:具有相同数据类型的n(n>=0)个数据元素(结点)a1,a2, ...an组成的有限序列

    • 其中数据元素的个数n定义为表的长度
    • 当n=0时称为空表
    • 将非空的线性表(n>0)记作:(a1,a2, ...an)
    • 这里的数据元素ai(1

同一线性表中的元素必定具有相同特性,数据元素间的关系是线性关系

特性:

    • 在非空的线性表,有且仅有一个开始结点a1,它没有直接前趋,而有且仅有一个直接后继a2;
    • 有且仅有一个终端结点an,它没有直接后继,而仅有一个直接前趋a(n-1);
    • 其余的内部节点ai(2

线性表是一种典型的线性结构

线性表P = (p0,p1,p2,...,pn)(每一项的指数i隐含在其系数pi的序号中

线性表R = (p0+q0,p1+q1,p2+q2,...,pm+qm,p(m+1),...,pn)

线性表S = ((1,0),(3,10000),(2,20000))

线性表P = ((p1,e1),(p2,e2),...,(pm,em))

线性表A = ((7,0),(3,1),(9,8),(5,17))

线性表B = ((8,1),(22,7),(-9,8))

  • 创建一个新数组c
  • 分别从遍历比较a和b的每一项
    • 指数相同,对应系数相加,若其和不为零,则在c中增加一个新项
    • 指数不相同,则将指数较小的项复制到c中
    • 一个多项式已遍历完毕时,将另一个剩余项依次复制到c中

线性表C = ((7,0),(3+8,1),(22,7),(9-9,8),(5,17))

多项式运算,数组与指针相比空间复杂度较高

线性表中数据元素的类型可以为简单类型,也可以为复杂类型

基本要求:掌握和理解线性表的定义和特性

2.顺序表:用顺序存储的方式实现线性表

(1)顺序表的存储结构

把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构

线性表顺序存储结构:依次存储,地址连续,中间没有空出存储单元,占用一片连续的存储空间

(2)顺序表的操作和实现

SqList L;

L.data = (ElemType*)malloc(sizeof(ElemType)*MaxSize);

假如malloc开辟了800个字节空间

如果ElemType是char类型,一个字节一个空间,划分为800块

如果ElemType是int类型,四个字节一个空间,划分为200块

(ElemType*):强制类型转换运算,返回一个指针

ElemType:线性表所存储元素的类型

malloc(m)函数:开辟m字节长度的地址空间,并返回这段空间的首地址

sizeof(x)运算:计算变量x的长度

free(p)函数:释放指针p所指变量的存储空间,即彻底删除一个变量

p要求是一个指针变量

需要加载头文件:

线性表L的初始化(参数引用):

销毁线性表L:

C语言:free(L.elem);

清空线性表L:

求线性表L的长度

判断线性表L是否为空:

顺序表的取值(根据位置i获取相应位置数据元素的内容)

时间复杂度O(1)

顺序表的查找:

    • 在线性表L中查找与指定值e相同的数据元素的位置
    • 从表的一端开始,逐个进行记录的关键字和给定值的比较。找到,返回该元素的位置序号,未找到,返回0

for语句:

时间复杂度:e = a,1次;e=b,2次;e=c,3次;....,e=g,7次;

while语句:

如果查找的元素是结构体,要自己设置条件语句来判断是否相等

C语言中,结构体的比较不能直接用"=="

(3)顺序表的效率分析

  • 平均查找长度ASL(Average Search Length):
    • 为确定记录在表中的位置,需要与给定值进行比较大关键字的个数的期望值叫做查找算法的平均查找长度。
      • 对含有n个记录的表,查找成功时:

Ci:找到第i个记录需比较的次数

Pi:第i个记录被查找的概率

假设每个记录的查找概率相等:Pi = 1/n,则

时间复杂度:O(n)

顺序表的插入:线性表的插入运算是指在表的第i(1

算法思想:

    1. 判断插入位置i是否合法
    2. 判断顺序表的存储空间是否已满,若已满返回ERROR
    3. 将第n至第i位的元素依次向后移动一个位置,空出第i个位置
    4. 将要插入的新元素e放入第i个位置
    5. 表长加1,插入成功返回OK

算法分析:

    • 若插入在尾结点之后,则根本无需移动(特别快)
    • 若插入在首结点之前,则表中元素全部后移(特别慢)
    • 若要考虑在各种位置插入(共有n+1种可能)的平均移动次数

插入的位置i与移动的元素数量x满足 i+x = n+1,x= n-i+1

时间复杂度为O(n)

顺序表的删除

时间复杂度T(n)=O(n)

(4)顺序表的应用

基本要求:掌握和理解顺序表的存储结构,会实现顺序表的基本操作,对顺序表的基本操作能够进行时间效率分析,能够用顺序表进行简单的应用设计和实现

b=&a:将a的地址赋值给指针b

b=*a:将a地址指向的内容赋值给b

3.链表:

    • 结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻
    • 访问时只能通过头指针进入链表,并通过每个结点的指针域依次向后顺序扫描其余结点,所以寻找第一个结点和最后一个结点所花费的时间不等
    • 线性表中数据元素(结点)在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理位置上不一定相邻

顺序表:随机存取 链表:顺序存取

(1)单链表的存储结构

(2)单链表的基本操作

单链表的定义:结点只有一个指针域的链表

LNode *p 相当于 LinkList p;

重要操作:

p=L; //p指向头结点

s = L->next; //s指向首元结点

p = p->next; //p指向下一结点

(3)单链表的应用:从一个结点出发只能找打后续的各个结点

不带头结点的单链表

初始化:

销毁单链表:

清空链表:

线性表L的初始化(参数引用):

销毁线性表L:

C语言:free(L.elem);

清空线性表L:

求线性表L的长度

判断线性表L是否为空:

顺序表的取值(根据位置i获取相应位置数据元素的内容)

时间复杂度O(1)

顺序表的查找:

    • 在线性表L中查找与指定值e相同的数据元素的位置
    • 从表的一端开始,逐个进行记录的关键字和给定值的比较。找到,返回该元素的位置序号,未找到,返回0

for语句:

时间复杂度:e = a,1次;e=b,2次;e=c,3次;....,e=g,7次;

while语句:

如果查找的元素是结构体,要自己设置条件语句来判断是否相等

C语言中,结构体的比较不能直接用"=="

(3)顺序表的效率分析

  • 平均查找长度ASL(Average Search Length):
    • 为确定记录在表中的位置,需要与给定值进行比较大关键字的个数的期望值叫做查找算法的平均查找长度。
      • 对含有n个记录的表,查找成功时:

Ci:找到第i个记录需比较的次数

Pi:第i个记录被查找的概率

假设每个记录的查找概率相等:Pi = 1/n,则

时间复杂度:O(n)

顺序表的插入:线性表的插入运算是指在表的第i(1

算法思想:

    1. 判断插入位置i是否合法
    2. 判断顺序表的存储空间是否已满,若已满返回ERROR
    3. 将第n至第i位的元素依次向后移动一个位置,空出第i个位置
    4. 将要插入的新元素e放入第i个位置
    5. 表长加1,插入成功返回OK

算法分析:

    • 若插入在尾结点之后,则根本无需移动(特别快)
    • 若插入在首结点之前,则表中元素全部后移(特别慢)
    • 若要考虑在各种位置插入(共有n+1种可能)的平均移动次数

插入的位置i与移动的元素数量x满足 i+x = n+1,x= n-i+1

时间复杂度为O(n)

顺序表的删除

时间复杂度T(n)=O(n)

(4)顺序表的应用

基本要求:掌握和理解顺序表的存储结构,会实现顺序表的基本操作,对顺序表的基本操作能够进行时间效率分析,能够用顺序表进行简单的应用设计和实现

b=&a:将a的地址赋值给指针b

b=*a:将a地址指向的内容赋值给b

3.链表:

    • 结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻
    • 访问时只能通过头指针进入链表,并通过每个结点的指针域依次向后顺序扫描其余结点,所以寻找第一个结点和最后一个结点所花费的时间不等
    • 线性表中数据元素(结点)在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理位置上不一定相邻

顺序表:随机存取 链表:顺序存取

(1)单链表的存储结构

(2)单链表的基本操作

单链表的定义:结点只有一个指针域的链表

LNode *p 相当于 LinkList p;

重要操作:

p=L; //p指向头结点

s = L->next; //s指向首元结点

p = p->next; //p指向下一结点

(3)单链表的应用:从一个结点出发只能找打后续的各个结点

不带头结点的单链表

初始化:

销毁单链表:

清空链表:

判断是否为空

带头结点的单链表

初始化单链表

L = new LNode;或者L = (LinkList)malloc (sizeof(LNode));

判断是否为空

按位序插入(带头结点)

其中s->next = p->next,p->next = s;的顺序不能颠倒

平均时间复杂度T(n)=O(n)

不带头结点的单链表

头插法:

尾插法:

删除元素带头结点

按位查找(带头结点)

取值:

按值查找

按值查找获取该数据位置序号:

求表长

(4)循环单链表:,首尾相接的链表。从一个结点出发可以找到其他任何一个结点

循环单链表初始化

判断是否为空

带尾指针的循环链表合并:

(5)双向链表:结点有两个指针域的链表

双链表的初始化

判断双链表是否为空

双链表的插入

删除后继结点

销毁一个双链表

双链表的遍历

(6)静态链表

初始化

基本要求:掌握和理解单链表的存储结构,能够实现单链表的基本操作,能够使用单链表实现初步应用,能够分析单链表操作的时间复杂度,掌握和理解循环单链表,双向链表和静态链表的概念和特点,能够实现简单的循环单链表,双向链表和静态链表的基本操作

顺序表:

优点:支持随机存取、存储密度高

缺点:大片连续空间分配不方便,改变容量不方便

链表:

优点:离散的小空间分配方便,改变容量方便

缺点:不可随机存取,存储密度低

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值