当前位置:文档之家› 数据结构查找习题及复习资料

数据结构查找习题及复习资料

数据结构查找习题及复习资料
数据结构查找习题及复习资料

第9章查找

一、单选题

1.对一棵二叉搜索树按()遍历,可得到结点值从小到大的排列序列。

A. 先序

B. 中序

C. 后序

D. 层次

2.从具有n个结点的二叉搜索树中查找一个元素时,在平均情况下的时间复杂度大致为()。

A. O(n)

B. O(1)

C. O(logn)

D. O(n2)

3.从具有n个结点的二叉搜索树中查找一个元素时,在最坏情况下的时间复杂度为()。

A. O(n)

B. O(1)

C. O(logn)

D. O(n2)

4.在二叉搜索树中插入一个结点的时间复杂度为()。

A. O(1)

B. O(n)

C. O(logn)

D. O(n2)

5.分别以下列序列构造二叉搜索树,与用其它三个序列所构造的结果不同的是()。

A.(100,80,90,60,120,110,130)

B.(100,120,110,130,80,60,90)

C.(100,60,80,90,120,110,130)

D.(100,80,60,90,120,130,110)

6.在一棵AVL树中,每个结点的平衡因子的取值范围是()。

A. -1~1

B. -2~2

C. 1~2

D. 0~1

7.根据一组关键字(56,42,50,64,48)依次插入结点生成一棵A VL树,当插入到值

为()的结点时需要进行旋转调整。

A. 42

B. 50

C. 64

D. 48

8.深度为4的A VL树至少有()个结点。

A.9 B. 8 C. 7 D. 6

9.一棵深度为k的A VL树,其每个分支结点的平衡因子均为0,则该平衡二叉树共有()

个结点。

A.2k-1-1

B.2k-1+1

C.2k-1

D.2k

10.在A VL树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A的左

孩子的平衡因子为0,右孩子的平衡因子为1,则应作()型调整以使其平衡。

A. LL

B. LR

C. RL

D. RR

二、判断题

1.二叉搜索树的任意一棵子树中,关键字最小的结点必无左孩子,关键字最大的结点必无

右孩子。

2.二叉搜索树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字

值,且小于其右非空子树(若存在的话)所有结点的关键字值。

3.二叉搜索树按照中序遍历将各结点打印出将各结点打印出来,将得到按照由小到大的排

列。

4.若二叉搜索树的根结点没有左儿子,则根结点一定是值最小的结点。

5.二叉搜索树一定是满二叉树。

6.从二叉搜索树的根结点一直沿右儿子向下找不一定能找到树中值最大的结点。

7.二叉搜索树的充要条件是任一结点的值均大于其左孩子的值,小于其右孩子的值。

8.若二叉搜索树中关键码互不相同,则其中最小元素和最大元素一定是叶子结点。

9.在任意一棵非空二叉搜索树中,删除某结点后又将其插入,则所得二叉搜索树与原二叉

搜索树相同。

10.当向二叉搜索树中插入一个结点,则该结点一定成为叶子结点。

11.A VL树是指左右子树的高度差的绝对值不大于1的二叉树。

12.A VL是一棵二叉树,其树上任一结点的平衡因子的绝对值不大于1。

13.在A VL树中,向某个平衡因子不为零的结点的树中插入一新结点,必引起平衡旋转。

三、填空题

1.在一棵二叉搜索树上实施遍历后,其关键字序列是一个有序表。

2.一个无序序列可以通过构造一棵_______而变成一个有序序列,构造树的过程即为对无

序序列进行排序的过程。

3.在一棵二叉搜索树中,每个分支结点的左子树上所有结点的值一定________该结点的值,

右子树上所有结点的值一定________该结点。

4.从一棵二叉搜索树中查找一个元素时,若元素的值等于根结点的值,则表明_______,

若元素的值小于根结点的值,则继续向_______查找,若元素的值大于根结点的值,则继续向________查找。

5.向一棵二叉搜索树中插入一个元素时,若元素的值小于根结点的值,则接着向根结点的

________插入,若元素的值大于根结点的值,则接着向根结点的________插入。

6.根据n个元素建立一棵二叉搜索树的时间复杂度大致为________。

7.二叉树中某一结点左子树的深度减去右子树的深度称为该结点的_______。

8.深度为4的平衡二叉树中至少有个结点,至多有个结点。

9.在一棵AVL树中,每个结点的左子树高度与右子树高度之差的绝对值不超过________。

四、应用题

1.一棵二叉搜索树的结构如下图所示,结点的值为1~8,请标出各结点的值。

2.若依次输入序列{62,68,30,61,25,14,53,47,90,84}中的元素,生成一棵二叉搜索树。画出

生成后的二叉搜索树(画出生成过程)。

3.依次读入给定的整数序列{7,16,4,8,20,9,6,18,5},构造一棵二叉搜索树,并计算在等概率

情况下该二叉搜索树的平均查找长度ASL。(要求给出构造过程)

4.从空二叉树开始,严格按照二叉搜索树的插入算法(不进行平衡旋转),逐个插入关键

码{18, 73, 10, 5, 68, 99, 27, 41, 51, 32, 25}构造出一棵二叉搜索树,画出这棵二叉搜索树并写出其前序、后序遍历序列。

