数据结构教程(简答易懂)第二章

合集下载

数据结构第二章课后答案

数据结构第二章课后答案

数据结构第二章课后答案数据结构第二章课后答案1. 线性表1.1 数组实现线性表Q1. 请说明线性表的定义,并结合数组实现线性表的特点进行解释。

线性表是由n(n≥0)个数据元素构成的有序序列,其中n表示线性表的长度。

数组实现线性表的特点是使用一组具有相同数据类型的连续存储空间存储线性表中的元素,通过下标访问和操作元素。

A1. 线性表的定义指出,线性表是由若干个数据元素组成的有序序列。

具体地,在数组实现线性表中,我们将元素存储在一组连续的内存空间中,通过下标访问和操作元素。

由于数组的存储空间具有连续性,这样的实现方式可以在O(1)的时间复杂度下进行元素的访问和修改操作。

1.2 链表实现线性表Q2. 请说明链表实现线性表的特点,并与数组实现进行比较。

链表实现线性表的特点是通过指针将线性表中的元素按照节点的形式连接起来,每个节点包含了存储的元素和指向下一个节点的指针。

与数组实现相比,链表的插入和删除操作更为高效,但是访问某个位置的元素需要从头开始遍历,时间复杂度较大。

A2. 链表实现线性表的特点是通过使用节点和指针将线性表中的元素连接起来。

每个节点中包含了一个存储的元素和指向下一个节点的指针。

链表的插入和删除操作的时间复杂度为O(1),因为只需要改变指针的指向即可。

但是,访问某个位置的元素需要从头开始遍历链表,所以时间复杂度为O(n)。

2. 栈和队列2.1 栈的定义和基本操作Q3. 请给出栈的定义和基本操作。

栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作,该端称为栈顶。

栈的基本操作包括入栈(push)和出栈(pop),分别用于将元素压入栈和将栈顶元素弹出。

A3. 栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。

这个特定的一端称为栈顶,而另一端称为栈底。

栈的基本操作包括入栈(push)和出栈(pop)。

入栈操作将一个元素压入栈顶,出栈操作将栈顶元素弹出。

2.2 队列的定义和基本操作Q4. 请给出队列的定义和基本操作。

数据结构第二章参考答案

数据结构第二章参考答案

数据结构第二章参考答案1. 线性表线性表是数据结构中最基本的一种结构,在实际应用中广泛使用。

它是一个有序的数据元素序列,其中每个元素都有唯一的前驱和后继,除了第一个元素没有前驱,最后一个元素没有后继。

2. 顺序存储结构顺序存储结构是线性表最简单的一种实现方式。

它利用一段连续的存储空间依次存储线性表的元素,存储位置是连续的。

在顺序存储结构中,插入和删除操作需要移动大量元素,因此效率较低。

3. 链式存储结构链式存储结构通过指针将线性表的各个元素链接起来。

每个元素都包含一个数据域和一个指针域,数据域用于存储数据元素,指针域用于存储下一个元素的地址。

在链式存储结构中,插入和删除操作只需要修改指针,效率较高。

4. 栈栈是一种特殊的线性表,它只允许在表的一端进行插入和删除操作,这一端称为栈顶。

栈的特点是后进先出,即最后插入的元素最先被删除。

栈的应用场景包括函数调用、表达式求值等。

5. 队列队列也是一种特殊的线性表,它允许在表的一端(队尾)插入元素,在另一端(队首)删除元素。

队列的特点是先进先出,即最先插入的元素最先被删除。

队列的应用场景包括进程调度、打印队列等。

6. 递归递归是一种解决问题的方法,通过调用自身来解决规模较小的子问题。

在数据结构中,递归广泛应用于树和图的操作中。

递归需要注意递归的边界条件和递归的停止条件,以避免无限递归的问题。

7. 树树是一种非线性的数据结构,它由n个节点组成,这些节点通过边连接起来。

树的特点是每个节点最多有一个父节点,但可以有多个子节点。

树的应用场景包括文件系统、组织结构等。

8. 二叉树二叉树是一种特殊的树结构,每个节点最多有两个子节点。

二叉树的遍历有三种方式:前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。

二叉树的应用场景包括查找、排序等。

9. 查找算法查找算法是在数据集合中寻找特定元素的过程。

常用的查找算法有顺序查找、二分查找、哈希查找等。

不同的查找算法有不同的时间复杂度和空间复杂度,对于不同规模的数据集合有不同的效率。

数据结构第二章课后答案

数据结构第二章课后答案

数据结构第二章课后答案数据结构第二章课后答案==========================================2.1 题目1:什么是线性表?线性表的特点有哪些?答案:线性表是由n个数据元素组成的有限序列,其中n为表的长度,线性表具有以下特点:1.除第一个元素外,每个元素均有一个直接前驱元素;2.除最后一个元素外,每个元素均有一个直接后继元素;3.线性表具有唯一的一个始元素和终元素。

