数据结构(二) 线性结构之线性表

本文详细介绍了线性表的概念、基本操作及其两种主要的存储结构——顺序表示和链式表示,并探讨了它们的特点与应用场景。

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

线性表(linear list)

表格

n个数据元素的有限序列。

  • 数据元素类型不局限于数字。如:字母表
  • 一个数据元素可以由若干项(item)组成。此时,将数据元素称为记录(record),含大量记录的线性表称为文件(file)。
  • 同一线性表的元素具有相同特性。序偶性。

将线性表记为(a1,a2,......,ak,......an)

  • 其中n(n>=0)定义为线性表的程度,当n=0时,称为空表。
  • 在非空表中,每个元素都有特定的位置,称为位序。
  • 线性表长度可变,可以进行访问、插入、删除等操作。

基本操作:

  1. InitList(&L) //构造一个空的线性表
  2. DestoryList(&L) //销毁线性表
  3. clearList(&L) //将线性表重置为空表
  4. ListEmpty(L) //判断线性表是否为空
  5. ListLength(L) //求线性表长度
  6. GetElem(L,i,&e) //返回线性表中第i个位置的元素
  7. LocateElem(L,e,compare()) //返回线性表中元素值为e的元素的位置
  8. PriorElem(L,cur_e,&pre_e) //求一个元素的前驱元素
  9. NextElem(L,cur_e,&next_e) //求一个元素的后继元素
  10. ListInsert(&L,i,e) //插入一个元素
  11. ListDelete(&L,i,&e) //删除一个元素
  12. ListTraverse(L,visit()) //遍历线性表

其余操作:

  • 合并线性表LA和LB(LA和LB可能是乱序排列,也可能是升序排列,也可能是降序排列)

→合并为线性表LA

合并为线性表LB

包含重复元素

不包含重复元素

乱序排列

升序排列

降序排列

线性表的顺序表示和链式表示

  • 线性表的顺序表示

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

当线性表的逻辑结构相同,线性表的存储结构可以不同。

存储位置关系:

Loc(ai+1)=Loc(ai)+len;

Loc(ai+1)=Loc(a1)+len*(i-1);

Loc(a1)称为线性表的起始地址,线性表的基地址。

顺序结构、顺序映像(sequential mapping)、顺序表

特点:

(1)以物理位置关系来表示逻辑关系,逻辑相邻,物理相邻。

(2)只要确定了起始位置,就可以随机存取线性表中元素。

数组也具有随机存取的特性,常用数组来描述顺序结构。线性表长度可变,所以用动态分配的一维数组表示。

C语言中,数组的下标从0开始。

缺点:

插入和删除时,需要大量移动元素。

三个重要属性:

基地址、线性表长度、一个存储空间长度。

typedef struct{

ElemType *elem; //存储空间基地址

int length; //顺序表长度

int listSize; //sizeof(ElemType

}sqList;

基本操作:

  1. InitList_sq(sqList&L) //初始化顺序表
  2. DestoryList(sqList&L) //销毁线性表
  3. clearList_sq(sqList&L) //将线性表重置为空表
  4. ListEmpty_sq(sqList L) //判断线性表是否为空
  5. GetElem_sq(sqListL,int i,ElemType &e) //返回线性表中第i个位置的元素
  6. LocateElem_sq(sqList L,ElemType e,compare(ElemType,ElemType)) //返回线性表中元素值为e的元素的位置
  7. ListInsert_sq(&L,i,e) //插入一个元素
  8. ListDelete(sqList &L,int i,ElemType &e) //删除一个元素

其他操作:

  • 合并顺序表LA和LB(LA和LB可能是乱序排列,也可能是升序排列,也可能是降序排列)

→合并为线性表LA

合并为线性表LB

包含重复元素

不包含重复元素

乱序排列

升序排列

降序排列

疑问疑问疑问求时间复杂度


  • 线性表的链式表示
  • 单链表
特点:
(1)用一组随机的存储单元来存储线性表中的数据元素。
这组存储单元可以是连续的,也可以是不连续的。
(2)因为存储单元随机,所以需要一个指示其直接后继的信息(其直接后继的存储位置)。
ai的存储映像称为结点(node),包括两部分信息:数据域、指针域。
指针域中存储的信息称为指针或链。
(3)每个结点中只包含一个指针域,故称为线性链表或单链表。
(4)整个链表的存取必须从头指针开始,头指针指向链表中第一个结点的存储位置。非随机存储结构。
(5)由于最后一个数据元素没有直接后继,则线性链表中最后一个结点的指针为“NULL”。
(6)用线性链表表示线性表时,数据元素之间的逻辑关系是由结点中的指针指示的。
(7)在使用链表时,关注的时逻辑关系,而不是存储关系。
(8)单链表由头指针唯一确定。
(9)若头指针为“NULL”,则单链表为空,单链表长度为0。
(10)有时候,我们在第一个结点之前加上头结点。若单链表为空,则单链表的头结点的指针域为NULL。
非顺序映像、链式映像
三个重要属性:
数据,后继指针,头指针
typedef  struct  LNode{
ElemType data;
struct LNode *node; //结构指针
}LNode,*linkList;
基本操作:
其他操作:
  • 静态链表
用数组描述线性链表。
typedef struct{
ElemType data;
int cur;
}component,SLinkList[maxsize];
(1)数组的一个分量表示一个结点,同时用游标(指示器cur)代替指针指示结点在数组中的相对位置。
(2)数组的第0分量可以看成头结点。
(3)这种存储结构需要预先分配一个较大的存储空间。
(4)进行插入删除操作时,无需移动元素,只需修改指针。
(5)便于在不设指针的高级程序语言中使用链表这一数据结构。
基本操作:
其他操作:
  • 循环链表(circular linked list)
特点:
(1)表中的最后一个结点的指针域指向头结点,整个链表形成一个环。
(2)从表中的任意结点出发均可找到表中其他结点。
四个属性:
数据、直接前驱指针、直接后继指针、头指针。
  • 双向链表(double linked list)
在双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前驱。
typedef struct DuNode{
ElemType data;
struct DuLNode *prior; //前驱指针
struct DuLNode *next; //后继指针
}DuNode,*DuLinkList;
应用:一元多项式的表示及相加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值