数据结构 线性表

本文介绍了线性表的概念,包括顺序表和链表两种存储方式。顺序表允许随机访问元素,但插入和删除操作效率低。链表则克服了顺序表的缺点,动态分配空间,插入和删除操作更灵活,但额外需要存储指针。文中还通过实例展示了如何在链表中进行插入和合并操作,并讨论了各种链表结构如单链表、循环链表和双向链表的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、

顺序表

线性表的定义:  线性表是一种最简单的线性结构。

1、线性结构的基本特征为: 线性结构是 一个数据元素的有序(次序)集

(1).集合中必存在唯一的一个“第一元素”;(2).集合中必存在唯一的一个 “最后元素” ;(3).除最后元素在外,均有 唯一的后继;(4).除第一元素之外,均有 唯一的前驱。

2、线性表上的基本操作有:
⑴  创建线性表:CreateList()
⑵  求线性表的长度:LengthList(L)      
(3)  按值查找:SearchList(L,x),x是给定的一  个数据元素。
(4)  插入操作:InsList(L,i,x)
(5)  删除操作:DelList(L,i)
(6)  显示操作:ShowList(L)

例1:假设:有两个集合 A 和 B 分别用两个线性表 LA 和 LB 表示,即:线性表中的数据元素即为集合中的成员。现要求一个新的集合A=A∪B。

即要求对线性表作如下操作:
    扩大线性表 LA,将存在于线性表LB 中而不存在于线性表 LA 中的数据元素插入到线性表 LA 中去。

(1)从线性表LB中依次察看每个数据元素;GetElem(LB, i)→e(2)依值在线性表LA中进行查访; LocateElem(LA, e, equal( ))3)若不存在,则插入之 ;ListInsert(LA, n+1, e)

void union(List &La, List Lb) {
    La_len = ListLength(La);    // 求线性表的长度
    Lb_len = ListLength(Lb);   

for (i = 1;  i <= Lb_len;  i++) {

GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给e
    if (!LocateElem(La, e, equal( )) ) 
       ListInsert(La, ++La_len, e);
      // La中不存在和 e 相同的数据元素,则插入之

}

} // union

例2:已知一个非纯集合 B,试构造一个纯集合 A,使 A中只包含 B 中所有值各不相 同的数据元素。


3、顺序表的优缺点?

优点:顺序存储结构的线性表是可以随机存取其中的任意元素。
缺点:
(1)数据元素最大个数需预先确定,
(2)插入与删除运算的效率很低。
(3)存储空间不便于扩充

小结:

线性表的顺序存储结构中任意数据元素的存储地址可由公式直接导出,因此顺序存储结构的线性表是可以随机存取其中的任意元素。
     但是,顺序存储结构也有一些不方便之处,主要表现在:
(1)数据元素最大个数需预先确定,使得高级程序设计语言编译系统需预先分配相应的存储空间;
(2)插入与删除运算的效率很低。为了保持线性表中的数据元素顺序,在插入操作和删除操作时需移动大量数据。对于插入和删除操作频繁的线性表、将导致系统的运行速度难以提高。
(3)存储空间不便于扩充。当一个线性表分配顺序存储空间后,若线性表的存储空间已满,但还需要插入新的元素,则会发生“上溢”错误。

链式表

单链表: 用一组地址任意的存储单元存放线性表中的数据元素。以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  =  结点  (表示数据元素  或  数据元素的映象)

以“结点的序列”表示线性表       称作链表

以线性表中第一个数据元素    的存储地址作为线性表的地址,称作线性表的头指针。

有时为了操作方便,在第一个结点之前虚加一个“头结点”,以指向头结点的指针为链表的头指针。

单链表操作的实现:


单链表是一种顺序存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素。因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 和 I 。 令指针 p 始终指向线性表中第 j 个数据元素。

在链表中插入结点只需要修改指针。但同时,若要在第 i 个结点之前插入元素,修改的是第 i-1 个结点的指针。因此,在单链表中第 i 个结点之前进行插入的基本操作为:找到线性表中第i-1个结点,然后修改其指向后继的指针。






链表是一个动态的结构,它不需要予分配空间,因此生成链表的过程是一个结点“逐个插入” 的过程。


循坏链表:

最后一个结点的指针域的指针又指回第一个结点的链表。和单链表的差别仅在于,判别链表中最后一个结点的条件不再是“后继是否为空”,而是“后继是否为头结点”。

链表的优缺点?

优点:链式存储结构克服了顺序存储结构的缺点,它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,进行数据插入或删除时不需要移动数据元素。
缺点:①每个结点中的指针域需额外占用存储空间,当每个结点的数据域所占字节不多时,指针域所占存储空间的比重就显得很大;②链式存储结构是一种非随机存储结构。

一元多项式的表示和相加

线性表的链式存储结构:线性表的链式存储结构就是用一组任意的存储单元——结点(可以是不连续的)存储线性表的数据元素。表中每一个数据元素,都由存放数据元素值的数据域和存放直接前驱或直接后继结点的地址(指针)的指针域组成。
循环链表:循环链表(Circular Linked List)是将单链表的表中最后一个结点指针指向链表的表头结点,整个链表形成一个环,从表中任一结点出发都可找到表中其他的结点。
双向链表:双向链表中,在每一个结点除了数据域外,还包含两个指针域,一个指针(next)指向该结点的后继结点,另一个指针(prior)指向它的前驱结点。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值