2.2 题目2:什么是顺序存储结构?顺序存储结构有什么特点?答案:顺序存储结构是指用一组地质连续的存储单元依次存储线性表的数据元素,顺序存储结构具有以下特点:1.线性表的元素在计算机中是连续存储的,可以通过下标直接访问元素;2.插入和删除操作需要移动大量元素,效率较低;3.存储空间需要预先分配大小,固定不变。

2.3 题目3:什么是链式存储结构?链式存储结构有什么特点?答案:链式存储结构是指线性表的元素在计算机内存中非连续存储,而是通过每个元素中的指针起来的结构,链式存储结构具有以下特点:1.线性表的元素在内存中可以是非连续存储,节省存储空间;2.插入和删除操作只需要修改指针,效率较高;3.需要额外的指针域存储信息,增加了存储空间开销。

2.8 题目8:请解释迷宫问题的基本思路。

答案:迷宫问题的基本思路是使用回溯算法,即从某个位置开始进行深度优先搜索,逐步尝试各种可能的路径,直到找到一条通路或者遍历完所有可能的路径。

基本步骤如下:1.选择一个起始位置,并将其标记为已访问;2.检查当前位置的四周是否有未访问的相邻位置;3.如果有未访问的相邻位置,选择其中一个位置继续深度搜索;4.如果所有相邻位置都被访问过或者当前位置是死胡同,回溯到上一个位置;5.重复步骤2-4,直到找到通路或者遍历完所有路径。

附件:无法律名词及注释:1.版权:指对文字、图像、音乐等作品享有法律保护的权利,未经作者许可不得使用;2.知识产权:指人们创造的智力成果所享有的权益,包括专利权、商标权、著作权等;3.公平使用:指在特定情况下,可以在不获得版权所有人许可的情况下使用作品的一定范围。

数据结构第二章

数据结构第二章

操作结果:构造一个空线性表L。
Destroylist(&L)
初始条件:线性表L已存在。
操作结果:销毁线性表L。
ClearList(&L)
初始条件:线性表L已存在。 操作结果:将线性表L臵为空表。
四、抽象数据类型线性表的定义
Listempty(L) 初始条件:线性表L已存在。
操作结果:若L为空,则返回TRUE,否则返回FALSE。 ListLength(L) 初始条件:线性表L已存在。 操作结果:返回L中数据元素个数。 GetElem(L,i,&e) 初始条件:线性表L已存在。 操作结果:用e返回L中第i个数据元素的值。 LocateElem(L,e,compare()) 初始条件:线性表L已存在。 操作结果:返回L中第1个与e满足关系compare()的数 据元素的位序。若这样的元素不存在,则返回值为0。
四、抽象数据类型线性表的定义
上述类型定义中的操作均为“原子操作”,利用 这些“原子操作”可以完成其他更复杂操作。 例2-1 设两个线性表LA和LB分别表示两个集合A和B, 现要得到一个新的集合A=A∪B(并)。 此问题可演绎为对线性表作如下操作:
扩大线性表LA,将存在于线性表LB中而不存在于线
性表LA中的数据元素插入到LA中。
四、抽象数据类型线性表的定义
ListInsert(&L,i,e) 初始条件:线性表L已存在,1≼i ≼ ListLength(L)+1 。 操作结果:在L中第i个位臵之前插入新的数据元素e,L 的长度加1。 ListDelete(&L,i,&e) 初始条件:线性表L已存在, 1≼i ≼ ListLength(L) 。 操作结果:删除L的第i个数据元素,并用e返回其值,L 的长度减1。 }ADT List

数据结构第二章课后答案

数据结构第二章课后答案

数据结构第二章课后答案第二章课后答案2·1·理论问题1·什么是数据结构?答:数据结构是指在计算机中存储、组织和管理数据的方式。

它包括了数据的逻辑结构、存储结构和操作方法。

2·逻辑结构和存储结构的关系是什么?答:逻辑结构是指数据之间的逻辑关系,它是从逻辑上描述数据元素之间的关系。

存储结构是指数据在计算机内部的具体存储方式,它是从物理上描述数据元素在计算机内部的存储关系。

逻辑结构与存储结构之间是相互依赖的关系,逻辑结构决定存储结构,而存储结构又反过来影响逻辑结构。

3·请解释顺序存储结构和链式存储结构。

答:顺序存储结构是指将数据元素存储在一块连续的存储空间中,元素的物理地质是连续的。

链式存储结构是将数据元素存储在任意的存储单元中,通过指针相互连接。

4·什么是抽象数据类型(ADT)?答:抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作。

它只关心数据对象的定义和操作,而不考虑其在计算机内部的表示和运算过程。

5·ADT的特点有哪些?答:(1)封装性:ADT将数据对象的定义和操作封装在一起,只对外界提供有限的操作接口。

(2)数据抽象:ADT关注数据的逻辑结构,而忽略了具体的存储结构和实现细节。

