华南理工大学《数据结构》课程习题集部分答案.docx
《华南理工大学《数据结构》课程习题集部分答案.docx》由会员分享,可在线阅读,更多相关《华南理工大学《数据结构》课程习题集部分答案.docx(20页珍藏版)》请在冰点文库上搜索。
华南理工大学《数据结构》课程习题集部分答案
《数据结构》课程习题集第1页(共25页)
一、.选择题
.1.算法的计算量的大小称为计算的(B)。
A.效率B.复杂性C.现实性D.难度
.2.算法的时间复杂度取决于(C).
A.问题的规模B.待处理数据的初态C.A和BD.难确定
.3.下面关于算法说法错误的是(D)
A.算法最终必须由计算机程序实现
B.为解决某问题的算法同为该问题编写的程序含义是相同的
C.算法的可行性是指指令不能有二义性
D.以上几个都是错误的
.4.从逻辑上可以把数据结构分为(C)两大类。
A.动态结构、静态结构B.顺序结构、链式结构
C.线性结构、非线性结构D.初等结构、构造型结构
.5.以下数据结构中,哪一个是线性结构(D)?
A.广义表B.二叉树C.稀疏矩阵D.串
.6.下述哪一条是顺序存储结构的优点?
(A)
A.存储密度大B.插入运算方便
C.删除运算方便D.可方便地用于各种逻辑结构的存储表示
.7.下面关于线性表的叙述中,错误的是哪一个?
(B)
A.线性表采用顺序存储,必须占用一片连续的存储单元。
B.线性表采用顺序存储,便于进行插入和删除操作。
C.线性表采用链接存储,不必占用一片连续的存储单元。
D.线性表采用链接存储,便于插入和删除操作。
.8.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用(A)存储方式最节省时间。
A.顺序表B.双链表C.带头结点的双循环链表D.单循环链表
.9.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用(D)最节省时间。
A.单链表B.单循环链表C.带尾指针的单循环链表D.带头结点的双循环链表
.10.链表不具有的特点是(B).
A.插入、删除不需要移动元素B.可随机访问任一元素
C.不必事先估计存储空间D.所需空间与线性长度成正比
.11.设一个栈的输入序列是1,2,3,4,5,则下列序列中,是栈的合法输出序列的是(D)。
A.51234B.45132C.43125D.32154
.12.某堆栈的输入序列为a,b,c,d,下面的四个序列中,不可能是它的输出序列的是(D)。
A.a,c,b,dB.b,c,d,aC.c,d,b,aD.d,c,a,b
.13.用链接方式存储的队列,在进行删除运算时(D)。
A.仅修改头指针B.仅修改尾指针
C.头、尾指针都要修改D.头、尾指针可能都要修改
.14.用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时(D)。
A.仅修改队头指针B.仅修改队尾指针C.队头、队尾指针都要修改D.队头,队尾指针都可能要修改
.15.下面关于串的的叙述中,哪一个是不正确的?
(B)
A.串是字符的有限序列B.空串是由空格构成的串
C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储
.16.串是一种特殊的线性表,其特殊性体现在(B)
A.可以顺序存储B.数据元素是一个字符
C.可以链接存储D.数据元素可以是多个字符
.17.关于空串与空格串,下面说法正确的是(D)。
A.空串与空格串是相同的B.空串与空格串长度是相同的
C.空格串中存放的都是空格D.空串中存放的都是NULL
.18.图中有关路径的定义是(A)。
A.由顶点和相邻顶点序偶构成的边所形成的序列B.由不同顶点所形成的序列
C.由不同边所形成的序列D.上述定义都不是
.19.设无向图的顶点个数为n,则该图最多有(B)条边。
A.n-1B.n(n-1)/2C.n(n+1)/2D.0E.n2
.20.一个n个顶点的连通无向图,其边的个数至少为(A)。
A.n-1B.nC.n+1D.nlogn;
.21.某内排序方法的稳定性是指(D)。
A.该排序算法不允许有相同的关键字记录
B.该排序算法允许有相同的关键字记录
C.平均时间为0(nlogn)的排序方法
D.以上都不对
22.如果只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用(D)方法最快。
A.起泡排序B.快速排列C.Shell排序D.堆排序E.简单选择排序
.23.排序趟数与序列的原始状态有关的排序方法是(C)排序法。
A.插入B.选择C.冒泡D.都不是
24.下面给出的四种排序方法中,排序过程中的比较次数与排序方法无关的是。
(A)
A.选择排序法B.插入排序法C.快速排序法D.都不是
25.对序列{15,9,7,8,20,-1,4}进行排序,进行一趟后数据的排列变为{4,9,-1,8,20,7,15};则采用的是(C)排序。
A.选择B.快速C.希尔D.冒泡
26.设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,1,1则T中的叶子数为(D)
A.5B.6C.7D.8
27.一棵完全二叉树上有1001个结点,其中叶子结点的个数是(E)
A.250B.500C.254D.505E.以上答案都不对
28.有关二叉树下列说法正确的是(B).
A.二叉树的度为2B.一棵二叉树的度可以小于2
C.二叉树中至少有一个结点的度为2D.二叉树中任何一个结点的度都为2
.29.二叉树的第I层上最多含有结点数为(C).
A.2IB.2I-1-1C.2I-1D.2I-1
.30.对于有n个结点的二叉树,其高度为(C).
A.nlog2nB.log2nC.log2n|+1D.不确定
.31.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用(C)次序的遍历实现编号。
A.先序B.中序C.后序D.从根开始按层次遍历
.32.对N个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为(A)
A.(N+1)/2B.N/2C.ND.[(1+N)*N]/2
.33.对线性表进行二分查找时,要求线性表必须(B)
A.以顺序方式存储B.以顺序方式存储,且数据元素有序
C.以链接方式存储D.以链接方式存储,且数据元素有序
.34.当在一个有序的顺序存储表上查找一个数据时,即可用折半查找,也可用顺序查找,但前者比后者的查找速度(C).
A.必定快B.不一定C.在大部分情况下要快D.取决于表递增还是递减
.35.具有12个关键字的有序表,折半查找的平均查找长度(A).
A.3.1B.4C.2.5D.5
.36.既希望较快的查找又便于线性表动态变化的查找方法是(C)
A.顺序查找B.折半查找C.索引顺序查找D.哈希法查找
二、填空题
.1.对于长度为255的表,采用分块查找,每块的最佳长度为____16______。
.2.顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为
__n__次;当使用监视哨时,若查找失败,则比较关键字的次数为__n+1__。
.3.在有序表A[1..12]中,采用二分查找算法查等于A[12]的元素,所比较的元素下标依次为__6.9.11.12____。
.4..在一棵二叉树中,第5层上的结点数最多为16个。
.5.、n(n>0)个结点构成的二叉树,叶结点最多floor((n+1)/2)个,最少有1个。
若二叉树有m个叶结点,则度为2的结点有m-1个。
.6.二叉树中某一结点左子树的深度减去右子树的深度称为该结点的平衡因子。
.7.假定一棵二叉树的结点数为18,则它的最小深度为5,最大深度为16;
.8.在一棵二叉树中,度为零的结点的个数为n0,度为2的结点的个数为n2,则有n0=n2+1。
.9.现有按中序遍历二叉树的结果为abc,问有__5__种不同形态的二叉树可以得到这一遍历结果,这些二叉树分别是____。
.10.若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的_比较_和记录的_移动_。
.11.直接插入排序用监视哨的作用是_免去查找过程中每一步都要检测整个表是否查找完毕,提高查找效率。
.12.不受待排序初始序列的影响,时间复杂度为O(N2)的排序算法是_简单选择排序_,在排序算法的最后一趟开始之前,所有元素都可能不在其最终位置上的排序算法是_直接插入排序_。
.13.判断一个无向图是一棵树的条件是_n个定点,n-1条边的无向连通图。
.14.具有10个顶点的无向图,边的总数最多为_45_。
.15.若用n表示图中顶点数目,则有_______条边的无向图成为完全图。
.16.空格串是指_由空格字符所组成的字符串_,其长度等于_空格个数_。
.17.设T和P是两个给定的串,在T中寻找等于P的子串的过程称为_模式匹配,又称P为_模式串_。
.18.串的两种最基本的存储方式是_顺序储存_、_链式储存_;两个串相等的充分必要条件是_长度相等对应位置字符也相等__。
.19.已知链队列的头尾指针分别是f和r,则将值x入队的操作序列是s=(LinkedList)malloc(sizeof(LNode));s->data=x;s->next=r->next;r->next=s;r=s;。
.20.向栈中压入元素的操作是_移动指针和插入。
.21.在具有n个单元的循环队列中,队满时共有_n-1_个元素。
.22.用S表示入栈操作,X表示出栈操作,若元素入栈的顺序为1234,为了得到1342出栈顺序,相应的S和X的操作串为_SXSSXSXX_。
.23.单链表是_线性表_的链接存储表示。
.24.在双链表中,每个结点有两个指针域,一个指向_前驱_,另一个指向_后继_。
.25.链接存储的特点是利用_指针_来表示数据元素之间的逻辑关系。
.26.顺序存储结构是通过_相邻位置_表示元素之间的关系的;链式存储结构是通过_指针_表示元素之间的关系的。
.27.线性表L=(a1,a2,…,an)用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数是_(n-1)/2_。
.28.根据线性表的链式存储结构中每一个结点包含的指针个数,将线性链表分成_单链表_和_多重链表_;而又根据指针的连接方式,链表又可分成_动态链表_和_静态链表_。
.29.数据的物理结构包括_顺序储存_的表示和_链式储存_的表示。
.30.抽象数据类型的定义仅取决于它的一组_逻辑特性_,而与_在计算机内部如何表示和实现_无关,即不论其内部结构如何变化,只要它的_数学特性_不变,都不影响其外部使用。
.31.数据结构中评价算法的两个重要指标是算法的时间复杂度和空间复杂度
.32.数据结构是研讨数据的_逻辑结构和_物理结构,以及它们之间的相互关系,并对与这种结构定义相应的操作,设计出相应的算法_。
三.程序填空题
.1.已知单链表H为一个用带头结点的链表表示的线性表,如下算法是将其倒置。
请在下划线处填上正确的语句。
template
voidLine_ListLink:
:
Reverse()
{Line_ListNode*p,*head=newLine_ListNode();
while(_first!
=NULL)
{p=first;first=first–>link;
p–>link=head-link;
first=head–>link;delete_head;}
.2.在顺序表中随机存取的数据,很容易在顺序表中实现按序号查找元素。
代码如下所示,请在下划线处填上正确的语句。
template
boolLine_ListSqu:
:
Find(_inti___,T&x)const
//在线性表中查找第i个元素并用x返回
{if(_i﹤1‖i﹥length;returnfalse;
x=elem[i–1];return__true;}
.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&Line_ListSqu:
:
Insert(inti,T&x)
{if(_i〈0‖i〉length+1;throwOutOfBounds();
if(length==MaxSize)throwNoMem();
for(_intj=length-4;j>=i–1;j––)elem[j+1]=elem[j];
elem[i–1]=_x_;length++;
return_*this;}
.4.-冒泡排序(BubbleSort)的基本思想是:
设数组a中存放了n个数据元素,循环进行n趟如下的排序过程,请在下划线处填上正确的语句。
voidBubbleSort(DataTypea[],intn)
{
inti,j,flag=1;
DataTypetemp;
for(i=1;_i〈﹠﹠flag==1_;i++)
{flag=0;for(j=0;_j〈n-i;j++)
{if(_a[j].key〉a[j+1].key)
{
flag=1;
temp=a[j];a[j]=a[j+1];a[j+1]=temp;
}
}
}
}
.5.按值查找是指在线性表中查找与给定值x相等的数据元素,具体实现代码如下,请在下划线处填上正确的语句。
template
intLine_ListSqu:
:
Search(constT&x)const
{int__i=0_;
if(IsEmpty())return0;//线性表为空时返回0
while(_i〈length﹠﹠!
(x==elem[i]))i++;
if(elem[i]==x)return++i;
elsereturn____0___;}
.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&Line_ListSqu:
:
Delete(_inti_,T&x)
{if(Find(i,x))
{for(_intj=i_;jelem[__j-1_]=elem[j];length––;
return__*this_elsethrowOutOfBounds();
}
}
.7.假设以数组a[m]存放循环队列的元素,同时设变量rear和length分别作为队尾指针和队中元素个数,试给出判别此循环队列的队满条件,并写出相应入队和出队的算法(在出队的算法中要返回队头元素)。
请在下划线处填上正确的语句。
#definem100
intenqueue(inta[],intrear,intlength,intx)
{if(___________)
{printf(“queueisfull”);return0;}
rear=(rear+1)%m;
a[rear]=x;
length___________;
returnlength;}
intdequeue(inta[],intrear,intlength,int*x)
{if(___________)
{printf(“queueempty”);return0;}
*x=a[(rear-length+m)%m];
Length___________;
returnlength;
.8.--删除运算是将单链表的第i个结点删去。
先在单链表中找到第i–1个结点,再删除其后的结点。
具体算法代码如下所,请在下划线处填上正确的语句。
template
Line_ListLink&Line_ListLink:
:
Delete(inti,T&x)
{if(__i〈1__||!
first)throwOutOfBounds();//删除位置不合法
Line_ListNode*p=first;
if(_i==1_)first=first–>link;
else{Line_ListNode*q=first;intj=1;
//查找第i个结点
while(_q﹠﹠_jlink;++j;}
if(!
q||_!
q-〉link_)throwOutOfBounds();//没有第i个结点
p=q–>link;q–>link=p–>link;}
.9.删除运算是将单链表的第i个结点删去。
先在单链表中找到第i–1个结点,再删除其后的结点。
具体算法代码如下所示:
请在下划线处填上正确的语句。
template
Line_ListLink&Line_ListLink:
:
Delete(inti,T&x)
{if(_i〈1‖!
first_)throwOutOfBounds();//删除位置不合法
Line_ListNode*p=first;
if(_i==1__)first=first–>link;
else{Line_ListNode*q=first;intj=1;
//查找第i个结点
while(q&&jlink;++j;}
if(!
q||_!
q-〉link_)throwOutOfBounds();//没有第i个结点
p=q–>link;q–>link=p–>link;}
x=p–>data;deletep;
return*this;}
.10.求子串Sub_String
已知串S,1≤pos≤Length_Str(S)且0≤len≤Length_Str(S)–pos+1,用串Sub返回S的自第i个字符起长度为j的子串。
请在下划线处填上正确的语句。
stringSub_String(string&Sub,stringS,inti,intj);
{intp;
Sub.length=0;
if(i<=0||i>S.length||j<=0||i-1+j〉s.length
returnSub;//参数错误时,返回空串
for(p=i–1;_p〈i-1+j_;p++)//把S.ch[i–1]至S.ch[i–1+j]复制到串Sub中
Sub.ch[p–i+1]=S.ch[p];
Sub.ch[j]='\0';sub.length_=j;
returnSub;}}
.四.阅读理解题(描述算法思路,再综合出其功能)
本题说明:
算法思路指的是对某种数据结构(如,记录序列),进行操作(如,移动位置),的处理步骤(如,1,2,3….).
算法功能指的是要达到的处理目标(如,合并成有序的单链表.)
.1.阅读如下算法代码:
描述算法思路,再综合出其功能.
main(){inti,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);}
答:
10个数字找出其最大值
.2.阅读如下算法代码:
描述算法思路,再综合出其功能.
voiddelete(node*head,intx)
{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");
elseif(q==head)
printf("x为第一个结点,无前趋!
\n");
else
{q->data=x;q->next=p->next;free(p);}}
.3.阅读如下算法代码:
描述算法思路,再综合出其功能.
intInsertPosList(structList*L,intpos,ElemTypex)
{inti;
if(pos<1||pos>L->size+1)/*若pos越界则插入失败*/
return0;
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++;
return1;}
.4.阅读如下算法代码:
描述算法思路,再综合出其功能.
voidInsertIncreaseList(Seqlist*L,Datatypex)
{