数据结构--线性表

数据结构–线性表


线性结构的特点是:在数据元素的非空有限集中,(1)存在惟一的一个被称作“第一个”的数据元素;(2)存在惟一的一个被称作“最后一个”的数据元素;(3)除第一个之外,集合中每个数据元素均只有一个前驱;(4)除最后一个之外,集合中每个数据均只有一个后继。

线性表的顺序表示和实现

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。
在顺序存储结构的线性表中,插入删除一个数据元素,平均约移动表中一半的数据。
插入删除的时间复杂度为 O ( n ) O(n) O(n)

取顺序表长度取元素数据的时间复杂度都是O(1)

若以线性表表示集合并进行集合的各种运算,应先对表中的元素进行排序。
快速排序的时间复杂度为O(nlogn),其中n为待排序的元素个数

这种存储结构的缺点:在作插入和删除操作时,需移动大量元素,时间复杂度为O(n)。

线性表的链式表示和实现

1.线性链表

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素ai
其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。
这两部分信息组成数据元素ai的存储映像,称为结点(node)。它包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域
指针域中存储的信息称作指针。n个结点链结成一个链表。即线性表(a1,a2,…,an)的链式存储结构。链表的每一个结点只包含一个指针域,故又称线性链表或者单链表

Status GetElem_L(LinkList L,int i,ElemType &e) {
	//L为带头结点的单链表的头指针
	//当第i个元素存在时,其值赋值给e并返回OK,否则返回ERROR
	p = L->Next; j = 1;//初始化,p指向第一个结点,j为计数器
	while(p && j>i) { //顺指针向后查找,直到p指向第i个元素或p为空
		p = p -> Next; ++j;
	}
	if(!p || j > i) return ERROR;//第i个元素不存在
	e = p -> data;               //取第i个元素
	return OK;
}

单链表查询的时间复杂度为 O ( n ) O(n) O(n)

单链表结构插入和删除的时间复杂度都是 O ( n ) O(n) O(n),虽然插入和删除都不需要移动元素,但是要找到插入结点的位置,所以其时间复杂度为 O ( n ) O(n) O(n)

单链表和顺序存储结构不同,它是一种动态结构。整个可用存储空间可为多个链表共同享用,每个链表占用的空间不需要预先分配预定,可由系统应需求即时生成。

顺便表的合并和链表的合并,时间复杂度是一样的。但空间复杂度不一样。顺序表合并,需要建立一个新的顺序表。而链表的合并只要把原来两个链表的关系解除即可。

2.循环链表

循环链表是另一种形式的链表存储结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。

3.双向链表

双向链表有两个指针域,其一指向直接后继,另一指向直接前趋。
单向链表的缺点,无法查找某一个结点的直接前趋,只能顺时针往后查询其他的结点

静态链表和动态链表定义

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式。

  • 静态链表是用类似于数组方法实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间大小。
    在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR。
    所以静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。这种方式方便于在不设指针类型的高级程序设计语言中使用链表结构。

  • 动态链表:每次动态分配的存储单元,其地址不一定是连续的,而所需处理的批量数据往往是一个整体,各数据之间存在着接序关系。链表的每个节点中,除了要有存放数据本身的数据域外,至少还需要有一个指针域,用它来存放下一个节点元素的地址,以便通过这些指针把各节点连接起来。

应用:一元多项式的相加,可以使用顺序表的链式存储结构。
一元多项式A17(x) = 7 + 3 x x x+9 x 8 x^8 x8+5 x x x17和一元多项式B8(x) = 8 x x x+22 x 7 x^7 x7-9 x x x8相加。
图1-1
“和多项式”链表中的结点无需另生成,而应该从两个多项式的链表中摘取。其运算规则如下:假设指针qa和qb分别指向多项式A和多项式B中当前比较的某个结点,则比较两个结点中的指数项,有下列3中情况:①指针qa所指结点的指数值 < 指针qb所指结点的指数值,则应摘取qa指针所指结点插入到“和多项式”链表中去;②指针qa所指结点的指数值 > 指针qb所指结点的指数值,则应摘取qb指针所指结点插入到“和多项式”链表中去;③指针qa所指结点的指数值 = 指针qb所指结点的指数值,则将两个结点中的系数相加,若和数不为0,则修改qa所指结点的系数值,同时释放qb所指结点;反之,从多项式A的链表中删除相应结点,并释放指针qa和qb所指结点。
图1-2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值