5.若一棵二叉搜索树的关键字输入序列为{80,6,10,7,8,25,100,90},请画出该二

叉搜索树。

6.设有一组初始记录关键字为(45,80,48,40,22,78),要求构造一棵二叉搜索树并给

出构造过程。

7.假定一个关键字序列为(38, 52, 25, 74, 68, 16, 30, 54, 90, 72),画出按序列中元素的次序

生成的一棵二叉搜索树,求出其平均查找长度。

8.将数列(24,15,38,27,121,76,130)的各元素依次插入一棵初始为空的二叉搜索

树中,请画出最后的结果并求等概率情况下查找成功的平均查找长度。

9.输入一个正整数序列{40, 28, 6, 72, 100, 3, 54, 1, 80, 91, 38},建立一棵二叉搜索树,然后

删除结点72,分别画出该二叉树及删除结点72后的二叉树。

10.根据元素插入的先后次序不同,可构成多种形态的二叉搜索树。请画出4棵含1,2,3,

4四个元素且以1为根、深度为3的二叉搜索树。

11.请画出从下面的二叉搜索树中删除关键码40后的结果。

20

1140

62450

835

4560

3

28

12.对关键字序列(25, 16, 34, 39, 28, 56),

1)画出按此序列生成的二叉搜索树。

2)计算等概率下查找成功时的平均查找长度。

13.输入一个正整数序列(53, 17, 12, 66, 58, 70, 87, 25, 56, 60),试完成下列各题。

(1)按次序构造一棵二叉搜索树BS。

(2)依此二叉搜索树,如何得到一个从大到小的有序序列?

(3)假定每个元素的查找概率相等,试计算该二叉搜索树的平均查找长度

(4)画出在此二叉搜索树中删除“66”后的树结构。

14.试推导深度为5的平衡二叉树最少包含多少个结点,并画出一棵这样的树。

15.画出在一个初始为空的A VL树中依次插入3, 1, 4, 6, 9, 8, 5, 7时每一插入后A VL树的形

态。若做了某种旋转,说明旋转的类型。

16.给定一个关键字序列4, 5, 7, 2, 1, 3, 6,生成一棵A VL树,画出构造过程。

17.给定关键字序列4, 5, 7, 2, 1, 3, 6,分别生成二叉搜索树和A VL树,并用二叉搜索树和

A VL树两种方法查找,给出查找6的查找次数及查找成功的平均查找长度。

18.给定关键词输入序列{CAP, AQU, PIS, ARI, TAU, GEM, CAN, LIB, VIR, LEO, SCO},假

定关键词比较按英文字典序,试画出从一棵空树开始,依上述顺序(从左到右)输入关键词,用A VL树的插入算法生成一棵A VL树的过程,并说明生成过程中采用了何种转动方式进行平衡调整,标出树中各结点的平衡因子。

参考答案

一、

1-5. BCABC6-10. ABCCC

二、

1-5. √√√√×6-10. ××××√11-13. √√×

三、

1.中序

2.二叉搜索树

3.小于,大于

4.查找成功,左子树,右子树

5.左子树,右子树

6.O(n2)

7.平衡因子

8.7, 15

9.1

四、

1.

2.

3.

ASL= (1+2*2+3*3+4*3)/9 = 26/9 = 2.89

4.

前序:18 10 5 73 68 27 25 41 32 51 99

后序:5 10 25 32 51 41 27 68 99 73 18

5.

6.

7.二叉搜索树如图所示,平均查找长度等于32/10。

8.平均查找长度=1+2×2+3×2+4×2=19/7。

9.

二叉搜索树删除72后的二叉搜索树

10.

11.

12.(1)

(2)(1+2*2+3*2+4*1)/6 = 2.5

13.(1)构造的二叉搜索树为:(4)删除结点66后

(2) 对于一个二叉搜索树,想得到一个从大到小的序列只要先读右子树再读根结点,最后读左子树的遍历这颗二叉树就可以了。如果是要从小到大的序列,则只需中序遍历这颗二叉树即可。

(3)该二叉树的平均查找长度为:ASL=(1*1+2*2+3*4+4*3)/10=2.9

14.略

15.

16.

17.二叉搜索树A VL树

从二叉搜索树查找6需4次,平均查找长度ASL=(1+2+2+3+3+3+4)/7=18/7≈2.57。从平衡二叉树查找6需2次,平均查找长度ASL=(1+2+2+3+3+3+3)=17/7≈2.43。

18.

数据结构顺序表真题

