线性表的顺序存储结构
数据结构期末试题及答案
数据结构期末试题及答案一、单项选择题(每题2分,共20分)1. 在数据结构中,线性表的顺序存储结构和链式存储结构的主要区别在于:A. 数据元素的存储关系B. 数据元素的存储空间C. 数据元素的存储顺序D. 数据元素的存储位置答案:A2. 下列关于栈的描述中,错误的是:A. 栈是一种后进先出(LIFO)的数据结构B. 栈只能进行插入和删除操作C. 栈顶元素可以被访问D. 栈可以进行顺序存储和链式存储答案:B3. 在二叉树的遍历算法中,不使用递归算法的遍历方式是:A. 前序遍历B. 中序遍历C. 后序遍历D. 层序遍历答案:D4. 哈希表的冲突解决方法中,不包括以下哪种:A. 开放定址法B. 链地址法C. 线性探测法D. 排序法答案:D5. 在图的遍历算法中,深度优先搜索(DFS)和广度优先搜索(BFS)的主要区别在于:A. 搜索的顺序B. 存储结构C. 遍历的深度D. 遍历的宽度答案:A6. 快速排序算法的时间复杂度最坏情况下为:A. O(n)B. O(nlogn)C. O(n^2)D. O(n^3)答案:C7. 下列关于二叉搜索树的描述中,正确的是:A. 每个节点的左子树只包含小于该节点的键值B. 每个节点的右子树只包含大于该节点的键值C. 以上两个选项都正确D. 以上两个选项都不正确答案:C8. 在非递归的二叉树遍历算法中,通常需要使用的数据结构是:A. 栈B. 队列C. 链表D. 数组答案:A9. 一个有n个顶点的无向图,其边数最多为:A. nB. n(n-1)/2C. n(n+1)/2D. n^2答案:B10. 一个长度为n的数组进行归并排序时,需要的辅助空间大小为:A. O(1)B. O(n)C. O(nlogn)D. O(n^2)答案:B二、填空题(每题2分,共10分)1. 在数据结构中,______是一种特殊的线性表,它的元素个数是固定的。
答案:数组2. 链表中,每个节点包含数据域和______。
线性表的顺序存储结构是一种什么存储结构
线性表的顺序存储结构是一种什么存储结构线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。
比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。
我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。
在数据结构逻辑层次上细分,线性表可以分成通常线性表和受到限制线性表。
通常线性表也就是我们通常所说的“线性表”,可以民主自由的删掉或嵌入结点。
受到限制线性表主要包含栈和队列,受到限制则表示对结点的操作方式受限制。
线性表的逻辑结构简单,便于实现和操作。
因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。
线性表就是一种常用的数据结构,以下了解线性表及其顺序存储,并对栈和队列及它们的顺序同时实现得出了详尽的设计叙述。
在实际应用中,线性表都是以栈、队列、字符串等特殊线性表的形式来使用的。
由于这些特殊线性表都具有各自的特性,因此,掌握这些特殊线性表的特性,对于数据运算的可靠性和提高操作效率都是至关重要的。
线性表就是一个线性结构,它就是一个所含n≥0个结点的非常有限序列,对于其中的结点,存有且仅有一个已经开始结点没前驱但存有一个后继结点,存有且仅有一个终端结点没后继但存有一个前驱结点,其它的结点都存有且仅有一个前驱和一个后继结点。
通常地,一个线性表可以则表示成一个线性序列:k1,k2,…,kn,其中k1就是已经开始结点,kn就是终端结点。
是一个数据元素的有序(次序)集1、子集中必存有唯一的一个“第一元素”;2、集合中必存在唯一的一个“最后元素” ;3、除最后一个元素之外,均存有唯一的后继(后件);4、除第一个元素之外,均有唯一的前驱(前件)。
由n(n≥0)个数据元素(结点)a1,a2,…,an共同组成的非常有限序列。
线性表 知识点总结
线性表知识点总结线性表的特点:1. 有序性:线性表中的元素是有序排列的,每个元素都有唯一的前驱和后继。
2. 可变性:线性表的长度是可变的,可以进行插入、删除操作来改变表的元素数量。
3. 线性关系:线性表中的元素之间存在明确的前驱和后继关系。
4. 存储结构:线性表的存储结构有顺序存储和链式存储两种方式。
线性表的操作:1. 查找操作:根据元素的位置或值来查找线性表中的元素。
2. 插入操作:将一个新元素插入到线性表中的指定位置。
3. 删除操作:将线性表中的某个元素删除。
4. 更新操作:将线性表中的某个元素更新为新的值。
线性表的顺序存储结构:顺序存储结构是将线性表的元素按照其逻辑顺序依次存储在一块连续的存储空间中。
线性表的顺序存储结构通常采用数组来实现。
数组中的每个元素都可以通过下标来访问,因此可以快速的进行查找操作。
但是插入和删除操作会导致元素位置的变动,需要进行大量数据搬移,效率较低。
线性表的链式存储结构:链式存储结构是将线性表的元素通过指针相连,形成一个链式结构。
每个元素包含数据和指向下一个元素的指针。
链式存储结构不需要连续的存储空间,可以动态分配内存,适合插入和删除频繁的场景。
但是链式结构的元素访问不如顺序结构高效,需要通过指针来逐个访问元素。
线性表的应用场景:1. 线性表适用于数据元素之间存在明确的前后关系,有序排列的场景。
2. 顺序存储结构适用于元素的插入和删除操作较少,对元素的随机访问较频繁的场景。
3. 链式存储结构适用于插入和删除操作较频繁的场景,对元素的随机访问较少。
线性表的操作的时间复杂度:1. 查找操作:顺序存储结构的时间复杂度为O(1),链式存储结构的时间复杂度为O(n)。
2. 插入和删除操作:顺序存储结构的时间复杂度为O(n),链式存储结构的时间复杂度为O(1)。
线性表的实现:1. 顺序存储结构的实现:使用数组来存储元素,通过下标来访问元素。
2. 链式存储结构的实现:使用链表来实现,每个元素包含数据和指向下一个元素的指针。
线性表的顺序存储——顺序表
线性表的顺序存储——顺序表之前我们讲了线性表, 本篇来阐述下线性表的顺序存储——顺序表定义线性表的顺序存储⼜称为顺序表, 它是⽤⼀组地址连续的存储单元依次存储线性表中的数据元素. 逻辑上相邻的两个数据元素在物理位置上同样相邻.规律顺序表中逻辑顺序与物理顺序相同L = ($a_{1}$, $a_{2}$, ..., $a_{i}$, $a_{i + 1}$, ..., $a_{n}$)其中在逻辑上相邻的两个数据元素,在顺序表中也存放在相同的存储单元当中,每⼀个⼩格⼦就代表⼀个存储单元。
注线性表中的元素的位序是从1开始, ⽽数组中元素下标是从0开始的若线性表存储的起始位置为Loc(A), sizeof(ElemType)为每个数据元素所占⽤的存储空间⼤⼩, 那么根据这⼀特点,我们可以计算出每⼀个数据元素存储的地址。
第⼀个元素的地址是 LOC(A),计算第⼆个元素的地址就可以⽤第⼀个元素的地址加上第⼀个数据元素 $a_{1}$ 所消耗的存储空间,⽤ sizeof 可求得该数据元素所消耗的存储空间⼤⼩。
这⾥需要注意的⼀点是,n 与 MaxSize 是有含义上的不同的,其中 $a_{n}$ 代表的是顺序表中最后⼀个数据元素,⽽ MaxSize 代表的是数组的最后⼀个存储单元。
顺序表的两种实现⽅法顺序表可以⽤数组来实现。
根据数组的两种分配⽅式,也就有两种描述顺序表的⽅法。
分别是静态描述分配顺序表的⽅法和动态描述分配顺序表的⽅法。
⾸先来看数组静态分配时时如何描述⼀个顺序表的。
静态描述分配顺序表#define MaxSize 50typedef struct{ElemType data[MaxSize];int length;}SqList;这就是描述顺序表的语句。
第⼀句是定义了⼀个宏,也就是定义线性表的最⼤长度为 50,同时这也是数组的最⼤容量。
接着定义了⼀个结构体。
结构体就是把多个基本数据类型组合到⼀起构成⼀个新的数据类型。
C语言:2.2 线性表及其顺序存储结构
线性表中数据元素的个数n称为线性表的长度
2.线性表的顺序存储结构
2.2.1 线性表及其运算
… a1 a2 … ai-1 ai … an …
第1个元素的存储地址,即线性表的起始地 址,称作线性表的基地址
每个数据元素所占的
线性表的顺序存储结构具有的特点: 存储空间(子节数) (1)所有元素所占的存储空间是连续的 (2)各元素在存储空间中是按逻辑顺序
v[i-1]=b;
//插入新元素
n=n+1;
//线性表长度增加1
return;
}
4.线性表在顺序存储结构下的删除运算 2.2.1 线性表及其运算
例2 删除线性表(21,18,30,75,66,42,56,87) 的第5个元素。
V(1:10) 21 18 30 75 4626 4526 5867 87
2. 线性表:允许在任意位置进行插入、删除运算 栈:只允许在一端进行插入、删除运算的线性表, 具有先进后出、后进先出的特点 队列:只允许在队尾插入,在排头进行删除 运算的线性表,具有先进先出的特点
3.由线性表在顺序存储结构下的插入与删除运算效 率比较低,这种存储方式对于大线性表或元素经常 需要变动的线性表不太合适.
S(1:10)
1.什么是队列
2.2.3 队列栈及其应用
队列(Queue)是指允许在一端进行插入,而在 另一端进行删除的线性表。
出队
ABCDE F
入队
排头指针 front
队尾指针 rear
2.队列的应用
输入输出缓冲区的结构
计
缓
打
算
冲
印
机
区
机
线性表及其顺序存储结构
理解线性表的定义有以下要点:
⑴ 序列——顺序性:元素具有线性顺序,第一个元素无前驱,最后一 个元素无后继,其他每个元素有且仅有一个前驱和一个后继。 ⑵ 有限——有限性:元素个数有限,在计算机中处理的对象都是有限 的。 ⑶ 相同类型——相同性:元素取自于同一个数据对象,这意味着每个 元素占用相同数量的存储单元。
3)入队
void InsertQueue(CircularQueue *q, ElemType x) { if((q->rear+1)%MAXSIZE==q->front) { printf("\n 队满,上溢!"); exit(1); } q->data[q->rear]=x; /*新元素插入到队尾*/ q->rear=(q->rear+1)%MAXSIZE; /*尾指针加1*/ }
出队列 ← a1 a2 a3 … an ← 入队列 ↑ ↑ 队头 队尾 队列示意图
在队列中,最先插入的元素,将最先能够 被删除。反之,最后插入的元素,将最后才 能被删除。因此,队列又称为“先进先出” 或后进后出的线性表。
2. 队列的顺序存储结构和基本运算 队列的顺序存储结构称为顺序队列。顺序 队列通常用一个一维数组来存放队列中的数 据元素。此外,还需设置两个整形变量front 和rear作为队头指示器和队尾指示器,分别 指示队头和队尾元素在向量空间中的位置。
⑷ 元素类型不确定——抽象性:数据元素的类型是抽象的、不具体的, 需要根据具体问题确定。
顺序表用一段地址连续的存储单元依次存储线性表的 数据元素。线性表(a1,a2,……,an)的顺序存储示 意图如图2.5所示。
由于线性表中每个数据元素的类型相同,可以用C++ 语言中的一维数组来实现顺序表,也就是把线性表中 相邻的元素存储在数组中相邻的位置,如图2.6所示
1.3 线性表及其顺序存储结构
1.3 线性表及其顺序存储结构1.3.1 线性表的基本概念1.线性表的定义在数据结构中,线性表(Linear List)是最简单也是最常用的一种数据结构。
线性表是由n(n≥0)个数据元素a1, a2, …, a n组成的有限序列。
其中,数据元素的个数n定义为表的长度。
当n=0时称为空表,记作( )或 ,若线性表的名字为L,则非空的线性表(n>0)记作:L=(a1,a2,…,a n)这里a i(i=1,2,…,n)是属于数据对象的元素,通常也称其为线性表中的一个结点。
线性表的相邻元素之间存在着前后顺序关系,其中第一个元素无前驱,最后一个元素无后继,其他每个元素有且仅有一个直接前驱和一个直接后继。
可见,线性表是一种线性结构。
例如,英文字母表(A, B, C, …, Z)就是一个长度为26的线性表,表中的每一个英文字母是一个数据元素,四季(春、夏、秋、冬)是一个长度为4的线性表,其中每一个季节是一个数据元素。
矩阵也是一个线性表,只不过它是一个比较复杂的线性表。
在矩阵中,既可以把每一行看成一个数据元素(既每一行向量为一个数据元素),也可以把每一列看成一个数据元素(即每一列向量为一个数据元素)。
其中每一个数据元素(一个行向量或者一个列向量)实际上又是一个简单的线性表。
在复杂的线性表中,一个数据元素由若干数据项组成,此时,把数据元素称为记录(record),而由多个记录构成的线性表又称为文件(file)。
例如,一个按照姓名的拼音字母为序排列的通信录就是一个复杂的线性表,见表1-4,表中每个联系人的情况为一个记录,它由姓名、性别、电话号码、电子邮件和住址5个数据项组成。
表1-4 复杂线性表2.非空线性表的特征非空线性表具有以下一些结构特征:●有且只有一个根结点,它无前件;●有且只有一个终端结点,它无后件;●除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。
结点个数n称为线性表的长度,当n=0时,称为空表。
线性表的顺序存储结构实验报告总结
线性表的顺序存储结构实验报告总结一、需求分析⒈本程序中,要求输入到表A,B中的元素是整形的,并且要按非递增顺序输入,否则系统会给出“出错信息”。
输出结果应该是一个不含有重复元素的非递增的表。
⒉本程序以用户和计算机的对话方式执行,即在计算机演示界面上显示“提示信息”后,由用户在键盘上输入相应的信息;相应的输入数据和运算结果显示在其后。
⒊程序执行的命令包括:(1)构造线性表A (2)构造线性表B (3)检验表A,B是否非递减有序(4)求表A与B的合并(5)删除表中值相同的多余元素(6)结束。
4.测试数据(1)A=123(2)A=9 5 0 -2B=1050-1-3-5 -10二、概要设计⒈为实现上述算法,需要线性表的抽象数据类型:ADT Stack {数据对象:D={ai:|ai∈ElemSet,i=1…n,n≥0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…n}基本操作:init(list *L)操作结果:构造一个空的线性表L。
InputList(List *L)初始条件:线性表L已经存在操作结果:人工输入了一张表。
CheckList(List *L)初始条件:线性表L已经存在操作结果:判断L是否非递增有序,若为否,则重新输入。
MergeList(List *La,List *Lb,List *Lc)初始条件:非递增线性表La,Lb已经存在操作结果:合并La,Lb得到Lc,Lc仍按非递增有序排列。
DeleteSame(List *L)初始条件:非递增线性表L已经存在操作结果:删除了L中值相同的元素。
PrintList(List L)初始条件:线性表L已经存在操作结果:打印出表L。
}ADT List2. 本程序有三个模块:⑴主程序模块void main(){初始化;do{接受命令;显示结果;}while(执行完毕)}⑵线性表单元模块:实现线性表抽象数据类型;⑶结点结构单元模块:定义线性表中的结点结构。
数据结构第二章参考答案
数据结构第二章参考答案习题21. 填空题(1)在一个单链表中,已知每个结点包含data和next两个域,q所指结点是p所指结点的直接前驱,若在q和p之间插入s所指结点,则执行(___________)和(___________)操作。
答案:q->next = s; s->next = p; 或 s->next=q->next; q->next = s; (2)表长为n的顺序表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均个数为(___________),删除一个元素需要移动元素的平均个数为(___________)。
答案:n/2 (n-1)/2(3)表长为0的线性表称为(___________)。
答案:空表(4)动态内存管理是操作系统的基本功能之一,其作用是响应用户程序对内存的(___________)和(___________)请求。
答案:申请释放(5)顺序表多采用(___________)实现的,是一种随机存取结构,对表中任意结点存取操作的时间复杂度为(___________)。
而查找链表中的结节,需要从头指针起顺着链扫描才能得到,平均时间复杂度为(___________)。
因此,若线性表的操作主要是进行查找,很少进行插入或删除操作时,采用(___________)表比较合适。
答案:数组 O(1) O(n) 顺序(6)在链表某个位置上进行插入和删除操作,只需要修改(___________)即可,而无须移动大量元素,操作的时间复杂度为(___________)。
而在顺序表中进行插入和删除操作,往往要移动大量元素,平均移动元素的数目为(___________),平均时间复杂度为(___________)。
因此,若对线性表进行频繁的插入和删除操作时,采用(___________)表相对合适。
若插入和删除主要发生在表头和表尾,则采用(___________)表更为合适。
线性表的顺序存储结构中,逻辑上相邻
线性表的顺序存储结构中,逻辑上相邻顺序存储结构的线性表称作顺序表。
在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构。
顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。
实现顺序存储结构的方法是使用数组。
数组把线性表的数据元素存储在一块连续地址空间的内存单元中,这样线性表中逻辑上相邻的数据元素在物理存储地址上也相邻。
数据元素间的逻辑上的前驱、后继逻辑关系就表现在数据元素的存储单元的物理前后位置上。
顺序存储结构的主要优点是节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。
采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。
但顺序存储方法的主要缺点是不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。
数据结构判断题
三、判断题:1.数据是计算机加工处理的对象(T )。
2.数据结构的概念包括数据的逻辑结构、数据在计算机中的存储方式和数据的运算三个方面( T )。
3.线性表是由n≥0个相同类型组成的有限序列(T )。
4.栈是一种后进先出的线性表(T )。
5.从循环链表的某一结点出发,只能找到它的后继结点,不能找到它的前驱结点( F )。
6.单链表设置头结点的目的是为了简化运算(T )。
7.树的最大特点是一对多的层次结构(T )。
8.组成数据的基本单位称为数据元素(T )。
9.从非循环链表的某一结点出发,既能找到它的后继结点,又能找到它的前驱结点(F )。
10.单链表结点的指针域是用来存放其直接后继结点的首地址的(T )1.数据的存储结构是数据的逻辑结构的存储映象(T )。
2.用顺序表来存储线性表时,不需要另外开辟空间来保存数据元素之间的相互关系(T )。
3.在非线性结构中,至少存在一个元素不止一个直接前驱或不止一个直接后驱(T )。
4.树的最大特点是一对多的层次结构(T )。
5.队列的特点是先进先出(T )。
6.由后序遍历序列和中序遍历序列能唯一确定一颗二叉树(T )。
7.数据的存储结构独立于计算机( F )。
8.线性表简称为”顺序表”。
( F )9.对数据的任何运算都不能改变数据原有的结构特性(T )。
10.从循环单链表的任一结点出发,可以找到表中的所有结点(T )。
1.栈是一种先进先出的线性表( F )。
2.链表的主要缺点是不能随机访问(T )。
3.二叉树是树的特殊形式( F )。
4.冒泡排序法是稳定的排序(T )。
5.算法是对解题方法和步骤的描述(T)。
6.算法可以用任意的符号来描述(T )。
7.数据的逻辑结构可以看作是从具体问题抽象出来的数学模型(T )。
8.线性表的顺序存储方式是按逻辑次序将元素存放在一片地址连续的空间中(T )。
9.栈是一种先进后出的线性表(T )。
10.将插入和删除限定在表的同一端进行的线性表是队列( F )。
计算机基础知识:线性表顺序存储的基本特点
官方微信:【zjsydwks 】
地址:杭州市文三路477号华星科技大厦三楼 事业单位微信号:zjsydwks
计算机基础知识:线性表顺序存储的基本特点
【导语】在事业单位考试中,计算机专业知识的复习向来是考生复习备考阶段的一大重点,其中中公事业单位考试网为计算机基础知识的复习为考生提供知识点梳理,帮助考生备考!
1.线性表的顺序存储
线性表的顺序存储结构称为顺序表。
2.线性表的顺序存储基本特点
线性表的顺序存储结构具有两个基本特点:
① 线性表中所有元素所占的存储空间是连续的;
② 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
以上是中公事业单位考试网为考生梳理计算机基础知识点,供大家学习识记!
最新招考公告、备考资料就在浙江事业单位考试网。
算法与数据结构判断题
一、判断题:二、1、线性表的逻辑顺序与物理顺序总是一致的。
(F)不是。
只有顺序存储情况下才一致,链式存储因为是随机选择物理存储单元,所以不一致。
2、线性表的顺序存储表示优于链式存储表示。
( F )3、线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。
( T )4、二维数组是其数组元素为线性表的线性表。
( T )5、每种数据结构都应具备三种基本运算:插入、删除和搜索。
( F )6、数据结构概念包括数据之间的逻辑结构,数据在计算机中的存储方式和数据的运算三个方面。
( T )7、线性表中的每个结点最多只有一个前驱和一个后继。
( F )8、线性的数据结构可以顺序存储,也可以链接存储。
非线性的数据结构只能链接存储。
( F )9、栈和队列逻辑上都是线性表。
(T )10、单链表从任何一个结点出发,都能访问到所有结点(T )11、删除二叉排序树中一个结点,再重新插入上去,一定能得到原来的二叉排序树。
(F)12、快速排序是排序算法中最快的一种。
(F )13、多维数组是向量的推广。
( F )14、一般树和二叉树的结点数目都可以为0。
(T )15、直接选择排序是一种不稳定的排序方法。
(F )16、98、对一个堆按层次遍历,不一定能得到一个有序序列。
(T )17、在只有度为0和度为k的结点的k叉树中,设度为0的结点有n0个,度为k的结点有nk个,则有n0=nk+1。
(F )18、折半搜索只适用与有序表,包括有序的顺序表和有序的链表。
( F )19、堆栈在数据中的存储原则是先进先出。
( F )20、队列在数据中的存储原则是后进先出。
( F )21、用相邻矩阵表示图所用的存储空间大小与图的边数成正比。
( F )22、哈夫曼树一定是满二叉树。
( F )23、程序是用计算机语言表述的算法。
(F )24、线性表的顺序存储结构是通过数据元素的存储地址直接反映数据元素的逻辑关系。
(T )25、用一组地址连续的存储单元存放的元素一定构成线性表。
数据结构实验报告1线性表的顺序存储结构
数据结构实验报告1线性表的顺序存储结构一、实验目的本次实验的主要目的是深入理解线性表的顺序存储结构,并通过编程实现其基本操作,包括创建线性表、插入元素、删除元素、查找元素以及输出线性表等。
通过实际操作,掌握顺序存储结构的特点和优势,同时也了解其在不同情况下的性能表现。
二、实验环境本次实验使用的编程语言为C++,编译环境为Visual Studio 2019。
三、实验原理1、线性表的定义线性表是由 n(n≥0)个数据元素组成的有限序列。
在顺序存储结构中,线性表的元素存储在一块连续的存储空间中,通过数组来实现。
2、顺序存储结构的特点存储密度高,无需额外的指针来表示元素之间的关系。
可以随机访问表中的任意元素,时间复杂度为 O(1)。
插入和删除操作需要移动大量元素,平均时间复杂度为 O(n)。
四、实验内容及步骤1、定义线性表的数据结构```cppdefine MAX_SIZE 100 //定义线性表的最大长度typedef struct {int dataMAX_SIZE; //存储线性表元素的数组int length; //线性表的当前长度} SeqList;```2、初始化线性表```cppvoid InitList(SeqList L) {L>length = 0; //初始时线性表长度为 0}```3、判断线性表是否为空```cppbool ListEmpty(SeqList L) {return (Llength == 0);}```4、求线性表的长度```cppint ListLength(SeqList L) {return Llength;}```5、按位查找操作```cppint GetElem(SeqList L, int i) {if (i < 1 || i > Llength) {printf("查找位置不合法!\n");return -1;}return Ldatai 1;}```6、按值查找操作```cppint LocateElem(SeqList L, int e) {for (int i = 0; i < Llength; i++){if (Ldatai == e) {return i + 1;}}return 0; //未找到返回 0}```7、插入操作```cppbool ListInsert(SeqList L, int i, int e) {if (L>length == MAX_SIZE) {//表已满printf("表已满,无法插入!\n");return false;}if (i < 1 || i > L>length + 1) {//插入位置不合法printf("插入位置不合法!\n");return false;}for (int j = L>length; j >= i; j) {//移动元素L>dataj = L>dataj 1;}L>datai 1 = e; //插入元素L>length++;//表长加 1return true;}```8、删除操作```cppbool ListDelete(SeqList L, int i) {if (L>length == 0) {//表为空printf("表为空,无法删除!\n");return false;}if (i < 1 || i > L>length) {//删除位置不合法printf("删除位置不合法!\n");return false;}for (int j = i; j < L>length; j++){//移动元素L>dataj 1 = L>dataj;}L>length; //表长减 1return true;}```9、输出线性表```cppvoid PrintList(SeqList L) {for (int i = 0; i < Llength; i++){printf("%d ", Ldatai);}printf("\n");}```10、测试用例```cppint main(){SeqList L;InitList(&L);ListInsert(&L, 1, 10);ListInsert(&L, 2, 20);ListInsert(&L, 3, 30);ListInsert(&L, 4, 40);ListInsert(&L, 5, 50);printf("线性表的长度为:%d\n", ListLength(L));printf("查找第 3 个元素:%d\n", GetElem(L, 3));int loc = LocateElem(L, 30);if (loc) {printf("元素 30 的位置为:%d\n", loc);} else {printf("未找到元素 30\n");}ListDelete(&L, 3);printf("删除第 3 个元素后的线性表:");PrintList(L);return 0;}```五、实验结果及分析1、实验结果成功创建并初始化了线性表。
线性表的顺序存储结构实验报告总结
线性表的顺序存储结构实验报告总结一、目的1.做实验的目的加深对线性表的理解,学会定义线性表的存储结构,掌握线性表的基本操作。
2.撰写实验报告的目的对本次实验情况进行总结,加强对实验内容的理解,对实验过程有一-个系统的认识,从中获得本次试验的经验,并对实验结果进行适当的分析,加深对栈和队列的理解和认识。
二、内容1.说明实验次数及实验内容本次实验用一次实验课时完成实验内容:节点定义:typedef struct node{int idx: int age: struct node *next:}Node, *List;本次实验的对象的存储内容包括功D和AGE,所以定义了如上的结构体,idx用于存储ID号,age用于存储年龄,next用于形成链式结构,Node定义了该类型的一一个节点,List定义了该类型的--个链表。
(1)、编写函数CreateList ()和PrintList(),从给定数组创建链表,打印链表。
int idx[8] = {1,2,3,4,5,6, 7,8}:int age[8] = {15, 18, 13, 22, 50, 18, 30, 20} :List CreatList(int idx[],int age[], int 1en) {}int PrintList(List L) {}(2)、编写函数DeleteNode(List L, int delete_ age),完成以下操作。
int DeleteNodeAge(List L, intdelete_ age) {}该函数传入List L,可以直接修改链表的节点,建议返回值为int 或void类型,无需为List类型,3,题同上。
2.1删除年龄为18的成员,打印链表。
2.2删除年龄为20的成员,打印链表。
2.3删除年龄为15的成员,打印链表。
2.4 (可选)删除年龄为21的成员(因无此成员,报错) ,打印链表。
.(3)、编写函数Inser tNodeByIdx(List L, Node nd),完成以下操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
∑
n +1 i =1
p i ( n i + 1)
1 不失一般性,若在线性表的任何位置插入元素都是等概率的,即 p i = 不失一般性,若在线性表的任何位置插入元素都是等概率的, , n + 1 上式可化简为: 上式可化简为: 1 n+1 n
Eis =
∑(n i +1) = 2 n +1
第二章 线性表
2.1 线性表的类型定义 2.2 线性表的顺序表示和实现
2.3 线性表的链式表示和实现
2.4 一元多项式的表示及相加
2.2 线性表的顺序表示和实现 线性表的顺序表示指的 是用一组地址连续的存储单 元依次存储线性表的数据元 素.
£2.2 线性表的顺序存储结构
(1)线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性 ) 表的数据元素.如下图2.1所示 所示: 表的数据元素.如下图 所示: 存储地址 b b+l … b+(i-1)l … b+(n-1)l b+nl … b+(maxlen-1)l 内存状态 a1 a2 … ai … an 空闲 数据元素在线性表中的位序 1 2 … i … n
// 为顺序表分配大小为 maxsize 的数组空间
if (!L.elem) exit(OVERFLOW); L.length = 0; L.listsize = maxsize; return OK; 算法时间复杂度 O(1) 时间复杂度: 时间复杂度 } // InitList_Sq
(4)线性表的插入和删除运算 ) 序号 数据元素 1 2 3 4 5 6 7 8 12 13 21 24 28 30 42 77 (a) 序号 数据元素 1 2 3 4 5 6 7 8 9 12 13 21 24 25 28 30 42 77 (b) 序号 数据元素 1 2 3 4 5 6 7 8 12 13 21 24 28 30 42 77 (a) 序号 数据元素 1 2 3 4 5 6 7 12 13 21 28 30 42 77
LOC (ai +1 ) = LOC (ai ) + l
线性表的第i个数据元素 的存储位置为 线性表的第 个数据元素ai的存储位置为: 个数据元素 的存储位置为:
LOC (ai ) = LOC (a1 ) + (i 1) × l
的存储位置, 式中LOC(a1 )是线性表的第一个数据元素 a 1的存储位置,通常称做线性表的起始位置 或基地址. 或基地址. 只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取. 只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取.线性 表的顺序存储结构是一种随机存取的存储结构. 表的顺序存储结构是一种随机存取的存储结构.
length; // 当前长度 listsize; // 当前分配的存储容量
// (以sizeof(ElemType)为单位)
} SqList; // 俗称 顺序表
Status InitList_Sq( SqList& L, int maxsize ) { // 构造一个最大容量为 maxsize 的顺序表 L.elem = new ElemType[maxsize];
删除运算 算法2.4如下: 算法 如下: 如下 Status ListDelete_Sq (SqList &L, int i, ElemType &e) { //在顺序线性表 中删除第 个元素,并用 返回其值 在顺序线性表L中删除第 个元素, 在顺序线性表 中删除第i个元素 并用e返回其值 //i的合法值为 的合法值为1≤i≤ListLength_Sq(L) 的合法值为 if (i<1|| i>L.length) return ERROR; //i值不合法 值不合法 p = & (L.elem[i-1]); //p为被删除元素的位置 - 为被删除元素的位置 e = *p; //被删除元素的值赋给 被删除元素的值赋给e 被删除元素的值赋给 q = L.elem + L.length-1; //表尾元素的位置 - 表尾元素的位置 for (++p; p<=q; ++p) * (p-1) = *p; (p- //被删除元素之后的元素 //被删除元素之后的元素 左移 ――L.length; return OK; } //ListDelete_Sq //表长减 表长减1 表长减
特点: 特点:以元素在 计算机内" 计算机内"物理 位置相邻" 位置相邻"来表 示线性表中数据 元素之间的逻辑 关系
线性表的这种机内表示称做线性表的顺序存储结构或顺序映像(sequential mapping). 线性表的这种机内表示称做线性表的顺序存储结构或顺序映像 . 通常称这种存储结构的线性表为顺序表. 通常称这种存储结构的线性表为顺序表.
i = 1; // i 的初值为第 1 元素的位序 p = L.elem; // p 的初值为第 1 元素的存储位置 while (i <= L.length && !(*compare)(*p++, e) ++i; (*compare)(*p++, e)) if (i <= L.length) return i; //找到满足条件的元素 else return 0; // 没有找到满足条件的元素 算法的时间复杂度 时间复杂度为 算法的时间复杂度为: } // LocateElem_Sq O( ListLength(L) )
int LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType, ElemType)) {
// 在顺序表中查询第一个满足判定条件的数据元素, 在顺序表中查询第一个满足判定条件的数据元素, // 若存在,则返回它的位序,否则返回 0 若存在,则返回它的位序,
插入 25
删除 24
(b)
图2.2 线性表插入前后的情况 (a)插入前 =8 插入前n= 插入前 (b)插入后 =9 插入后n= 插入后
图2.3 线性表删除前后的情况 (a)删除前 =8 删除前n= 删除前 (b)删除后 =7 删除后n= 删除后
算法2.3如下 如下: 插入运算 算法 如下: Status ListInsert_Sq (SqList &L, int i, ElemType e) { //在顺序线性表 中第 个位置之前插入新的元素 , 在顺序线性表L中第 个位置之前插入新的元素e, 在顺序线性表 中第i个位置之前插入新的元素 //i的合法值为 的合法值为1≤i≤ListLength_Sq(L)+1 的合法值为 if (i<1|| i>L.length+1) return ERROR; //i值不合法 值不合法 if (L.length>=L.listsize) { //当前存储空间已满,增加分配 当前存储空间已满, 当前存储空间已满 newbase = (ElemType *) realloc (L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType)); if (!newbase) exit(OVERFLOW); //存储分配失败 存储分配失败 L.elem = newbase; //新基址 新基址 L.listsize += LISTINCREMENT; //增加存储容量 增加存储容量 } q = & (L.elem[i-1]); //q为插入位置 - 为插入位置 for (p = & (L.elem[L.length-1]); p>=q; ――p) - * (p+1) = *p; //插入位置及之后的元素右移 插入位置及之后的元素右移 * q = e; //插入 插入e 插入 ++L.length; //表长增 表长增1 表长增 return OK; } //ListInsert_Sq
(5)时间复杂度 ) 从上述算法可见, 从上述算法可见,当在顺序存储结构的线性表中某个位置上插入或删除一个数据 元素时,其时间主要耗费在移动元素上, 元素时,其时间主要耗费在移动元素上,而移动元素的个数取决于插入或删除元素的位 置. 假设pi是在第 个元素之前插入一个元素的概率,则在长度为n的线性表中插入一 是在第i个元素之前插入一个元素的概率 假设 是在第 个元素之前插入一个元素的概率,则在长度为 的线性表中插入一 个元素时所需移动元素次数的期望值为: 个元素时所需移动元素次数的期望值为:
(6)顺序表的合并算法 ) 算法2.5如下 如下: 算法 如下: void MergeList_Sq (SqList La, SqList Lb, SqList &Lc){ //已知顺序线性表 和Lb中的数据元素按值非递减排列. 已知顺序线性表La和 中的数据元素按值非递减排列 中的数据元素按值非递减排列. 已知顺序线性表 //归并 和Lb得到新的顺序线性表 ,Lc的数据元素也按值非递减排列. 归并La和 得到新的顺序线性表 得到新的顺序线性表Lc, 的数据元素也按值非递减排列 的数据元素也按值非递减排列. 归并 pa = La.elem; pb = Lb.elem; Lc.listsize = Lc.length = La.length + Lb.length; pc = Lc.elem = (ElemType*)malloc(Lc.listsize*sizeof(ElemType)); if (!Lc.elem) exit (OVERFLOW); //存储分配失败 存储分配失败 pa_last = La.elem + La.length – 1; pb_last = Lb.elem + Lb.length – 1; while (pa <= pa_last && pb <= pb_last) { //归并 归并 if (*pa <= *pb) *pc++ = *pa++; else *pc++ = *pb++; } while (pa <= pa_last) *pc++ = *pa++; //插入 的剩余元素 插入La的剩余元素 插入 while (pb <= pb_last) *pc++ = *pb++; //插入 的剩余元素 插入Lb的剩余元素 插入 } //MergeLi除第 个元素的概率,则在长度为n的线性表中删除一 是删除第i个元素的概率 对于删除过程,假设qi是删除第 个元素的概率,则在长度为 的线性表中删除一 个元素时所需移动元素次数的期望值为: 个元素时所需移动元素次数的期望值为: n E dl = ∑ q i ( n i ) i =1 1 qi = 同样假设是等概率的情况, 则有: 同样假设是等概率的情况,即 n ,则有: n 1 n 1 E dl = ∑ ( n i ) = n i =1 2 结论:由此可见,在顺序存储结构的线性表中插入或删除一个数据元素, 结论:由此可见,在顺序存储结构的线性表中插入或删除一个数据元素,平均 约移动表中一半元素.若表长为n,则算法ListInsert_Sq和ListDelete_Sq的时间复杂 约移动表中一半元素.若表长为 ,则算法 和 的时间复杂 度为O(n). 度为 .