(3)信息隐藏:ADT将数据对象的内部细节隐藏起来,只通过接口暴露给外部使用者。

2·2·应用问题1·请举例描述数据结构的应用场景。

答:(1)栈:在程序设计中,栈常用于实现函数的调用和返回,追踪程序的执行过程。

(2)队列:在操作系统中,队列被广泛应用于任务调度,比如处理作业、进程管理等。

(3)二叉树:在搜索算法中,二叉树常用于实现快速查找、排序和最优化问题。

(4)图:在社交网络中,图被用来表示好友关系、消息传播等复杂的关系网络。

2·描述数组和链表的特点及其应用场景。

答:数组是一种顺序存储结构,它可以随机访问任何一个元素,但插入和删除元素的操作效率较低。

第2章 线性表 (数据结构教程PPT课件)

第2章 线性表 (数据结构教程PPT课件)

3.在数组a中检索(查找)值为X的数据元素
int locate (int a[ ],int n, int x) { int i; i=0; while((i<=n-1)&&(a[i]!=x)) i++; if(i<=n-1) return (i); /*返回的是存储位置*/ else return (0);} }
(2)按值查找即定位 Locate_LinkList(L,x) Lnode * Locate_LinkList( LinkList L, datatype x) /*在单链表L中查找值为x的结点,找到后 返回其指针,否则返回空*/ { Lnode * p=L->next; while ( p!=NULL && p->data != x) p=p->next; return p; }
2.2.2 典型操作的算法实现
1. 初始化线性表L
SeqList *init_SeqList( )
{ SeqList *L; L=malloc(sizeof(SeqList)); L->last=-1; return L; }
2.在数组a第i个数据元素之(ai-1)前插入数据 元素X insert (int a[ ],int n,int i, int x) { int j; for(j=n-1;j>=i-1;j--) a[j+1]=a[j]; /* 结点移动 */ a[i-1]=x; /*新元素插入*/ n++; /*修改长度*/ }
4.删除数组a第i个数据元素(ai-1) delete (int a[ ],int n,int i) { int j; for(j=i;j<=n;j++) a[j-1]=a[j]; /* 结点移动 */ n--; /*修改长度*/ }

数据结构(第二章)

数据结构(第二章)

建立顺序表
void creat_sqlist(Sqlist L) { int i,n; cout<<"n=?; cin>>n; L.length=n; for (i=0; i<n; i++) cin>>L.a[i]; }
initlist(Sl);
输出顺序表
void outputl(Sqlist L) { int i; cout<<"List length" <<L.length<<endl; for (i=0; i<L.length; i++) { cout<<L.a[i]<<" "; if ((i+1)%10==0) cout<<endl; } cout<<endl; }
4. 合并:两表分别非递减有序(递增或等值),合并后 仍然非递减有序。
void merge_list(Sqlist a, Sqlist b, Sqlist &c) { int i,j,k; i=j=k=0; c.length=a.length+b.length; while (i<=a.length-1 && j<=b.length-1) { if (a.a[i]<=b.a[j]) {c.a[k]=a.a[i]; i++; k++;} else {c.a[k]=b.a[j]; j++; k++;} } while (i<=a.length-1) { c.a[k]=a.a[i]; i++; k++; } while (j<=b.length-1) { c.a[k]=b.a[j]; j++; k++; } }

数据结构第二章试题

数据结构第二章试题

第2章线性表一、选择题1.链表不具备的特点是()。

A.可随机访问任意结点B.插入删除不需要移动元素C.不必事先估计存储空间D.所需空间与其长度成正比2.不带头结点的单链表head为空的判定条件是()。

==NULLB. head->next==NULL >next==head!=NULL3.带头结点的单链表head为空的判定条件是()。

==NULLB. head->next==NULL >next==head!=NULL4.带头结点的双循环链表L为空表的条件是()。

A.L==NULL B.L->next->==NULL C.L->prior==NULL >next==L5.非空的循环链表head的尾结点(由P所指向)满足()。

A.p->next==NULL B.p==NULL C.p->next==head ==head6.在循环双链表的p所指结点之前插入s所指结点的操作是()。

A.p->prior=s;s->next=p;p->prior->next=s;s->prior=p->prior;B.p->prior=s;p->prior->next=s;s->next=p;s->prior=p->prior;C.s->next=p;s->prior=p->prior;p->prior=s;p->right->next=s;D. s->next=p;s->prior=p->prior;p->prior->next=s;p->prior=s;7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点,则采用()存储方式最节省运算时间。

A.单链表B.给出表头指针的单循环链表C.双链表D.带头结点的双循环链表8.某线性表最常用的操作是在最后一个结点之后插入一个节点或删除第一个结点,故采用()存储方式最节省运算时间。

(完整版)数据结构第二章线性表1答案

(完整版)数据结构第二章线性表1答案

(A )需经常修改L 中的结点值 (E )需不断对L 进行删除插入第二部分线性表、选择题1 •关于顺序存储的叙述中,哪一条是不正确的 (B )A. 存储密度大B. 逻辑上相邻的结点物理上不必邻接C. 可以通过计算直接确定第i 个结点的位置D. 插入、删除操作不方便2.长度为n 的单链表连接在长度为 m 的单链表后的算法的时间复杂度为(C )A 0( n )B 0(1)C 0(m )D 0(m+n )3 .在n 个结点的顺序表中,算法的时间复杂度是0(1)的操作是:(A )A 访问第i 个结点(1<=i<=n )和求第i 个结点的直接前趋(2<=i<=n)B 在第i 个结点(1<=i<=n )后插入一个新结点C 删除第i 个结点(1<=i<=n)D 将n 个结点从小到大排序4.一个向量第一个兀素的存储地址是100 ,每个兀素的长度为 2 ,则第5 个兀素的地址是(B )( A ) 110 ( B ) 108 (C ) 100 ( D ) 1205 .已知一个顺序存储的线性表, 设每个结点需要占 m 个存储单元,若第一个结点的地址为 da ,则第i 个结点的地址为:(A )7 .链表是一种采用( B )存储结构存储的线性表。

(A )顺序 (B )链式 (C )星式 (D )网状8 .线性表若采用链式存储结构时,要求内存中可用存储单兀的地址:(D )(A )必须是连续的 (B )部分地址必须是连续的 (C )一定是不连续的(D )连续或不连续都可以9 .线性表L 在_ ( B )情况下适用于使用链式结构实现。

A ) da+(i-1)*mB ) da+i*m6.在具有n 个结点的单链表中,实现(A )遍历链表和求链表的第i 个结点C )删除开始结点 C ) da-i*mD ) da+(i+1)*mA )的操作,其算法的时间复杂度为 0(n )。