第二章复习题 本章重点掌握:线性结构特点,顺序存储结构和链式存储结构特点。 1.在顺序表中插入或删除一个元素,需要平均移动( 一半 )元素,具体移动的元素个数与( 插入或删除的位置 )有关。插入时平均 次数(n/2 ),删除时平均次数((n-1)/2 )。 2.有一个含头结点的循环链表,头指针为 head, 则其为空的条件是:( C ) A)head==NULL B)head->next==NULL C)head->next==head 3.在长度为 n 的顺序表的第 i 个位置上插入一个元素(1≤i≤n+1),元素的移动次数为:( A ) A) n – i + 1 B) n – i C) i D) i – 1 4.对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为( C ) A)顺序表B) 用头指针表示的循环单链表 C) 用尾指针表示的循环单链表D) 单链表 5.设单链表中结点的结构为(data, link)。已知指针 q 所指结点是指针 p 所指结点的直接前驱,若在*q 与*p 之间插入结点*s,则应执行下列哪一个操作?( B ) A)s->link = p->link;p->link = s;(B) q->link = s;s->link = p; (C) p->link = s->link;s->link = p;(D) p->link = s;s->link = q; 6.设单链表中结点的结构为(data, link)。已知指针 p 所指结点不是尾结点,若在*p 之后插入结点*s,则应执行下列哪一个操作?(B)

A)s->link = p;p->link = s;(B) s->link = p->link;p->link = s; (C) s->link = p->link;p = s;(D) p->link = s;s->link = p; 7.设单链表中结点的结构为(data, link)。若想摘除结点*p 的直接后继,则应执行下列哪一个操作?(A) (A) p->link = p->link->link; (B) p = p->link;p->link = p->link->link; (C) p->link = p->link;(D) p = p->link->link; 8.设单循环链表中结点的结构为(data, link),且 rear 是指向非空的 带表头结点的单循环链表的尾结点的指针。若想删除链表第一个结点,则应执行下列哪一个操作?(D) (A)s = rear;rear = rear->link;delete s; (B)rear = rear->link;delete rear; (C)rear = rear->link->link;delete rear; (D)s = rear->link->link;rear->link->link = s->link; delete s; (rear 指向尾结点,rear->link->link 指向第一个结点,第一个结点变为原来的第二个结点) 9.设双向循环链表中结点的结构为(data, lLink, rLink),且不带表头 结点。若想在指针 p 所指结点之后插入指针 s 所指结点,则应执 行下列哪一个操作?( D )

数据结构第7章-答案

一、单选题 C01、在一个图中,所有顶点的度数之和等于图的边数的倍。 A)1/2 B)1 C)2 D)4 B02、在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的倍。 A)1/2 B)1 C)2 D)4 B03、有8个结点的无向图最多有条边。 A)14 B)28 C)56 D)112 C04、有8个结点的无向连通图最少有条边。 A)5 B)6 C)7 D)8 C05、有8个结点的有向完全图有条边。 A)14 B)28 C)56 D)112 B06、用邻接表表示图进行广度优先遍历时,通常是采用来实现算法的。 A)栈 B)队列 C)树 D)图 A07、用邻接表表示图进行深度优先遍历时,通常是采用来实现算法的。 A)栈 B)队列 C)树 D)图 A08、一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构,则计算该有向图中某个顶点出度的时间复杂度为。 A)O(n) B)O(e) C)O(n+e) D)O(n2) C09、已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是。 A)0 2 4 3 1 5 6 B)0 1 3 6 5 4 2 C)0 1 3 4 2 5 6 D)0 3 6 1 5 4 2 B10、已知图的邻接矩阵同上题,根据算法,则从顶点0出发,按广度优先遍历的结点序列是。 A)0 2 4 3 6 5 1 B)0 1 2 3 4 6 5 C)0 4 2 3 1 5 6 D)0 1 3 4 2 5 6 D11、已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是。 A)0 1 3 2 B)0 2 3 1 C)0 3 2 1 D)0 1 2 3 A12、已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是。 A)0 3 2 1 B)0 1 2 3 C)0 1 3 2 D)0 3 1 2 A13、图的深度优先遍历类似于二叉树的。 A)先序遍历 B)中序遍历 C)后序遍历 D)层次遍历 D14、图的广度优先遍历类似于二叉树的。 A)先序遍历 B)中序遍历 C)后序遍历 D)层次遍历 B15、任何一个无向连通图的最小生成树。 A)只有一棵 B)一棵或多棵 C)一定有多棵 D)可能不存在 A16、对于一个具有n个结点和e条边的无向图,若采用邻接表表示,则顶点表的大小为,所有边链表中边结点的总数为。 A)n、2e B)n、e C)n、n+e D)2n、2e C17、判断有向图是否存在回路,可以利用___算法。 A)关键路径 B)最短路径的Dijkstra C)拓扑排序 D)广度优先遍历 A18、若用邻接矩阵表示一个有向图,则其中每一列包含的“1”的个数为。 A)图中每个顶点的入度 B)图中每个顶点的出度 C)图中弧的条数 D)图中连通分量的数目

数据结构-顺序表的查找插入与删除

一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个整数,产生顺序表,并输入结点值。 2.从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找 不到,则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出顺序表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 二、源程序及注释: #include #include /*顺序表的定义:*/ #include #define ListSize 100 /*表空间大小可根据实际需要而定,这里假设为100*/ typedef int DataType; /*DataType可以是任何相应的数据类型如int, float或char*/ typedef struct { DataType data[ListSize]; /*向量data用于存放表结点*/ int length; /*当前的表长度*/ }SeqList; void main() { SeqList L; int i,x; int n=10; /*欲建立的顺序表长度*/ L.length=0; void CreateList(SeqList *L,int n); void PrintList(SeqList L,int n); int LocateList(SeqList L,DataType x); void InsertList(SeqList *L,DataType x,int i); void DeleteList(SeqList *L,int i); CreateList(&L,n); /*建立顺序表*/ PrintList(L,n); /*打印顺序表*/ printf("输入要查找的值:"); scanf("%d",&x); i=LocateList(L,x); /*顺序表查找*/ printf("输入要插入的位置:"); scanf("%d",&i); printf("输入要插入的元素:"); scanf("%d",&x);

