第二章线性表

线性表基本概念

具有相同数据类型的n个数据元素的有限序列。

元素个数有限
元素有先后顺序
元素数据类型相同,即每个元素占有相同大小存储空间

线性表是一种逻辑结构,顺序表和链表是指存储结构。

顺序表

#define MaxSize 50
typedef struct{
	ElemType data[MaxSize];
	int length;
}SqList;

顺序表中元素逻辑顺序和物理顺序相同。顺序表的数据存储可以是静态分配的数组也可以是动态分配的数组。

动态分配不是链式存储,它依然是顺序存储,依然是随机存取方式。

顺序表的特点是随机访问,存储密度高,逻辑上相邻的元素物理上也相邻。

顺序表可以顺序存取也可以随机存取。

顺序表基本操作

插入操作:注意区别位序和数组下标,因为插入时要将之后的数据依次向后移动一位,在表尾插入的时间复杂度为O(1),表头插入的时间复杂度为O(n),平均情况下为O(n)。

在第i个位置插入一个节点的概率为pi,则在长度为n的线性表中插入一个结点时,所需移动的平均次数为
∑ i = 1 n + 1 p i ( n − i + 1 ) = ∑ i = 1 n + 1 1 n + 1 ( n − i + 1 ) = 1 n + 1 n ( n + 1 ) 2 = n / 2 \sum_{i=1}^{n+1}p_i(n-i+1)=\sum_{i=1}^{n+1}\frac{1}{n+1}(n-i+1)=\frac{1}{n+1}\frac{n(n+1)}{2}=n/2 i=1n+1pi(ni+1)=i=1n+1n+11(ni+1)=n+112n(n+1)=n/2

删除操作:删除表尾元素时间复杂度为O(1),删除表头元素时间复杂度为O(n),平均时间复杂度O(n)。
按值查找:平均时间复杂度O(n)。

链表

单链表

typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;
//SqList是结点类型,*LinkList代表一个链表。

解决了顺序表需要大量连续存储单元的问题,但存在浪费存储空间的缺点。
头指针用来标识一个单链表,头结点的数据域通常是空。
无论是否存在头结点,头指针一直指向链表的第一个结点。如果有头结点,头结点就是链表的第一个结点。

头结点的优点是方便运算的实现,第一,有头结点后插入和删除数据元素的算法就统一了,不再需要判断是否在第一个元素之前插入或删除第一个元素。第二,不论链表是否为空头结点始终存在,头指针指向头结点不变,非空表和空表的处理统一。

单链表基本操作

头插法建立单链表,读入数据的顺序和生成链表元素顺序相反。时间复杂度O(n);
尾插法建立单链表,附设一个指向表尾结点的指针,时间复杂度O(n);
按序号查找结点值,时间复杂度O(n);
按值查找结点,时间复杂度O(n);
插入结点操作,先要按序找到位置这一部分O(n),在指定位置后插入节点时间复杂度O(1);在指定结点之前位置插入(前插)需要O(n)。
删除结点,O(n);

可以通过删除指定结点的后继结点,将后继结点的值赋给自己来实现删除操作,这样时间复杂度为O(1)。

求表长,O(n)。

双链表

typedef struct DNode{
	ElemType data;
	struct DNode *prior,*next;
}DNode,*DLinkList;

新增了一个指向前驱的prior指针,因此插入删除操作都是O(1)。

循环链表

循环单链表最后一个结点的指针指向头结点,因此判空条件是头结点是否指向自己;它在任何一个位置上的插入删除操作都是等价的,无需判断是否为表尾;可以从任意一个结点开始遍历整个链表。

如果不设头指针设尾指针,那么对表头和表尾的操作都只需要O(1)。

循环双链表为空表时表头结点的prior和next都指向自己,即等于L(头指针)。

静态链表

和顺序表一样,静态链表也要预先分配一块连续的内存空间。

#define MaxSize 50
typedef struct{
	ElemType data;
	int next;       //下一元素的数组下标(又称游标)
}SLinkList[MaxSize];

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值