B )在地址为p 的结点之后插入一个结点D ) 删除地址为p 的结点的后继结点10.在长度为n 的顺序表的第i(1 < i < n+1)个位置上插入一个兀素,兀素的移动次数为( A )A.n-i+1B.n-iC.iD.i-1.线性表是( A )。

数据结构第二章课后答案.

数据结构第二章课后答案.

数据结构第二章课后答案.在数据结构的学习中,第二章通常会涉及一些关键的概念和知识点。

让我们一起来详细探讨一下。

首先,我们要明确数据结构中一些基本的定义和分类。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

在第二章中,常见的比如线性表就是一个重要的结构。

线性表是一种最简单也是最常用的数据结构之一。

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

从存储结构上来看,线性表可以分为顺序存储和链式存储。

顺序存储的线性表,就像是在一个连续的存储空间中,依次存放着线性表的元素。

优点是可以随机访问,即通过下标就能快速找到对应的元素。

但缺点也很明显,插入和删除操作可能需要移动大量的元素,比较费时。

而链式存储的线性表,则是通过指针将各个元素链接起来。

每个节点包含数据域和指针域。

这种存储方式的优点是插入和删除操作比较方便,只需要修改指针即可。

但缺点是不能随机访问,需要从头节点开始依次遍历才能找到目标元素。

在实际应用中,选择哪种存储方式要根据具体的需求来决定。

如果经常需要进行随机访问,而插入和删除操作较少,那么顺序存储可能更合适;如果插入和删除操作频繁,而对随机访问的要求不高,链式存储则更具优势。

再来说说线性表的基本操作。

比如初始化线性表,就是为线性表分配存储空间,并将其初始化为空。

还有求线性表的长度,通过遍历节点来计算元素的个数。

插入操作分为在指定位置插入和在表尾插入。

在指定位置插入时,需要先将插入位置后面的元素依次向后移动,然后再将新元素插入。

删除操作也类似,需要先找到要删除的元素,然后将其后面的元素依次向前移动。

对于线性表的遍历,常见的有顺序遍历和逆序遍历。

顺序遍历就是从表头开始,依次访问每个元素;逆序遍历则是从表尾开始向前访问。

接下来,我们看一些具体的例子。

比如一个学生成绩管理系统,我们可以用线性表来存储学生的成绩信息。

如果需要经常添加或删除学生成绩,那么采用链式存储会更方便操作。

再比如一个图书馆的图书管理系统,用线性表来存储图书的信息。

数据结构第二章习题

数据结构第二章习题

数据结构第二章习题第2章线性表一、单选题1.线性表是具有n个_________的有限序列。

a、表元素B.字符C.数据元素D.数据项2。

线性表格是。

a.一个有限序列,可以为空b.一个有限序列,不可以为空c.一个无限序列,可以为空d.一个无限序列,不可以为空3.线性表采用链表存储时,其地址_________。

a、 U4。

列表中不连续的部分必须是U4。

a.可随机访问任一结点b.插入删除不需要移动元素c.不必事先估计存储空间d.所需空间与其长度成正比5.设线性表有n个元素,以下操作中,_________在顺序表上实现比在链表上实现效率更高。