数据结构作业系统第七章答案

7.22③试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。注意:算法中涉及的图的基本操作必须在此存储结构上实现。 实现下列函数: Status DfsReachable(ALGraph g, int i, int j); /* Judge if it exists a path from vertex 'i' to */ /* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/ 图的邻接表以及相关类型和辅助变量定义如下:Status visited[MAX_VERTEX_NUM]; typedef char VertexType; typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; } ArcNode; typedef struct VNode { V ertexType data; ArcNode *firstarc; } VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum, arcnum; } ALGraph; Status DfsReachable(ALGraph g, int i, int j) /* Judge if it exists a path from vertex 'i' to */ /* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/ { int k; ArcNode *p; visited[i]=1; for(p=g.vertices[i].firstarc;p;p=p->nextarc) { if(p) { k=p->adjvex; if(k==j)return 1; if(visited[k]!=1)

数据结构实现顺序表的各种基本运算(20210215233821)

实现顺序表的各种基本运算 一、实验目的 了解顺序表的结构特点及有关概念,掌握顺序表的各种基本操作算法思想及其实现。 二、实验内容 编写一个程序,实现顺序表的各种基本运算: 1、初始化顺序表; 2 、顺序表的插入; 3、顺序表的输出; 4 、求顺序表的长度 5 、判断顺序表是否为空; 6 、输出顺序表的第i位置的个元素; 7 、在顺序表中查找一个给定元素在表中的位置; 8、顺序表的删除; 9 、释放顺序表 三、算法思想与算法描述简图

主函数main

四、实验步骤与算法实现 #in clude #in clude #defi ne MaxSize 50 typedef char ElemType; typedef struct {ElemType data[MaxSize]; in t le ngth; void In itList(SqList*&L)〃 初始化顺序表 L {L=(SqList*)malloc(sizeof(SqList)); L->le ngth=0; for(i=0;ile ngth;i++) prin tf("%c ",L->data[i]); } void DestroyList(SqList*&L)〃 {free(L); } int ListEmpty(SqList*L)〃 {retur n( L->le ngth==O); } int Listle ngth(SqList*L)〃 {return(L->le ngth); } void DispList(SqList*L)〃 {int i; 释放顺序表 L

实验一数据结构顺序表的插入和删除

实验一顺序表的操作 1. 实验题目:顺序表的操作 2.实验目的和要求: 1)了解顺 序表的基本概念、顺序表结构的定义及在顺序表上的基本操作(插入、 删除、查找以及线性表合并 )。 2)通过在 Turbo C ( WinTc ,或 visual stdio6 )实现以上操作的 C 语言 代码。 3)提前了解实验相关的知识(尤其是 C 语 言)。 3.实验内容:(二选一) 1) 顺序表的插入算法, 删除算法, 顺序表的合并算法 2) 与线性表应用相关的实例( 自己选择具体实例) 4.部分参考实验代码: ⑴ 顺序表结构的定义: #include #define MAXLEN 255 typedef int ElemType; typedef struct { ElemType elem[MAXLEN]; int length; }sqList; ⑵ 顺序表前插(在第i 号元素前插入一个新的元素) int ListInsert(sqList *la,int i,int x) { int j; if(i<0||i>la-> length +1) { printf( “ n the value of i is wrong! ” ); return 0; } if(la-> length +1>=MAXLEN) { printf( “ n overflow! ” ); return 0; }

. for(j=la-> length;j>=i;j--) la->list[j+1]=la->list[j]; la->list[i]=x; la-> length ++; return 1; } ⑶ 顺序表删除 int ListDelete(sqList *la,int i) { if(i<0||i>la-> length ) { printf( “ return 0; n”); } for(i;i length;i++) la->list[i-1]=la->list[i]; la-> length --; return 1; } 5.附录:实验预备知识: ⑴ 复习 C 语言中数组的用法。 ⑵ 了解线性表和顺序表的概念,顺序表的定义方法; 线性表是n 个数据元素的有限序列,至于每个数据元素的具体含义,在不同的情况下各不相同。 顺序表是线性表的顺序存储表示,是用一组地址连续的存储单元依次存储线性表的数据元素。 在 C 语言中,顺序表是用数组来实现的。 ⑶ 掌握线性表在顺序存储结构上实现基本操作:查找、插入、删除和 合并的算法。 在实现这些算法的时候,要注意判断输入数据的合法性,除此之外还要要注意以下内容: 在实现查找的时候,首先要判断该顺序表是否为空,其次要判断查找后的结果(查到时输出查到的数据,未查到时给出未查到提 示)。 在实现插入的时候,首先要判断该顺序表是否为满,如为满则报错 (此时要注意:顺序表是用数组来实现的,它不能随机分配空 间);如不为满,则需判断要插入的位置是否合法(例如:如果 一个线性表的元素只有10 个,而要在第0 个元素前插入或在第 11 个元素后插入就为不合法)。其次要注意是前插还是后插,两

数据结构习题汇编07第七章图试题

第七章图试题 一、单项选择题 1.在无向图中定义顶点的度为与它相关联的()的数目。 A. 顶点 B. 边 C. 权 D. 权值 2.在无向图中定义顶点 v i与v j之间的路径为从v i到达v j的一个()。 A. 顶点序列 B. 边序列 C. 权值总和 D. 边的条数 3.图的简单路径是指()不重复的路径。 A. 权值 B. 顶点 C. 边 D. 边与顶点均 4.设无向图的顶点个数为n,则该图最多有()条边。 A. n-1 B. n(n-1)/2 C. n(n+1)/2 D. n(n-1) 5.n个顶点的连通图至少有()条边。 A. n-1 B. n C. n+1 D. 0 6.在一个无向图中,所有顶点的度数之和等于所有边数的 ( ) 倍。 A. 3 B. 2 C. 1 D. 1/2 7.若采用邻接矩阵法存储一个n个顶点的无向图,则该邻接矩阵是一个 ( )。 A. 上三角矩阵 B. 稀疏矩阵 C. 对角矩阵 D. 对称矩阵 8.图的深度优先搜索类似于树的()次序遍历。 A. 先根 B. 中根 C. 后根 D. 层次 9.图的广度优先搜索类似于树的()次序遍历。 A. 先根 B. 中根 C. 后根 D. 层次 10.在用Kruskal算法求解带权连通图的最小(代价)生成树时,通常采用一个()辅助结构, 判断一条边的两个端点是否在同一个连通分量上。 A. 位向量 B. 堆 C. 并查集 D. 生成树顶点集合 11.在用Kruskal算法求解带权连通图的最小(代价)生成树时,选择权值最小的边的原则是该边不能 在图中构成()。 A. 重边 B. 有向环 C. 回路 D. 权值重复的边 12.在用Dijkstra算法求解带权有向图的最短路径问题时,要求图中每条边所带的权值必须是 ()。 A. 非零 B. 非整 C. 非负 D. 非正 13.在一个连通图中进行深度优先搜索得到一棵深度优先生成树,树根结点是关节点的充要条件是它至少 有()子女。

数据结构顺序表(电话通讯录)

数据结构用顺序表实现的电话通讯录(C语言) #include #include #include #include #define FALSE 0 #define ERROR 0 #define OK 1 #define INFEASIBLE -1 #define LIST_INIT_SIZE 10 #define LIST_INCREMENT 5 #define N 5 typedefint Status; typedefstruct { char name[10]; //姓名 char num[15]; //号码 }student; typedefstruct { student *elem; //存储空间基址 int length; //当前长度 intlistsize; //当前分配的存储空间(以sizeof(student)为单位) }Sqlist; Sqlist L; //定义全局变量L 为Sqllist类型 Status ListInsert(Sqlist&L,inti,student e) { //插入学生信息到顺序表L中 int j; student *newbase; if(i<1||i>L.length+1) return ERROR; //i值不合法 if(L.length>=L.listsize) //当前存储空间已满,增加分配 { newbase=(student *)realloc(L.elem,(LIST_INIT_SIZE+LIST_INCREMENT)*(sizeof(student))); if(!newbase) //存储分配失败 exit(OVERFLOW); L.elem=newbase; //新基址 L.listsize+=LIST_INCREMENT; //增加存储容量 } for(j=L.length;j>=i;j--) L.elem[j]=L.elem[j-1]; //插入位置及之后元素的右移 L.elem[i-1]=e; L.length++; return OK;

算法与数据结构的顺序查找

#include"stdio.h" #include"stdlib.h" #include"string.h" #define MAX 31 typedef struct {int*k; int*elem; char*aa; int length; }SSTable; int lw_Search(SSTable ST,int key) { int i; ST.elem[0]=key; for(i=ST.length;ST.elem[i]!=ST.elem[0];--i); return i; } int lw_Search2(SSTable ST,int n,int key) { int low=1;int high=ST.length;int mid,a=0; while(low<=high) { mid=(low+high)/2; printf("第%d次查找:在[%d,%d]中找到元素 ST[%d]: %d\n",++a,low,high,mid,ST.k[mid]); if(ST.k[mid]==key) return mid; else if(ST.k[mid]>key) high=mid-1; else low=mid+1; } return 0; } int lw_bubble(SSTable ST,int n) {int i,j,temp;int*a; for(i=1;iST.k[j]) {

temp=ST.k[i]; ST.k[i]=ST.k[j]; ST.k[j]=temp; } } int lw_prit(SSTable ST,int n) { int i;int*a; for(i=1;ikey) high=mid-1; else low=mid+1; } return 0; } char lw_bubble2(SSTable ST,int n) {int i,j;char temp; for(i=1;i

数据结构第7章习题答案

第7章 《图》习题参考答案 一、单选题(每题1分,共16分) ( C )1. 在一个图中,所有顶点的度数之和等于图的边数的 倍。 A .1/2 B. 1 C. 2 D. 4 ( B )2. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的 倍。 A .1/2 B. 1 C. 2 D. 4 ( B )3. 有8个结点的无向图最多有 条边。 A .14 B. 28 C. 56 D. 112 ( C )4. 有8个结点的无向连通图最少有 条边。 A .5 B. 6 C. 7 D. 8 ( C )5. 有8个结点的有向完全图有 条边。 A .14 B. 28 C. 56 D. 112 ( B )6. 用邻接表表示图进行广度优先遍历时,通常是采用 来实现算法的。 A .栈 B. 队列 C. 树 D. 图 ( A )7. 用邻接表表示图进行深度优先遍历时,通常是采用 来实现算法的。 A .栈 B. 队列 C. 树 D. 图 ( C )8. 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是 ( D )9. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按深度优先遍历的结点序列是 A . 0 2 4 3 1 5 6 B. 0 1 3 5 6 4 2 C. 0 4 2 3 1 6 5 D. 0 1 2 34 6 5 ( D )10. 已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是 ( A )11. 已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是 A .0 2 4 3 1 5 6 B. 0 1 3 6 5 4 2 C. 0 1 3 4 2 5 6 D. 0 3 6 1 5 4 2 ??? ? ?? ? ? ? ? ? ???????????0100011101100001011010110011001000110010011011110A .0 1 3 2 B. 0 2 3 1 C. 0 3 2 1 D. 0 1 2 3

数据结构实验一_顺序表的基本操作实验报告

实验一顺序表的基本操作 一、实验目的 掌握线性表的顺序表基本操作:建立、插入、删除、查找、合并、打印等运算。 二、实验要求包含有头文件和main函数; 1.格式正确,语句采用缩进格式; 2.设计子函数实现题目要求的功能; 3.编译、连接通过,熟练使用命令键; 4.运行结果正确,输入输出有提示,格式美观。 三、实验设备、材料和工具 1.奔腾2计算机或以上机型 2.turboc2,win-tc 四、实验内容和步骤 1. 建立一个含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2. 往该顺序表中第i位置插入一个值为x的数据元素。 3. 从该顺序表中第j位置删除一个数据元素,由y返回。 4. 从该顺序表中查找一个值为e的数据元素,若找到则返回该数据元素的位置,否则返回“没有找到”。 五、程序 #include #include #define list_init_size 10 #define increment 2

typedef struct { int *elem; int length,listsize; }sqlist; //类型定义 void initlist_sq(sqlist &L) //初始化顺序表 { } void output(sqlist L) //输出顺序表 { } void insertlist(sqlist &L,int i, int x) //顺序表中插入x { } void deletelist(sqlist &L,int j, int y) //顺序表中删除y { } int locateelem(sqlist &L,int e) //顺序表中查找e { } void main() { } 【运行结果】 void initlist_sq(sqlist &L) //初始化顺序表 { L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); if(!L.elem) exit (OVERFLOW);

数据结构顺序表

实验一顺序表的使用 一、实验目的 1、熟悉配书光盘和C++。 2、熟悉线性表的定义,理解顺序表的基本操作。 3、会使用顺序表的基本操作求解一些实际问题。 二、实验内容 1、上机运行在书中光盘所给程序并理解。 2、编写程序实现顺序表逆置算法。 3、创建2个单调递增的顺序表A,编写算法实现两个表的合并。 三、设计与编码 编写程序实现顺序表的逆置算法 算法设计:(1)定义一个新临时元素 (2)将i元素值赋予临时元素,将q-i元素值赋予首元素,将临时元素值赋予q-i元素。 编码:主函数 #include #include "SeqList.cpp" void Invert(int b[],int q); int main( ) { int i; int a[10]; cout<<"请输入十个数字"<>a[i]; } SeqList list(a,10); cout<<"顺序表的长度为:"<

b[q-i-1]=temp; } SeqList list1(b,q); list1.PrintList(); } 四:运行与测试 运行结果: 请输入十个数字 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 顺序表的长度为:10 顺序表的逆置程序: 10 9 8 7 6 5 4 3 2 1 Press any key to continue

数据结构实验一顺序表的实现

算法分析实验一顺序表的实现 班级学号姓名分数 一、实验目的: 1.掌握线性表的顺序存储结构 2.能熟练地利用顺序存储结构实现线性表的基本操作 3.能熟练地掌握顺序存储结构中算法的实现 二、实验要求 熟悉线形表的基本操作,对线形表能够进行插入、删除、修改、查找等操作。 三、实验内容及分析: 建立含有若干个元素的顺序表,并将结果在屏幕上输出。对刚建立的顺序表实现插入、删除、修改、查找,并将结果在屏幕上输出。 内容分析:先建立一个顺序表,定义表的最大长度为100,程序可以实现输出、查找、插入、删除操作。先定义一个整型变量i,用于初始线性表的长度,再输入所有元素,选择菜单里的选项实现功能。插入:选择需插入元素的位置,插入位置及后面的元素后移一位,再插入元素;删除:选择要删除元素的位置,将要删除的元素移出顺序表,删除位置后的元素前移一位;查找:输入要查找的元素,按顺序查找,当查找到顺序表的第一个与要查找的元素相同时,输出结果。 四、程序的调试及运行结果

五、程序代码 #include using namespace std; const int Max=100; <

initial(s); 示所有元素. " <>j; switch(j) { case '1':print(s);break; 2 a <>loc; //输入要删除的元素的位置 temp=del(s,loc,ch); //删除检查 if(temp==true) cout <<"删除了一个元素: " <>ch; //输入要查找的元素 loc=locate(s,ch); //寻找元素的位置 if(loc!=-1) { cout <<"该元素所在位置: " ; cout <<(loc+1) <

数据结构-第7章习题答案教学提纲

数据结构-第7章习 题答案

第7章《图》习题参考答案 一、单选题(每题1分,共16分) (C)1. 在一个图中,所有顶点的度数之和等于图的边数的倍。 A.1/2 B. 1 C. 2 D. 4 (B)2. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的倍。 A.1/2 B. 1 C. 2 D. 4 (B)3. 有8个结点的无向图最多有条边。 A.14 B. 28 C. 56 D. 112 (C)4. 有8个结点的无向连通图最少有条边。 A.5 B. 6 C. 7 D. 8 (C)5. 有8个结点的有向完全图有条边。 A.14 B. 28 C. 56 D. 112 (B)6. 用邻接表表示图进行广度优先遍历时,通常是采用来实现算法的。 A.栈 B. 队列 C. 树 D. 图 (A)7. 用邻接表表示图进行深度优先遍历时,通常是采用来实现算法的。 A.栈 B. 队列 C. 树 D. 图

( C )8. 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是 ( D )9. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按深度优先遍历的结点序列是 A . 0 2 4 3 1 5 6 B. 0 1 3 5 6 4 2 C. 0 4 2 3 1 6 5 D. 0 1 2 34 6 5 ( D )10. 已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是 ( A )11. 已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是 ( A )12. 深度优先遍历类似于二叉树的 A .先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历 A .0 2 4 3 1 5 6 B. 0 1 3 6 5 4 2 C. 0 1 3 4 2 5 6 D. 0 3 6 1 5 4 2 ??? ? ?? ? ? ? ? ? ???????????0100011101100001011010110011001000110010011011110A .0 1 3 2 B. 0 2 3 1 C. 0 3 2 1 D. 0 1 2 3 A .0 3 2 1 B. 0 1 2 3 C. 0 1 3 2 D. 0 3 1 2

数据结构之顺序表的建立、打印、查找、插入、删除

#include #include #include #include //顺序表的定义: #define ListSize 100 //表空间大小可根据实际需要而定,这里假设为100 typedef int DataType; //DataType可以是任何相应的数据类型如int, float或char typedef struct { DataType data[ListSize]; //向量data用于存放表结点 int length; //当前的表长度 }SeqList; void main() { SeqList L; int i,x; int n=10; //欲建立的顺序表长度 L.length=0; void CreateList(SeqList *L,int n); void PrintList(SeqList L); int LocateList(SeqList L,DataType x); void InsertList(SeqList *L,DataType x,int i); void DeleteList(SeqList *L,int i); CreateList(&L,n); //建立顺序表 PrintList(L); //打印顺序表 cout<<"输入要查找的值:"; cin>>x; i=LocateList(L,x); //顺序表查找 cout<<"查找的值所在的位置:"<>i; cout<<"输入要插入的元素:"; cin>>x; InsertList(&L,x,i); //顺序表插入 PrintList(L); //打印顺序表 cout<<"输入要删除的位置:"; cin>>i;

数据结构实验一顺序表的实现

数据结构实验一顺序表的实现 数据结构实验一顺序表的实现 班级学号姓名分数一、实验目的: 1. 熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现; 2. 以线性表的各种操作的实现为重点; 3. 通过本次学习帮助学生加深C语言的使用,掌握算法分析方法并对已经设 计 出的算法进行分析,给出相应的结果。 二、实验要求: 编写实验程序,上机运行本程序,保存程序的运行结果,结合程序进行分析并 写出实验报告。三、实验内容及分析: 1.顺序表的建立 建立一个含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 程序如下: 头文件SqList.h的内容如下: #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0

#define INFEASIBLE -1 #define OVERFLOW -2 typedef int ElemType; typedef int Status; typedef struct{ ElemType *elem; int length; int listsize; }SqList; Status InitList_Sq(SqList *L) { L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L->elem) return(OVERFLOW); L->length=0; L->listsize=LIST_INIT_SIZE; return OK; } Status CreatList_Sq(SqList *L,int n) 1 { int i; printf("输入%d个整数:\n",n); for(i=0;ielem[i]); return OK;

数据结构第七章参考答案

习题7 1.填空题 (1)由10000个结点构成的二叉排序树,在等概率查找的条件下,查找成功时的平均查找长度的最大值可能达到(___________)。 答案:5000.5 (2)长度为11的有序序列:1,12,13,24,35,36,47,58,59,69,71进行等概率查找,如果采用顺序查找,则平均查找长度为(___________),如果采用二分查找,则平均查找长度为(___________),如果采用哈希查找,哈希表长为15,哈希函数为H(key)=key%13,采用线性探测解决地址冲突,即d i=(H(key)+i)%15,则平均查找长度为(保留1位小数)(___________)。 答案:6,3,1.6 (3)在折半查找中,查找终止的条件为(___________)。 答案:找到匹配元素或者low>high? (4)某索引顺序表共有元素275个,平均分成5块。若先对索引表采用顺序查找,再对块元素进行顺序查找,则等概率情况下,分块查找成功的平均查找长度是(___________)。 答案:31 (5)高度为8的平衡二叉树的结点数至少是(___________)。 答案: 54 计算公式:F(n)=F(n-1)+F(n-2)+1 (6)对于这个序列{25,43,62,31,48,56},采用的散列函数为H(k)=k%7,则元素48的同义词是(___________)。 答案:62 (7)在各种查找方法中,平均查找长度与结点个数无关的查找方法是(___________)。 答案:散列查找 (8)一个按元素值排好的顺序表(长度大于2),分别用顺序查找和折半查找与给定值相等的元素,平均比较次数分别是s和b,在查找成功的情况下,s和b的关系是(___________);在查找不成功的情况下,s和b的关系是(___________)。 答案:(1)(2s-1)b=2s([log2(2s-1)]+1)-2[log2(2s-1)]+1+1 (2)分两种情况考虑,见解答。 解: (1)设所有元素的个数为n,显然有s=n*(n+1)/(2n),则 n=2s-1 设折半查找树高度为k,则前k-1层是满二叉树,最后一层的节点数为 n-(2k-1 -1) 因此,总比较次数 nb=20*1+21*2+22*3+…+2k-2*(k-1)+(n-(2k-1 -1))*k, 而 20*1+21*2+22*3+…+2k-2*(k-1)=2k-1*k-2k+1 因此 nb=2k-1*k-2k+1+(n-(2k-1-1))*k=(n+1)k-2k+1 又k=[log2n]+1,n=2s-1,所以有 (2s-1)b=2s([log2(2s-1)]+1)-2[log2(2s-1)]+1+1 (2)查找不成功,对于顺序查找有:s=n。对于折半查找,找不到的情况有n+1种,查找

实验一 数据结构顺序表的插入和删除

实验一顺序表的操作 1.实验题目:顺序表的操作 2.实验目的和要求: 1)了解顺序表的基本概念、顺序表结构的定义及在顺序表上的基本操作(插入、删除、查找以及线性表合并)。 2) 通过在Turbo C(WinTc,或visual stdio6)实现以上操作的C语言代码。 3)提前了解实验相关的知识(尤其是C语言)。 3.实验内容:(二选一) 1) 顺序表的插入算法,删除算法,顺序表的合并算法 2) 与线性表应用相关的实例(自己选择具体实例) 4.部分参考实验代码: ⑴顺序表结构的定义: #include #define MAXLEN 255 typedef int ElemType; typedef struct { ElemType elem[MAXLEN]; int length; }sqList; ⑵顺序表前插(在第i号元素前插入一个新的元素) int ListInsert(sqList *la,int i,int x) { int j; if(i<0||i>la-> length +1) { printf(“\n the value of i is wrong!”); return 0; } if(la-> length +1>=MAXLEN) { printf(“\n overflow!”); return 0; } . for(j=la-> length;j>=i;j--) la->list[j+1]=la->list[j];

la->list[i]=x; la-> length ++; return 1; } ⑶顺序表删除 int ListDelete(sqList *la,int i) { if(i<0||i>la-> length) { printf(“\n the position is wrong!\n”); return 0; } for(i;i length;i++) la->list[i-1]=la->list[i]; la-> length --; return 1; } 5.附录:实验预备知识: ⑴复习C语言中数组的用法。 ⑵了解线性表和顺序表的概念,顺序表的定义方法; 线性表是n个数据元素的有限序列,至于每个数据元素的具体含义,在不同的情况下各不相同。 顺序表是线性表的顺序存储表示,是用一组地址连续的存储单元依次存储线性表的数据元素。 在C语言中,顺序表是用数组来实现的。 ⑶掌握线性表在顺序存储结构上实现基本操作:查找、插入、删除和合并 的算法。 在实现这些算法的时候,要注意判断输入数据的合法性,除此之外还要要注意以下内容: 在实现查找的时候,首先要判断该顺序表是否为空,其次要判断查找后的结果(查到时输出查到的数据,未查到时给出未查到提示)。 在实现插入的时候,首先要判断该顺序表是否为满,如为满则报错(此时要注意:顺序表是用数组来实现的,它不能随机分配空间);如 不为满,则需判断要插入的位置是否合法(例如:如果一个线性表的 元素只有10个,而要在第0个元素前插入或在第11个元素后插入就 为不合法)。其次要注意是前插还是后插,两者是有区别的;最后还要 注意插入时各个数据元素移动的次序是从后面依次开始移动。 在实现删除的时候,首先要判断该顺序表是否为空,如为空则报错,如不为空,则需判断要删除的位置是否合法(例如:如果一个线性表 的元素只有10个,而要删除第0个或第十一个元素就为不合法)。其 次还要注意删除时各个数据元素移动的次序是从前面依次开始移动。

相关主题
文本预览
相关文档 最新文档