数据结构笔记(线性表)

第三章 线性表
线性表就是零个或多个数据元素的有限序列,类似排队。
一:线性表的定义:
从名字就能感觉出,线性表是像线一样的性质的表。
首先它是一个序列,元素之间有顺序,若元素有多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素有且仅有一个前驱和后继。(一个一个排好队)
线性表强调是有限的,(排队总人数有限),所以元素个数也是有限的。事实上,计算机中处理对象是有限的,无限序列只存在于数学概念中。
用数学语言定义:
若将线性表记为(a1,a2,…,ai-1,ai,ai+1,…,an),则ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。线性表元素个数n(n>0),当a=0位空表。

线性表例子:班级学生排队,点名册等是,满足有限和只有一个前驱后继。点名册中一个同学(数据元素)可以有成绩等若干数据项组成,依旧满足。
公司管理构成,班级人际关系等不是,每个人都对应多个人。

二:数据表抽象数据类型:
分析数据表具有什么操作
线性表的抽象数据类型如下:
在这里插入图片描述
在这里插入图片描述
基本操作有:初始化,判断是否为空,清空线性表,取值,查找,插入,杀出,求元素总个数(长度)

三:线性表顺序储存结构:
1:顺序储存定义
线性表两种物理结构的第一种,指的是用一段地址连续的单元储存线性表的数据元素。(一排连着)
2:顺序储存方式:
在内存中找一块地,把一定内存空间占了,然后把相同数据类型的数据元素依次存放在这块空地中。因此可以使用c语言的一维数组实现顺序储存结构,即把第一个数据元素存到数组下标为0的位置中,接着把线性表相邻位置的元素存储到数组中相邻位置。
顺序表中顺序储存结构的代码

#defind MAXSIZE 20
typedef int ElemTYpe // ElemTYpe类型根据实际而定,此处为int
typedef struct
{
ElemTYpe data[MAXSIZE];
int length;
}sqlist;

所以,顺序储存结构需要三个属性:
存储空间起始位置:数组data,它的储存位置是存储空间的的存储位置
线性表最大长度: MAXSIZE
线性表当前长度:length

3:数组长度和线性表长度的区别
数组长度是存放线性表储存空间的长度,一把不变,任意时刻线性表长度应该小于等于数组长度。

4:地址计算方法:
c语言中数组从0开始第一个下标,所以线性表第i个元素是存储在数组下标为i-1的位置。
存储器中的美格尔存储单元都要标号,称为地址。每个数据元素不管是整型实型还是字符型都需要占据一定存储单元空间。假设占用a单元,那么线性表中第i+1个数据元素的存储位置和第i个数据元素的存储位置满足loc(ai+1)=loc(ai)+a
loc(ai)=loc(a1)+(i-1)*a
通过此公式可以随时算出任意位置的地址,不管是第一个还是最后一个,都是相同时间,所以顺序表存储时间性能是0(1),我们通常把具有这一特点的存储结构称为随机存取结构

四:顺序存储结构的插入与删除:
1:获得元素的操作
对于线性表顺序存储结构来说,实现getElem操作,即将线性表L中的第i个位置返回,就是把数组i-1下标的值返回。
代码如下:


#defind ok 1
#define ERROR 0
#defind TRUE 1
#defind FALSE 0
typedef int status;//此处为定义函数类型
status getElem(sqlist L,int i,Elemtype *e)
{
if(L.length==0 ||i<1||i>L.length)
retrun ERROR;
*e=L.data[i-1];
retrun OK;
}

status在此处是一个整型,返回OK代表1,ERROR代表0.

2:插入操作
线性表顺序存储结构插入时插入元素后的数据元素整体向后退
代码如下:

//初始条件:顺序表L已经存在,1<=i<=ListLength(L)
//操作结果:L在第i个位置之前插入新的数据元素e。L的长度的长度加1
Status ListInsert(sqlist *L, int i,ElemTYpe e)
{int k;
if(L->length==MAXSIZE)
{retrun ERROR;}
if(i<1 || i>L->length+1{retrun ERROR;}
if(i<=L->length)
{

3:删除操作
从顺序表中取出一个元素,其后数据元素向前移

待续

分析插入与删除的时间复杂度
最坏情况是插入第一个位置和删除第一个元素,此时要移动所有元素,所以时间复杂度是o(n)

4:线性表的顺序存储结构的优缺点
优点:无需为表示表中的元素之间的逻辑关系而额外增存储空间;可以快速存储和读取表中任意一个元素
缺点:插入和删除需要移动大量元素;当线性表长度变化较大时,难以确定存储空间的容量;造成存储空间碎片化

五:线性表的链式存储结构

第五章 树和二叉树:
(不考广义表嵌套创建二叉树)

//定义顺序表L的结构体
typedef struct
{
Elemtype data[MaxSize];
int length;
}SqList;
//建立顺序表
void CreateList(SqList * &L,ElemType a[ ],int n)
{
int i;
L = (SqList * )malloc(sizeof(SqList));
for(i = 0 ; i < n ; i++)
L->data[i] = a[i];
L->length = n;
}
//输出顺序表:
void DispList(SqList *L)
{
int i;
for(i = 0; i < L ->length; i++)
printf(“%d”,L->data[i]);
printf(“\n”);
}

第四章 串,数组和广义表

学习通第四章练习题(记录思路与答案给大家参考)
2. (单选题, 3分)
若串S1=‘ABCDEFG’, S2=‘9898’ ,S3=‘###’,S4=‘012345’,执行concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2,‘8’),length(S2))),其结果为( )

3.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为( )
A
求子串
B
联接
C
匹配
D
求串长

答案:C

  1. (单选题, 3分) 串的长度是指( )。
    A
    串中所含不同字母的个数
    B
    串中所含字符的个数
    C
    串中所含不同字符的个数
    D
    串中所含非空格字符的个数
    答案:B

  2. (单选题, 3分) 设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为( )。
    A
    13
    B
    33
    C
    18
    D
    40

特殊数组可以压缩储存,此矩阵为对称矩阵,存对角线的右上半加对角线的元素,或者是左下半加对角线的元素,其他位置不存储。
使用行优先储存,a11,a21,a22,a31,a32,a33以此类推,所以a85的位置计算为(1+2+3+4+5+6+7)+5=33

  1. (单选题, 3分)
    设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( )。
    A
    BA+141
    B
    BA+180
    C
    BA+222
    D
    BA+225

A[5,8]以列为主,该元素处于第八列,前七列是满的每列8个元素,该元素处于第五行,他的前一个元素A[4,8]的结束地址就是所求的开始,最后,每个元素占3。

  1. (单选题, 3分) 假设以行序为主序存储二维数组A=array[1…100,1…100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=( )。
    A
    808
    B
    818
    C
    1010
    D
    1020

答案:b
将A转化Amn,LOC[5,5]=LOC[i,j]; 则LOC[I,J]=10+((I-1))*n+j-1)*2 结果是818

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值