a、输出I(1≤ 我≤ n) th元素值b.交换第1个元素与第2个元素的值c.顺序输出这n个元素的值d、输出与线性表中给定值x相等的元素序列号6.设线性表中有2n个元素,以下操作中,_________在单链表上实现要比在顺序表上实现效率更高。

a.删除指定的元素b、在最后一个元素后插入新元素。

C.按顺序输出前k个元素d.交换第i个元素和第2n-i-1个元素的值(i=0,1…,n-1)7.如果最常见的操作是获取第i个节点及其前体,请使用___________________。

a.单链表b.双链表c、与单链表相比,双链表的优点之一是。

a.插入和删除操作更简单b.可以进行随机访问c.可以省略表头指针或表尾指针d.访问前后相邻结点更灵活9.带头结点的单链表l为空的判定条件是_________。

a、 l==nullb.l->next==nullc.l->next==ld.l!=无效的10.在一个具有n个结点的有序单链表中插入一个新结点并仍然保持有序的时间复杂度是_________。

a、 o(1)b.o(n)c.o(n2)d.o(nlog2n)11.在一个长度为n(n>1)的带头结点的单链表h上,另设有尾指针r(指向尾结点),执行_________操作与链表的长度有关。

数据结构 第二章:线性表

数据结构 第二章:线性表

第二章线性表:习题习题一、选择题1.L是线性表,已知Length(L)的值是5,经运算?Delete(L,2)后,length(L)的值是( c)。

A.5B.0C.4D.62.线性表中,只有一个直接前驱和一个直接后继的是( )。

A.首元素 B.尾元素C.中间的元素 D.所有的元素+3.带头结点的单链表为空的判定条件是( )。

A. head= =NULLB. head->next= =NULLC. head->next=headD. head!=NULL4.不带头结点的单链表head为空的判定条件是( )。

A. head=NULLB. head->next =NULLC.head->next=headD. head!=NULL5.非空的循环单链表head的尾结点P满足()。

A. p->next = =NULLB. p=NULLC. p->next==headD. p= =head6.线性表中各元素之间的关系是( c)关系。

A.层次B.网状C.有序 D.集合7.在循环链表的一个结点中有()个指针。

A.1B.2 C. 0 D. 38.在单链表的一个结点中有()个指针。

A.1B.2 C. 0 D. 39.在双链表的一个结点中有()个指针。

A.1B.2 C. 0 D. 310.在一个单链表中,若删除p所指结点的后继结点,则执行()。

A.p->next= p->next ->next;B. p=p->next; p->next=p->next->next;C. p->next= p->next;D. p=p->next->next;11.指针P指向循环链表L的首元素的条件是()。

A.P= =L B. P->next= =L C. L->next=P D. P-> next= =NU LL12. 在一个单链表中,若在p所指结点之后插入s所指结点,则执行()。

数据结构第二章

数据结构第二章
L.elem[j] = L.elem[j+1]; --L.1ength; //表长减1 }// ListDelete_Sq
数据结构
17/58
插入/删除操作时间复杂度分析
第2章 线性表
基本操作:移动元素操作
n1
插入操作移动元素次数的期望值 Eis pi (n i 1) i 1
删除操作移动元素次数的期望值
GetElem(L, i, &e) 求表L中的第i个元素,结果由e返回;
ListInsert(&L, i, x) 在线性表中第i个元素之后(或之前) 插入一个新元素x;
ListDelete(&L, i, &e) 删除线性表中的第i个元素;
……
}ADT List
数据结构
5/58
第2章 线性表
利用上面的基本操作,还可以进行一些更复杂的操作,例如:
数据结构
1/58
基本内容
第2章 线性表
一、线性表的定义 二、线性表的顺序表示与实现 三、线性表的链式表示与实现 四、一元多项式的表示及相加 五、本章小结
数据结构
2/58
一、线性表的定义
第2章 线性表
线性结构的特点:在数据元素的非空有限集中
(1)存在惟一的一个被称作“第一个”的数据元素;
(2)存在惟一的一个被称作“最后一个”的数据元素;
n
Edl qi (n i)
i 1
等概率情况下(
pi
1 n 1
,
1 qi n
)
Eis
1 n 1
n1 i 1
(n i
1)
n 2
Edl
1 n
n i 1
(n i)

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

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

数据结构与算法华东师范大学计算机系杨沛第二章线性表2.1 线性表的基本概念线性表是具有相同数据类型的数据元素的有限序列。

由n(n≥0)个数据元素k0,k1,…,kn-1组成的线性表记为(k0 ,k1 ,…,kn-1),线性表中包含的数据元素的个数n称为线性表的长度(length),称长度为零的线性表为空的线性表(简称为空表)。

相关概念:表头、表尾、前驱、后继有序线性表:数据元素的相对位置与它们的值有联系。

无序线性表:数据元素的相对位置与它们的值没有联系。

