《数据结构》课程习题集 第 1 页 (共 25 页) 一、. 选择题
. 1. 算法的计算量的大小称为计算的( )。
A.效率 B. 复杂性 C. 现实性 D. 难度
.2. 算法的时间复杂度取决于( ).
A.问题的规模 B. 待处理数据的初态 C. A和B D. 难确定
.3. 下面关于算法说法错误的是( )
A.算法最终必须由计算机程序实现
B.为解决某问题的算法同为该问题编写的程序含义是相同的
C. 算法的可行性是指指令不能有二义性 D. 以上几个都是错误的
.4.从逻辑上可以把数据结构分为( )两大类。
A.动态结构、静态结构 B.顺序结构、链式结构
C.线性结构、非线性结构 D.初等结构、构造型结构
.
.
.5.以下数据结构中,哪一个是线性结构( )?
A.广义表 B. 二叉树 C. 稀疏矩阵 D. 串
.6.下述哪一条是顺序存储结构的优点?( )
A.存储密度大 B.插入运算方便
C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示
.7.下面关于线性表的叙述中,错误的是哪一个?( )
A.线性表采用顺序存储,必须占用一片连续的存储单元。
B.线性表采用顺序存储,便于进行插入和删除操作。
C.线性表采用存储,不必占用一片连续的存储单元。
D.线性表采用存储,便于插入和删除操作。
.8.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用( )存储方式最节省时间。
A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表
.9.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( )最节省时
.
.
间。
A. 单链表 B.单循环链表 C. 带尾指针的单循环链表 D.带头结点的双循环链表
.10. 链表不具有的特点是( ).
A.插入、删除不需要移动元素 B.可随机访问任一元素
C.不必事先估计存储空间 D.所需空间与线性长度成正比
.11. 设一个栈的输入序列是 1,2,3,4,5,则下列序列中,是栈的合法输出序列的是( )。
A. 5 1 2 3 4 B. 4 5 1 3 2 C. 4 3 1 2 5 D. 3 2 1 5 4
.12. 某堆栈的输入序列为a, b,c ,d,下面的四个序列中,不可能是它的输出序列的是( )。
A. a,c,b,d B. b, c,d,a C. c, d,b, a D. d, c,a,b
.13. 用方式存储的队列,在进行删除运算时( )。
A. 仅修改头指针 B. 仅修改尾指针
C. 头、尾指针都要修改 D. 头、尾指针可能都要修改
.
.
.14. 用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时( )。
A.仅修改队头指针 B. 仅修改队尾指针
C. 队头、队尾指针都要修改 D. 队头,队尾指针都可能要修改
.15.下面关于串的的叙述中,哪一个是不正确的?( )
A.串是字符的有限序列 B.空串是由空格构成的串
C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储
.16. 串是一种特殊的线性表,其特殊性体现在 ( )
A.可以顺序存储 B.数据元素是一个字符
C.可以存储 D.数据元素可以是多个字符
.17.关于空串与空格串,下面说确的是( )。
A.空串与空格串是相同的 B.空串与空格串长度是相同的
C.空格串中存放的都是空格 D.空串中存放的都是NULL
. 18.图中有关路径的定义是( )。
.
.
A.由顶点和相邻顶点序偶构成的边所形成的序列 B.由不同顶点所形成的序列
C.由不同边所形成的序列 D.上述定义都不是
.19.设无向图的顶点个数为n,则该图最多有( )条边。
A.n-1 B.n(n-1)/2 C. n(n+1)/2 D.0 E.n2
.20.一个n个顶点的连通无向图,其边的个数至少为( )。
A.n-1 B.n C.n+1 D.nlogn;
.21.某排序方法的稳定性是指( )。
A.该排序算法不允许有相同的关键字记录
B.该排序算法允许有相同的关键字记录
C.平均时间为0(n log n)的排序方法
D.以上都不对
.22.如果只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用( )方法最快。
A.起泡排序 B.快速排列 C.Shell排序 D.堆排序 E.简单选择排序
.
.
.23.排序趟数与序列的原始状态有关的排序方法是( )排序法。
A.插入 B. 选择 C. 冒泡 D. 都不是
.24.下面给出的四种排序方法中,排序过程中的比较次数与排序方法无关的是。( )
A.选择排序法 B. 插入排序法 C. 快速排序法 D. 都不是
.25.对序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的排列变为{4,9,-1,8,20,7,15};则采用的是( )排序。
A. 选择 B. 快速 C. 希尔 D. 冒泡
.26. 设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1 则T中的叶子数为( )
A.5 B.6 C.7 D.8
.27.一棵完全二叉树上有1001个结点,其中叶子结点的个数是( )
A. 250 B. 500 C.254 D.505 E.以上答案都不对
.28. 有关二叉树下列说确的是( ).
A.二叉树的度为2 B.一棵二叉树的度可以小于2
.
.
C.二叉树中至少有一个结点的度为2 D.二叉树中任何一个结点的度都为2
.29.二叉树的第I层上最多含有结点数为( ).
A.2I B. 2I-1-1 C. 2I-1 D.2I -1
.30.对于有n 个结点的二叉树, 其高度为( ).
A.nlog2n B.log2n C.log2n|+1 D.不确定
.31.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用( )次序的遍历实现编号。
A.先序 B. 中序 C. 后序 D. 从根开始按层次遍历
.32. 对N个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为( )
A.(N+1)/2 B. N/2 C. N D. [(1+N)*N ]/2
.33. 对线性表进行二分查找时,要求线性表必须( )
A.以顺序方式存储 B.以顺序方式存储,且数据元素有序
C.以方式存储 D.以方式存储,且数据元素有序
.
.
.34.当在一个有序的顺序存储表上查找一个数据时,即可用折半查找,也可用顺序查找,但前者比后者的查找速度( ).
A.必定快 B.不一定 C. 在大部分情况下要快 D. 取决于表递增还是递减
.35. 具有12个关键字的有序表,折半查找的平均查找长度( ) .
A. 3.1 B. 4 C. 2.5 D. 5
.36. 既希望较快的查找又便于线性表动态变化的查找方法是 ( )
A.顺序查找 B. 折半查找 C. 索引顺序查找 D. 哈希法查找
二、填空题
.1. 对于长度为255的表,采用分块查找,每块的最佳长度为__________。
.2. 顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为__ __次;当使用监视哨时,若查找失败,则比较关键字的次数为__ __。
.3.在有序表A[1..12]中,采用二分查找算法查等于A[12]的元素,所比较的元素下标依次为__________。
.4.. 在一棵二叉树中,第5层上的结点数最多为 个。
.5.、n(n>0)个结点构成的二叉树,叶结点最多有 个,最少有 个。若
.
.
二叉树有m个叶结点,则度为2的结点有 个。
.6.二叉树中某一结点左子树的深度减去右子树的深度称为该结点的____。
.7. 假定一棵二叉树的结点数为18,则它的最小深度为 ,最大深度为 ;
.8. 在一棵二叉树中,度为零的结点的个数为n 0,度为2的结点的个数为 n 2,则有n0= 。
.9. 现有按中序遍历二叉树的结果为abc,问有____种不同形态的二叉树可以得到这一遍历结果,这些二叉树分别是____。
.10.若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的______和记录的_____。
.11.直接插入排序用监视哨的作用是_______。
.12. 不受待排序初始序列的影响,时间复杂度为O(N2)的排序算法是_____,在排序算法的最后一趟开始之前,所有元素都可能不在其最终位置上的排序算法是_____。
.13.判断一个无向图是一棵树的条件是______。
.14.具有10个顶点的无向图,边的总数最多为______。
.15.若用n表示图中顶点数目,则有_______条边的无向图成为完全图。
.
.
.16.空格串是指__ _,其长度等于__ __。
.17.设T和P是两个给定的串,在T中寻找等于P的子串的过程称为_ __,又称P为__ __。
.18.串的两种最基本的存储方式是__ __、__ __;两个串相等的充分必要条件是_ __。
.19. 已知链队列的头尾指针分别是f和r,则将值x入队的操作序列是_______。
.20.向栈中压入元素的操作是____。
.21.在具有n个单元的循环队列中,队满时共有___个元素。
.22.用S表示入栈操作,X表示出栈操作,若元素入栈的顺序为1234,为了得到1342出栈顺序,相应的S和X的操作串为_______。
.23. 单链表是____的存储表示。
.24. 在双链表中,每个结点有两个指针域,一个指向____,另一个指向____。
.25.存储的特点是利用________来表示数据元素之间的逻辑关系。
.26.顺序存储结构是通过________表示元素之间的关系的;链式存储结构是通过________表示元素之间的关系的。
.27.线性表L=(a1,a2,…,an)用数组表示,假定删除表中任一元素的概率相同,则
.
.
删除一个元素平均需要移动元素的个数是________。
.28.根据线性表的链式存储结构中每一个结点包含的指针个数,将线性链表分成________和_______;而又根据指针的连接方式,链表又可分成________和________。
.29.数据的物理结构包括 的表示和 的表示。
.30.抽象数据类型的定义仅取决于它的一组__ _,而与_ _无关,即不论其部结构如何变化,只要它的_ _不变,都不影响其外部使用。
.31.数据结构中评价算法的两个重要指标是
.32. 数据结构是研讨数据的_ 和_ ,以及它们之间的相互关系,并对与这种结构定义相应的 ,设计出相应的 _。
.三.程序填空题
.1. 已知单链表H为一个用带头结点的链表表示的线性表,如下算法是将其倒置。
请在下划线处填上正确的语句。 P46
template void Line_ListLink { Line_ListNode . . while(first! =NULL) { p=first;first=first–>link; p–>link=head - >link;head–>link=p; } first=head–>link; delete head;} .2.在顺序表中随机存取的数据,很容易在顺序表中实现按序号查找元素。代码如下所示,请在下划线处填上正确的语句。 template bool Line_ListSqu //在线性表中查找第i个元素并用x返回 { if (____________ ) return false; x=elem[i–1]; return ____________ ; } .3.线性表的插入操作是指在线性表的第m–1个数据元素和第m个数据元素之间插入一个新的数据元素x,其结果是使长度为n的线性表(a1, a2 ,…, am–1, am,…, an)变成长度为n+1的线性表(a1, a2 ,…, am–1, x, am,…, an),并且数据元素am–1和am之间的逻辑关系发生了变化。 . . 实现步骤如下:(1)合法性判断:插入位置i是否合法?表是否已满?(2)将第i至第n位的元素向后移动一个位置;(3)将要插入的元素写到第i个数据元素的位置;(4)表长加1。 具体算法如下,请在下划线处填上正确的语句。 template Line_ListSqu { if (____________ ) throw OutOfBounds( ); if (length==MaxSize) throw NoMem( ); for(____________ ;j>=i–1;j– –) elem[j+1]=elem[j]; elem[i–1]= ____________ ; length++; return ____________ ; } .4.-冒泡排序(Bubble Sort)的基本思想是:设数组a中存放了n个数据元素,循环进行n 趟如下的排序过程,请在下划线处填上正确的语句。 void BubbleSort(DataType a[ ], int n) { . . int i, j, flag=1; DataType temp; for(i = 1; ____________ ; i++) { flag = 0; for(j = 0; ____________ ; j++) { if(____________ ) { flag = 1; temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } } .5.按值查找是指在线性表中查找与给定值x相等的数据元素,具体实现代码如下,请在下划线处填上正确的语句。 . . template int Line_ListSqu { int____________ ; if (IsEmpty( )) return 0;//线性表为空时返回0 while(____________ ) i++; if (elem[i]= =x) return ++i; else return ____________ ; } .6.线性表的删除操作是使长度为n的线性表(a1, a2,…, am–1, am,…,an)变为长度为n–1的线性表(a1, a2,…, am–1, am+1,,…,an),并且数据元素am–1、am和am+1之间的逻辑关系也会发生变化,需要把第m+1~n个元素(共n–m个元素)依次向前移动一个位置来反映这种变化。具体实现步骤如下:①判断删除位置i是否合法,合法则将该位置元素放入x中,否则抛出异常;②将第i+1至第n位的元素向前移动一个位置;③表长减1。 具体算法如下,请在下划线处填上正确的语句。 template Line_ListSqu . . { if (Find(i,x)) { for(____________ ;j return ____________ else throw OutOfBounds( ); } } .7. 假设以数组a[m]存放循环队列的元素,同时设变量rear 和length分别作为队尾指针和队中元素个数,试给出判别此循环队列的队满条件,并写出相应入队和出队的算法(在出队的算法中要返回队头元素)。请在下划线处填上正确的语句。 #define m 100 int enqueue(int a[], int rear, int length, int x) { if(___________) {printf(“queue is full”); return 0;} rear=(rear+1)% m; . . a[rear]=x; length ___________; return length; } int dequeue(int a[], int rear, int length, int *x) { if(___________) {printf(“queueempty”); return 0;} *x= a [(rear- length +m)%m]; Length ___________; return length; .8.--删除运算是将单链表的第i个结点删去。先在单链表中找到第i–1个结点,再删除其后的结点。具体算法代码如下所,请在下划线处填上正确的语句。 template Line_ListLink { if (__________|| !first) throw OutOfBounds( );//删除位置不合法 . . Line_ListNode if (___________) first=first–>link; else { Line_ListNode //查找第i个结点 while(___________jlink;++j;} if (!q || ___________) throw OutOfBounds( );//没有第i个结点 p=q–>link;q–>link=p–>link; } .9. 删除运算是将单链表的第i个结点删去。先在单链表中找到第i–1个结点,再删除其后的结点。具体算法代码 如下所示:请在下划线处填上正确的语句。 template Line_ListLink { if (___________) throw OutOfBounds( );//删除位置不合法 Line_ListNode if (___________) first=first–>link; . . else { Line_ListNode //查找第i个结点 while(q && jlink;++j;} if (!q || ___________) throw OutOfBounds( );//没有第i个结点 p=q–>link;q–>link=p–>link; } x=p–>data;delete p; return *this;} .10.求子串Sub_String 已知串S,1 ≤ pos ≤ Length_Str(S)且0 ≤ len ≤Length_Str(S)–pos+1,用串Sub返回S的自第i个字符起长度为j的子串。请在下划线处填上正确的语句。 string Sub_String(string &Sub, string S, int i, int j); { int p; Sub.length = 0; if (i <= 0 || i > S.length || j<= 0 ||___________) . . return Sub; //参数错误时,返回空串 for(p = i – 1; ___________; p++) //把S.ch[i–1]至S.ch[i–1+j]复制到串Sub中 Sub.ch[p – i +1] = S.ch[p]; Sub.ch[j] ='\\0'; ___________ = j; return Sub; } } .四.阅读理解题(描述算法思路,再综合出其功能) 本题说明: 算法思路指的是对某种数据结构(如,记录序列), 进行操作(如,移动位置), 的处理步骤(如,1,2,3….). 算法功能指的是要达到的处理目标(如,合并成有序的单链表.) .1. 阅读如下算法代码:描述算法思路,再综合出其功能. main(){ int i,max,a[10]; printf(“请输入10个整数:”); for(i=0;i<=10;i++) . . scanf(“%d”,&a[i]); max=a[0]; i=1; while(i<10) { if(a[i]>max) max=a[i]; i++; } printf(“值为:”,max); } .2. 阅读如下算法代码:描述算法思路,再综合出其功能. void delete(node *head,int x) { node *p,*q; q=head; p=head->next; while((p!=NULL) && (p->data!=x)) { q=p; p=p->next; . } . if(p==NULL) printf(\"未找到x!\\n\"); else if(q==head) printf(\"x为第一个结点,无前趋!\\n\"); else { q->data=x; q->next=p->next; free(p); .3. 阅读如下算法代码:描述算法思路,再综合出其功能. int InsertPosList(struct List *L, int pos, ElemType x) { int i; if(pos<1 || pos>L->size+1) /*若pos越界则插入失败*/ return 0; if(L->size==L->MaxSize) /*重新分配更大的存储空间*/ againMalloc(L); for(i=L->size-1; i>=pos-1; i--) . } } . L->list[i+1]=L->list[i]; L->list[pos-1]=x; L->size++; return 1; } .4. 阅读如下算法代码:描述算法思路,再综合出其功能. void InsertIncreaseList( Seqlist *L , Datatype x ) { int i; if ( L->length>=ListSize) Error(“overflow\"); for ( i=L -> length ; i>0 && L->data[ i-1 ] > x ; i--) L->data[ i ]=L->data[ i ] ; // 比较并移动元素 L->data[ i ] =x; L -> length++; } . . .5. 阅读如下算法代码:描述算法思路,再综合出其功能. void DeleteList ( LinkList L, DataType min , DataType max ) { ListNode *p , *q , *s; p=L; while( p->next && p->next->data <=min ) //找比min大的前一个元素位置 p=p->next; q=p->next;//p指向第一个不大于min结点的直接前趋,q指向第一个大于min的结点 while(q &&q->data free(s);//删除结点,释放空间 } p->next=q;//将*p结点的直接后继指针指向*q结点 } .6. 阅读如下算法代码:描述算法思路,再综合出其功能. . . void enqueue(int x) { int temp; if(count==n) printf(\"队列上溢出\\n\"); Else { } } count++; temp = (front+count)%n; Queue[temp]=x; int dequeue() { int temp; if(count==0) printf(\"队列下溢出\\n\"); else { temp=Queue[front]; front=(front+1)%n; count--; return temp; } } .7..阅读如下算法代码:描述算法思路,再综合出其功能. Status ListInsert_L(LinkList &L, int i, ElemType e) { //在带头结点的单链表L. p = L; k = 0; //初始化,p指向头结点,k为计数器 while (p && k < i-1) {//逐步移动指针p,直到p指向第i-1个元素或p为空 p = p->next; ++ k; } // 找到第i-1个元素所在结点 . . if (!p || k > i-1) return ERROR; //无法插入 if(!(s = (LinkLinst) malloc(sizeof(LNode)))) //申请元素e的结点空间 return OVERFLOW; //存无空闲单元,无法申请到空间 s->data = e // 申请一个结点s; s->next = p->next; // 修改s的指针域指向p的下一结点 p->next = s; // 修改p的指针域指向s return OK; } //LinstInsert_L .8.下阅读如下算法代码:描述算法思路,再综合出其功能. Quicskort(Recordnode r[],int low,int high) /*low和high为记录序列的下界和上界*/ {int i,j; struct Recordnode x; i=low; . . j=high; x=r[low]; while(i if(i /*使用递归*/