数据结构 第二章 线性表(一)

第二章知识框图

一、线性表的定义和基本操作

(一)线性表的定义
 线性表是具有相同特性数据元素的一个有限序列。该序列中所含元素的个数叫做线性表的长度,用n(n>=0)表示。注意,n可以等于0,表示线性表是一个空表。
 线性表只有一个表头元素,只有一个表尾元素,表头元素没有前驱,表尾元素没有后继,除表头和表尾元素之外,其他元素只有一个直接前驱,也只有一个直接后继。这就是线性表的逻辑特性。
(二)线性表的基本操作
 一个数据结构的基本操作是指其最核心、最基本的操作。其他叫复杂的操作可以通过调用其基本操作来实现。线性表的基本操作如下:
初始化表:构造一个空的线性表。
 求表长:返回线性表的长度,即线性表中数据元素的个数。
 按值查找操作:在表中查找具有给定关键字值的元素。
按位查找操作:获取线性表中第i个位置的元素的值。
插入操作:在表中第i个位置上插入指定元素。
删除操作:删除表中第i个位置的元素,并返回删除元素的值。
 输出操作:按前后顺序输出线性表的所有元素值。
 判空操作:若线性表是空表,则返回true,否则返回false。
 销毁操作:销毁线性表,并释放线性表所占用的内存空间。

 线性表的结构只有顺序存储结构和链式存储结构两种,前者称为顺序表,后者称为链表。

二、线性表的顺序存储结构

(一)顺序表的定义
 线性表的顺序存储又称为顺序表。它是用一组地址连续的存储单元,依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理地址上也相邻。第一个元素的存储在线性表的起始位置,第i个元素的存储位置后面紧挨着存储的是第i+1个元素。因此,顺序表的逻辑结构与其物理顺序相同。顺序表通过数组实现。
1、顺序表的结构体定义

#define maxSize 100	//定义一个整型常量maxSize,值为100(之后的代码也会使用)
typedef struct
{
   
	int data [maxSize];	//存放顺序表元素的数组
	int length;	//存放顺序表的长度
}Sqlist;	//顺序表类型的定义

 一维数组可以是静态分配的(如上),也可以是动态分配的。静态分配时,由于数组的大小和空间事先已经固定,一旦占满空间,再加入新的数据就会产生溢出,导致程序的奔溃。因此也可以通过数组的动态分配在程序执行时开辟额外空间使用。
2、顺序的优缺点
 顺序表最主要的特点是随机访问,即可以 通过首地址和元素序号在O(1)时间内找到指定的元素。
 顺序表的存储密度高,每个节点只存储数据元素。
 顺序表逻辑上相邻的元素物理上也相邻,所以删除和插入操作需要移动大量元素。
(二)顺序表的基本操作
 其他操作较为简单,此处主要介绍顺序表的插入操作、删除操作和按值查找操作。
1、插入操作
 问题描述:在顺序表L的第p(0<= p <=length,p指数组下标)个位置上插入新的元素e。如果p的输入不正确,则返回0,代表插入失败;如果p的输入正确,则将顺序表第p个元素及以后元素右移一个位置,腾出一个空位置插入新元素,顺序表长度增加1,插入操作 成功,返回1。
 插入操作代码如下:

int insertElem (Sqlist &L, int p, int e)	//L本身要发生改变,所以用引用型
{
   
	int i;
	if (p<0||p>L.length||L.length==maxSize)	//位置错误或表长已经达到
		return 0;	//顺序表的最大允许值,此时插入不成功,返回0
	for (i=L.length-1;i>=p;--i)
		L.data[i+1] = L.data[i];	//从后往前,逐个将元素往后移动一个位置
	L.data[p] = e;	//将e放在插入位置p上
	++(L.length);	//表内元素多了一个,因此表长自增1
	return 1;	//插入成功,返回1
}

 复杂度分析:
 最好情况:在表尾插入(p=L.length),元素后移语句不执行,时间复杂度为O(1)。
 最坏情况:在表头插入(p=0),元素后移语句将执行L.length次,时间复杂度为O(n)。
 平均情况:在长度为n的顺序表中,假设pi(pi=1/(n+1))是在第i个位置上插入一个结点的概率,则插入一个结点所需移动结点的平均次数为
∑ i = 1 n + 1 p i ( n − i + 1 ) = ∑ i = 1 n + 1 1 n + 1 ( n − i + 1 ) = 1 n + 1 ∑ i = 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}\sum_{i=1}^{n+1}{(n-i+1)}=\frac{1}{n+1}\frac{n(n+1)}{2}=\frac{n}{2} i=1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值