第二章线性表例小于20的质数组成的线性表(2,3,5,7,11,13, 17,19);英文字母表也是线性表,表中每个字母是一个数据元素:(A,B,C,……,Z);2.2 顺序表2.2.1 线性表顺序表(sequential list)就是顺序存贮的线性表,即用一组连续的存贮单元依次、连续地存贮线性表中的结点。

如果每个结点占用s个存贮单元,并假设存放结点ki(0≤i≤n-1)的开始地址为loc(k0),则结点ki的地址loc(ki)可表示成Loc(ki) =loc(k0) + i*s。

2.2 顺序表在C 语言中,可用数组表示线性表:#define MAXN 100int list[MAXN];int n;线性表的结点k 0,k 1,…,k n-1依次存放在数组单元list[0],list[1],…,list[n-1]。

2.2.1 线性表最大表长实际表长线性表2.2 顺序表2.2.1 线性表假设s=sizeof(int),则可得到计算ki的地址的公式,因loc(ki)=&list[i],而&list[i]=&list[0]+i·s,故loc(ki)=&list[0]+i·s。

2.2 顺序表2.2.2 顺序表的操作(1)初始化:初始长度置为0即可(n=0;),数组空间在编译时分配。

(2)顺序表的插入:插入算法的C函数SqListInsert():若插入位置i不在可以插入的位置上,即i<0或i>n,则返回0;若n=MAXN,即线性表已满,此时数组list[]没有多余的存贮单元可以存放新结点,则返回-1;若插入成功,则返回12.2 顺序表实际表长(2)顺序表的插入:int SqListInsert(int list[],int*p_n,int i,int x) {int j;if(i<0||i>*p_n)return(0);//i不是合法的插入位置if(*p_len==MAXN)return(-1);//线性表已满2.2 顺序表for(j=*p_n;j>i;j--)list[j]=list[j-1];//结点右移list[i]=x;(*p_n)++;//表长加1return(1);}2.2 顺序表(2)顺序表的插入:对于存放在数组list[]中的、具有n个结点的顺序表,为了把值为x的结点插在表的位置i(0≤i≤n)上,可调用如下的语句:k=SqListInsert(list, &n, i, x);注:结点移动是本算法的关键操作2.2 顺序表(3)顺序表的删除:删除算法的C函数SqListDelete():在具有n个结点的顺序表中,删除第i(0≤i≤n-1)个位置上的结点,使线性表长度减1,若删除位置不合法,即i<0或i≥n,则返回0;若删除位置合法,即0≤i≤n-1,则删除成功,返回1。

数据结构第二章学习小结

数据结构第二章学习小结

数据结构第⼆章学习⼩结⼀、数据结构第⼆章知识点2.1-2.32.1 线性表的定义与特点2.2 案例引⼊1.⼀元多项式的运算:顺序表2.稀疏多项式的运算:链式表3.图书信息管理系统:查找/插⼊/删除等操作2.3 线性表的类型定义ADT定义2.4 线性表的顺序表⽰与实现1.顺序存储结构(随机存取)2.基本操作实现算法:初始化/取值/查找/插⼊/删除3.补充:讨论时间复杂度O(n)和空间复杂度S(n),默认是最坏情况下插⼊,删除等操作时间复杂度都为O(n):查找第i个元素,时间复杂度为O(1);查找值为x时,时间复杂度为O(n)。

若顺序表长度很⼤,注意内存分配空间是否⾜够2.5 线性表的链式表⽰和实现1.链式存储结构(顺序存取)2..基本操作实现算法:创建/初始化/取值/查找/插⼊/删除(头插法,尾插法)3.循环链表(带头尾指针,只带尾指针),双向链表4.补充程序退出时回收空间(链表/结点)创建头结点⽅便删除/插⼊等操作指针作为形参,若修改了指针的直接空间,要加&。

若是间接空间,可以不加&。

2.6-2.92.6顺序表和链表的⽐较顺序表适⽤于长度变化不⼤,插⼊删除操作较少链表适⽤于长度变化较⼤,插⼊删除操作较多2.7 线性表的应⽤线性表合并(书)有序表合并(书)线性表或有序表求交集的ADT定义ADT List{数据对象: D={ai I ai∈ElemSet, i=1, 2, ..., n, n>=0}数据关系: R={ <ai-1, ai>|ai-1, ai∈D, i=1, 2, ..., n}基本操作:InitList(&L)操作结果:构造⼀个空的线性表 L。

ListLength(L)初始条件:线性表 L 已存在。

操作结果:返回 L 中数据元素个数。

GetElem(L, i, &e)初始条件:线性表 L 巳存在,且1<=i<=ListLength(L)。

数据结构重点章节讲解

数据结构重点章节讲解

自考冲刺资料——数据结构重点章节讲解特别鸣谢:第二章线性表线性表是一种最简单、最常见的数据结构。

一、本章总述本章主要讨论了线性表及它的两种存储实现:顺序实现和链接实现。

线性表是一种最简单、最常见的数据结构。

线性表的逻辑结构特性是数据元素之间存在着线性关系,在计算机中表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。

用前者表示的线性表简称为顺序表,用后者表示的线性表简称为链表。

二、本章重点熟练掌握顺序表和单链表上实现的各种基本算法及相关的时间性能分析。

三、本章难点使用本章所学的基本知识设计有效算法解决与线性表相关的应用问题。

四、本章知识点1、线性表的逻辑结构的基本特征图2-1 线性表线性结构是一个数据元素的有序(次序)集1).集合中必存在唯一的一个“第一元素”;2).集合中必存在唯一的一个“最后元素”3).除最后元素之外,均有唯一的后继;4).除第一元素之外,均有唯一的前驱。

2、线性表的顺序存储实现顺序表是线性表的顺序存储结构。

用一组地址连续的存储单元依次存储线性表的元素。

顺序表特点:逻辑顺序与物理顺序一致属随机存取的存储结构,即存取每个元素所花时间相等假设线性表中每个元素需占用c个存储单元,计算结点存储地址公式:LOC(ai+1)=LOC(ai)+c (1)LOC(ai)=LOC(a1)+(i-1)*c (2)顺序表上实现基本运算及时间复杂度分析。

1)插入算法:假设在第 i 个元素之前插入的概率为 pi,则在长度为n的线性表中插入一个元素所需移动元素次数的期望值为:若假定在线性表中任何一个位置上进行插入的概率都相等,则移动元素的期望值为:插入算法的平均时间复杂性为,平均时间复杂性量级为O(n)。

2)删除算法:假设删除第 i 个元素的概率为qi , 则在长度为n的线性表中删除一个元素所需移动元素次数的期望值为:若假定在线性表中任何一个位置上进行删除的概率都是相等的,则移动元素的期望值为:删除算法的平均时间复杂性为,平均时间复杂性量级为O(n)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
23
2013-8-16
串的顺序存储结构
• 将串的各个字符,按顺序存入连续的存 储单元中,使逻辑上相邻的字符在内存 中也相邻。也称为顺序串。
2013-8-16
24
串运算
• • • • • • • 求串的长度 两个串比较 两个串的联接 取子串运算 插入、删除字串运算 求子串位置(也称字符串匹配或模式匹配) ……
25
2013-8-16
2.4.2 字符串匹配
• 串的模式匹配 判断串P是否在另一个串S中,若在则给出其 在S串中的起始位置。串S 叫作“正文”,串 P 叫作“模式”。设串S的长度为n,串P的长 度为m。 • P是S的子串的必要条件是: m ≤ n
2013-8-16 26
1、简单匹配算法(Brute - Force — BF) 匹配成功, i,0 i,1 i,2耶! i,5i,6 i,3 i,4
2013-8-16 17
循环队列类详见教材P40: sq_Queue.h
2013-8-16
18
例2 .6 建立容量为10的空循环队列,然 后输出排头与队尾指针以及队中元素;依 次将50、60、70、80、90、100等六个数入 队,输出排头与队尾指针以及队列中元素; 再连续将三个元素出队,最后再输出排头 与队尾指针以及队列中元素。
2013-8-16
38
2013-8-16
13
入队
• 入队运算的操作过程如下: 1. 首先判断循环队列是否满:当循环队列 非空(s等于1)且队尾指针等于排头指 针时,说明循环队列已满,不能进行入 队运算。这种情况称为“上溢”。此时 给出提示,算法结束。 2. 将队尾指针进一(即rear=rear+1), 并当rear等于m+1时rear=1。 3. 将新元素x插入到队尾指针指向的位置, 并且置循环队列非空标志。
请问在这两种情况下,循环队列中各有多少元素?
2013-8-16
10
front
★ ★ ★ ★
rear
2013-8-16 11
rear
★ ★
★ ★ ★ ★
front
12
2013-8-16
• 设循环队列的容量为m 1. 如果rear>front,则循环队列中的元素 个数为rear-front 2. 如果rear<front,则循环队列中的元素 个数为m-front+rear
2013-8-16 8
循环队列空
循环队列满
front rear
4 3
5 2 6
rear
a5 a4
a3
4 3
5 2 6 a6
front
1
1
a1
a2
s == 0
2013-8-16
s == 1
9
请大家分析:如何求循环队列中有多少元素 • 设循环队列的容量为10(序号为1-10)。先经 过一系列的入队与退队操作后,有 1. front=5,rear=9 2. front=9,rear=5
正文字符串S= ababababcababcbaa 模式P = ababcb 要求在S中检测P的存在
2013-8-16
32
P = ababcb,求失败链接数组flink[6]
f[0]=0 f[1]=1 f[2]=1 f[3]=2 f[4]=3 f[0]总是为0 b前面只有a所以得0+1 a前面有b和ab,ab不是真字串排除,b和p串不 匹配,所以得0+1 b前面有a,ba,和aba;ba和P串不匹配,aba不 是真字串排除,所以a被选中,得1+1
2013-8-16
19
#include "sq_Queue.h" int main() { sq_Queue<int> q(10); //建立容量为10的空循环队列,元素为整型 cout <<"输出排头与队尾指针以及队中元素:" <<endl; q.prt_sq_Queue(); //输出排头与队尾指针以及队中元素 q.ins_sq_Queue(50); q.ins_sq_Queue(60); q.ins_sq_Queue(70); q.ins_sq_Queue(80); q.ins_sq_Queue(90); q.ins_sq_Queue(100); cout <<"输出排头与队尾指针以及队中元素:" <<endl; q.prt_sq_Queue(); //输出排头与队尾指针以及队中元素 cout <<"输出退队元素:" <<endl; cout <<q.del_sq_Queue() <<endl; cout <<q.del_sq_Queue() <<endl; cout <<q.del_sq_Queue() <<endl; cout <<"再次输出排头与队尾指针以及队中元素:" <<endl; q.prt_sq_Queue(); //再次输出排头与队尾指针以及队中元素 return 0; }
第二章 线性表及其顺序存储结构
2013-8-16
1
2.3
队列(Queue)及其应用
2013-8-16
2
2.3.1 队列概念
• 队列的定义 队列(queue)是在一端进行插入,在另一端进行删 除操作的线性表。First In First Out - FIFO Queue
出队 队头 队尾
2013-8-16 3
2013-8-16 15
循环队列类的实现
2013-8-16
16
template <class T> class sq_Queue { private: int mm; int front; int rear; int s; T *q; public: sq_Queue(int); void prt_sq_Queue(); int flag_sq_Queue(); void ins_sq_Queue(T); T del_sq_Queue(); };
KMP匹配 (C++描述)
• 具体代码参见教材P54
2013-8-16
35
• 处理正文串函数的执行时间是O(n).而构
造失败链接数组的函数的执行时间为
O(m).因此在正文字符串S中找到模式 P
的运行时间总共是O(n+m)。
2013-8-16
36


2013-8-16
37
作业:P55 第四题 预习实验三 循环队列的实现
串S, n=10
A C A B A B C B C C A B A B C B C A A
串P, m=5
j,0 j,1j,0 j,1 j,2 j,3j,4 j,0
2013-8-16
演示
27
BF匹配 (C++描述)
具体参见教材P51
2013-8-16
29
BF匹配算法分析
• 该匹配算法比较简单,但效率不高。最 坏比较总次数为 (n-m+1)*m 。若n>>m 则运行时间为O(nm)。
2013-8-16
4
队列的运算和声明
• 入队:在队列尾部插入一个新元素x。 • 退队:删除队列中的队首元素。 • 检测队列状态。 • 取队列的队首元素。 • 创建一个空队列Q。 ……
2013-8-16
5
2.3.2 循环队列及其运算
• 把队列空间从逻辑上看成是一个首尾相连的环。 入队一次:rear=rear+1;若rear=6+1,则rear=1;退队一次:front=front+1;若front=6+1;则front=1; • 如何判断一个循环队列是满还是空?
2013-8-16
30
2、KMP匹配算法
• KMP匹配算法 由D.E.Knuth、J.H.Morris和V.R.Pratt发现 • 问题的提出 i
42个0
S 0000000000000000000000000000000000000000001 P 00000001
j
由于每趟比较都是在p的最后一个字符才出现不等,i将回溯到i-6的 位置,再重新从p的第一个字符开始比较。整个匹配过程中i 需回溯 2013-8-16 31 36(即:43- 8+1)次。
a1a2a3a4 a5 进队
• 队列是指允许在一端进行插入、而在另 一端进行删除的线性表。允许插入的一 端称为队尾,通常用一个称为尾指针 (rear)的指针指向队尾元素,即尾指 针总是指向最后被插入的元素;允许删 除的一端称为队头(也称排头),通常 也用一个指针(front)指向队头元素的 前一个位置。
c前面有b,ab,bab,abab;b和bab和p串不匹配, abab不是真字串,所以ab被选中,得2+1 b前面有c,bc,abc,babc,ababc;前面4个和p串 不匹配,后面一个不是真字串,所以得0+1
33
f[5]=1
2013-8-16
失败链接数组与正文字符串S无关!
正文字符串S= ababababcababcbaa 模式P = ababcb, flink[6] ={0,1,1,2,3,1}
2013-8-16 20
队列的应用
给工人分配工作的模拟 输入输出缓存区的结构 汽车加油站的工作模拟
2013-8-16
21
2.4 字符串
2013-8-16
22
• 字符串 是由n(n≥0)个字符组成的有限序列,记为:
2.4.1 字符பைடு நூலகம்的概念
“ a1 a2 a3 … an ”
相关文档
最新文档