理学数据结构习题集全doc.docx
《理学数据结构习题集全doc.docx》由会员分享,可在线阅读,更多相关《理学数据结构习题集全doc.docx(76页珍藏版)》请在冰豆网上搜索。
理学数据结构习题集全doc
第一章概论
一、填空题
1、数据的存储结构可用四种基本的存储方法表示,分别是顺序、链式、索引和散列。
2、一个算法具有有穷性、确定性、可行性,有零个或多个输入、有一个或多个输出5个特性。
3、数据结构包括数据的逻辑结构、存储结构和运算(或基本操作)三个方面的内容。
4、数据结构中评价算法的两个重要指标是时间效率和空间效率。
7、数据项是数据中不可再分割的最小单位;数据元素是数据集合中的一个“个体”,是计算机程序中加工处理的基本单位。
8、健壮性指算法对非法输入能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。
9、下列语句的时间复杂度是O(n2)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{++x;}
二、单项选择题
1、数据结构中,与所使用的计算机无关的是数据的(C)结构。
A、存储B、物理C、逻辑D、物理和存储
2、算法分析的目的是(C)。
A、找出数据结构的合理性B、研究算法中的输入和输出的关系
C、分析算法的效率以求改进D、分析算法的易懂性和文档性
3、计算机算法指的是(C)。
A、计算方法B、排序方法C、解决问题的有限运算序列D、调度方法
4、计算机算法必须具备输入、输出和(B)等5个特性。
A、可行性、可移植性和可扩充性B、可行性、确定性和有穷性
C、确定性、有穷性和稳定性D、易读性、稳定性和安全性
5、从逻辑上可以把数据结构分为(C)两大类。
A、动态结构、静态结构B、顺序结构、链式结构
C、线性结构、非线性结构D、初等结构、构造型结构
6、下列数据中,(C)是非线性数据结构。
A、栈B、队列C、完全二叉树D、堆
7、算法分析的两个主要方面是(A)。
A、空间复杂性和时间复杂性B、正确性和简明性
C、可读性和文档性D、数据复杂性和程序复杂性
8、在下面程序段的时间复杂度(D)。
i=1;
while(i<=n)
i=i*3;
A、O(3n) B、O(n)C、O(n3)D、O(log3n)
9、在下面的程序段中,对x的赋值语句的频度为(C)。
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
x=x+1;
A、O(2n)B、O(n)C、O(n2)D、O(log2n)
10、下面关于算法说法错误的是(D)。
A、算法最终必须由计算机程序实现
B、为解决某问题的算法同为该问题编写的程序含义是相同的
C、算法的可行性是指指令不能有二义性
D、以上几个都是错误的
三、判断题
1、数据的逻辑结构说明数据元素之间的顺序关系,它依赖于计算机的储存结构.(×)
2、数据的逻辑结构是指数据的各数据项之间的逻辑关系;(×)
3、数据的物理结构是指数据在计算机内的实际存储形式。
(√)
4、算法的优劣与算法描述语言无关,但与所用计算机有关。
(×)
5、健壮的算法不会因非法的输入数据而出现莫名其妙的状态。
(√)
6、算法可以用不同的语言描述,如果用C语言或PASCAL语言等高级语言来描述,则算法实际上就是程序了。
(×)
7、数据元素是数据中不可再分割的最小单位。
(×)
8、算法中的每一步,必须有确切的含义,不能产生理解上的二义性。
(√)
9、采用事后统计法进行算法分析时,不会因为软硬件环境的改变而影响分析结果。
(×)
10、算法的时间与空间效率是指将算法变换为程序后,该程序在计算机上运行时所花费的时间及所占据空间的度量。
(√)
第2章线性表
一、填空
1、当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素时,应采用顺序存储结构。
2、顺序存储的线性表存储结构的特点是:
用物理位置的相邻表示元素之间的关系的,在顺序表中插入或删除一个元素,移动的元素个数与表长和该元素在表中的位置有关。
3、设单链表的结点结构为(data,next),next为指针域,指针p指向单链表中data为x的结点,指针q指向data为y的新结点,若将结点y插入结点x之后,则需要依次执行以下语句:
__q->next=p->next;_p->next=q
4、在顺序表中访问任意一结点的时间复杂度均为O
(1),因此,顺序表也称为随机存取的数据结构。
5、链式存储结构的特点是利用__指针来表示数据元素之间的逻辑关系。
在单链表中,除了首元结点外,任一结点的存储位置由其直接前驱结点的链域的值指示,查找结点都必须从头结点开始,因此,链表也称为顺序存取的数据结构。
6、已知指针p指向单链表L中的某结点,u是P的直接后继,删除u的语句是:
p->next=u->next;
free(u);
7、带头结点的双循环链表L中只有一个元素结点的条件是:
L->next->next==L;
8、在顺序表L=(a1,a2,…,an)中,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数是(n-1)/2_;第i个元素(1<=i<=n)之前插入一个元素时,需向后移动n-i+1_个元素。
如果要在第1个元素前插入一个元素,要后移n个元素;删除第i个元素(1≤i≤n)时,需向前移动n-i个元素。
9、在n个结点的单链表中要删除已知结点*p,需找到它的前驱结点的地址,其时间复杂度为O(n),在给定值为x的结点后插入一个新结点的时间复杂度为O(n)_。
10、在非空的线性表中,有且仅有一个没有直接前趋的开始结点a1;有且仅有一个没有直接后继的终端结点an;其余的内部结点ai(2≤i≤n-1)都有且仅有一个直接前趋ai-1和一个直接后继ai+1。
11、双向链表结构的对称性可用下式描述:
p->prior)->next=p=(p->next)->prior
二、判断正误
1、线性表的特点是每个元素都有一个前驱和一个后继。
(×)
2、链表的物理存储结构具有同链表一样的顺序。
(×)
3、链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。
(×)
4、取线性表的第i个元素的时间同i的大小有关。
(×)
5、顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。
(×)
6、顺序存储方式的优点是存储密度大,且插入、删除运算效率高。
(×)
7、链表是采用链式存储结构的线性表,进行插入、删除操作时,在链表中比在顺序存储结构中效率高。
(√)
8、线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。
(×)
9、顺序存储方式只能用于存储线性结构。
(×)
10、线性表的逻辑顺序与存储顺序总是一致的。
(×)
11、链表中的头结点仅起到标识的作用。
(×)
12、顺序存储结构的主要缺点是不利于插入或删除操作。
(√)
13、线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的。
(√)
14、顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。
(×)
15、对任何数据结构链式存储结构一定优于顺序存储结构。
(×)
16、顺序存储的线性表,优点是空间利用率很高。
(×)
17、在单链表上插入、删除一个结点,必须知道其前驱结点。
(√)
18、遍历操作时,循环链表和非循环链表的终止条件判断是一样的。
(×)
19、顺序表能按元素序号随机访问,而链表只能顺序查找。
(√)
20、在顺序表中做插入删除操作时,平均移动大约表中一半的元素,因此对n较大的顺序表效率低。
(√)
三、单项选择题
1、数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为(C)。
A、存储结构B、逻辑结构C、顺序存储结构D、链式存储结构
2、一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是(B)
A、110B、108C、100D、120
3、在n个结点的顺序表中,算法的时间复杂度是O
(1)的操作是(A)。
A、访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)
B、在第i个结点后插入一个新结点(1≤i≤n)
C、删除第i个结点(1≤i≤n)
D、将n个结点从小到大排序
4、向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动(B)个元素。
A、8B、63.5C、63D、7
5、线性表(a1,a2,…,an)以链接方式存储时,访问第i位置元素的时间复杂性为(C)。
A、O(i)B、O
(1)C、O(n)D、O(i-1)
6、链表是一种采用(B)存储结构存储的线性表。
A、顺序B、链式C、星式D、网状
7、线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D)。
A、必须是连续的B、部分地址必须是连续的
C、一定是不连续的D、连续或不连续都可以
8、线性表L在(B)情况下适用于使用链式结构实现。
A、需经常修改L中的结点值B、需不断对L进行删除插入
C、L中含有大量的结点D、L中结点结构复杂
9、单链表的存储密度(C)。
A、大于1B、等于1C、小于1D、不能确定
10、对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是(B)
A、head==NULLB、head→next==NULLC、head→ext==headD、head!
=NULL
11、下面关于线性表的叙述中,错误的是哪一个?
(B)
A、线性表采用顺序存储,必须占用一片连续的存储单元。
B、线性表采用顺序存储,便于进行插入和删除操作。
C、线性表采用链接存储,不必占用一片连续的存储单元。
D、线性表采用链接存储,便于插入和删除操作。
12、某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用(D)存储方式最节省运算时间。
A、单链表B、仅有头指针的单循环链表
C、双链表D、仅有尾指针的单循环链表
13、链表不具有的特点是(B)。
A、插入、删除不需要移动元素B、可随机访问任一元素
C、不必事先估计存储空间D、所需空间与线性长度成正比
14、设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用(D)最节省时间。
A、单链表B、单循环链表C、带尾指针的单循环链表D、带头结点的双循环链表
15、若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为(C)(1<=i<=n+1)。
A、O(0)B、O
(1)C、O(n)D、O(n2)
16、下述(A)是顺序存储结构的优点。
A、存储密度大B、插入运算方便
C、删除运算方便D、可方便地用于各种逻辑结构的存储表示
17、在单链表指针为p的结点之后插入指针为s的结点,正确的操作是(B)。
A、p->next=s;s->next=p->next;B、s->next=p->next;p->next=s;
C、p->next=s;p->next=s->next;D、p->next=s->next;p->next=s;
18、线性表是具有n个(C)的有限序列(n>0)。
A、表元素B、字符C、数据元素D、数据项
19、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用(A)存储方式最节省时间。
A、顺序表B、双链表C、带头结点的双循环链表D、单循环链表
20、在双向链表指针p的结点前插入一个指针q的结点操作是(C)。
A、p->prior=q;q->next=p;p->prior->next=q;q->prior=q;
B、p->prior=q;p->prior->next=q;q->next=p;q->prior=p->prior;
C、q->next=p;q->prior=p->prior;p->prior->next=q;p->prior=q;
D、q->prior=p->prior;q->next=q;p->prior=q;p->prior=q;
21、若某线性表中最常用的操作是取第i个元素和找第i个元素的前趋元素,则采用(D)存储方式最节省时间。
A、单链表B、双链表C、单向循环D、顺序表
22、链表不具有的特点是(B)
A、插入、删除不需要移动元素B、可随机访问任一元素
C、不必事先估计存储空间 D、所需空间与线性长度成正比
23、对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为(C)。
A、O(n)O(n)B.O(n)O
(1)C、O
(1)O(n)D.O
(1)O
(1)
24、对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是(B)
A、head==NULLB、head→next==NULLC、head→next==headD、head!
=NULL
25、在双向链表存储结构中,删除p所指的结点时须修改指针()。
A、p->prior->next=p->next;p->next->prior=p->prior;
B、p->prior:
=p->prior->prior;(p->prior)^.rlink:
=p;
C、p->next->prior=p;p->next=p->next->next
D、p->next=p->prior->prior;p->prior=->next->next;
五、算法设计题
1、有一个单链表,其头指针为head,编写一个算法计算数据域为x的结点的个数。
Intcount(Node*heaD、{
node*p;
intn=0;p=head;
While(P!
=NULL){
if(P->data==X)n++;
P=p->next;}
return(n)
}
2、试编写在带头结点的单链表中删除一个最小值结点的高效算法。
Voiddelete(Linklist&L)
∥L是带头结点的单链表,本算法删除其最小值结点。
{p=L->next;∥p为工作指针。
指向待处理的结点。
假定链表非空。
pre=L;∥pre指向最小值结点的前驱。
q=p;∥q指向最小值结点,初始假定第一元素结点是最小值结点。
while(p->next!
=null)
{if(p->next->datadatA、{pre=p;q=p->next;}∥查最小值结点
p=p->next;∥指针后移。
}
pre->next=q->next;∥从链表上删除最小值结点
free(q);∥释放最小值结点空间
}∥结束算法delete。
3、已知不带头结点的线性链表list,链表中结点构造为(data、next),其中data为数据域,next为指针域。
请写一算法,将该链表按结点数据域的值的大小从小到大重新链接。
要求链接过程中不得使用除该链表以外的任何链结点空间。
LinkedListLinkListSort(LinkedListlist)
∥list是不带头结点的线性链表,链表结点构造为data和link两个域,data是数据域,link是指针域。
本算法将该链表按结点数据域的值的大小,从小到大重新链接。
{p=list->next;∥p是工作指针,指向待排序的当前元素。
list->next=null;∥假定第一个元素有序,即链表中现只有一个结点。
while(p!
=null)
{r=p->next;∥r是p的后继。
q=list;
if(q->data>p->data∥处理待排序结点p比第一个元素结点小的情况。
{p->next=list;
list=p;∥链表指针指向最小元素。
}
else∥查找元素值最小的结点。
{while(q->next!
=null&&q->next->datadata、q=q->next;
p->next=q->next;∥将当前排序结点链入有序链表中。
q->next=p;}
p=r;∥p指向下个待排序结点。
}}
4、以下程序的功能是实现带头结点的单链表数据结点逆序连接,请填空完善之。
voidreverse(pointerh)
/*h为附加头结点指针;类型pointer同算法设计第3题*/
{pointerp,q;
p=h->next;h->next=NULL;
while(p!
=null_____)∥链表未到尾就一直作
{q=p;p=p->next;
q->next=h->next;
h->next=q;∥将当前结点作为头结点后的第一元素结点插入
}}
5、设L为单链表的头结点地址,其数据结点的数据都是正整数且无相同的,链表中结点构造为(data、next),其中data为数据域,next为指针域。
请设计利用直接插入的原则把该链表整理成数据递增的有序单链表的算法。
解:
本题明确指出单链表带头结点,其结点数据是正整数且不相同,要求利用直接插入原则把链表整理成递增有序链表。
这就要求从第二结点开释,将各结点依次插入到有序链表中。
LinkedListLinkListInsertSort(LinkedListla)
∥la是带头结点的单链表,其数据域是正整数。
本算法利用直接插入原则将链表整理成递增的有序链表。
{if(la->next!
=null)∥链表不为空表。
{p=la->next->next;∥p指向第一结点的后继。
la->next->next=null;∥直接插入原则认为第一元素有序,然后从第二元素起依次插入
while(p!
=null)
{r=p->next;∥暂存p的后继。
q=la;
while(q->next!
=null&&q->next->datadata)
q=q->next;∥查找插入位置。
p->next=q->next;∥将p结点链入链表。
q->next=p;
p=r;
}
6、设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点。
解:
voidDisCreat1(LinkedListA)
∥A是带头结点的单链表,链表中结点的数据类型为整型。
本算法将A分解成两个单链表B和C,B中结点的数据小于零,C中结点的数据大于零。
{B=A;
C=(LinkedList)malloc(sizeof(LNode));∥为C申请结点空间。
C->next=null∥C初始化为空表。
p=A->next;∥p为工作指针。
B->next=null;∥B表初始化。
while(p!
=null)
{r=p->next;∥暂存p的后继。
if(p->data<0)∥小于0的放入B表。
{p->next=B->next;B->next=p;}∥将小于0的结点链入B表。
else{p->next=C->next;C->next=p;}
p=r;∥p指向新的待处理结点。
}}∥算法结束。
第3章栈和队列
一、填空题
1、队列是限定在队尾插入和队首删除元素的线性表。
2、栈是_操作受限__的线性表,其运算遵循__后进先出的原则,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
3、对栈的操作限定为:
只能在栈顶插入和删除元素;
4、栈S的空间大小为stacksize,S.base[0]是栈底元素,S.top是栈顶指针,则:
进栈时需将S.top加1,退栈时需将S.top减1。
S.top==0时表示空栈,S.top==stacksize表示栈满。
5、设有一个空栈,现有输入序列为1,2,3,4,5,经过PUSH,PUSH,POP,PUSH,POP,PUSH,PUSH之后,输出序列是_2,3___。
6、在作进栈运算时应先判别栈是否_满_;在作退栈运算时应先判别栈是否_空;当栈中元素为n个,再作进栈运算时发生上溢,则说明该栈的最大容量为_n_。
7、顺序栈用data[1..n]存储,栈顶指针是top,值为x的元素入栈的操作是data[++top]=x。
8、已知链队列的头尾指针分别是f和r,则将值x入队的操作序列是:
s=(LinkedList)malloc(sizeof(LNode));s->data=x;s->next=r->next;r->next=s;r=s;
9、循环队列的引入,目的是为了克服__假溢出时大量移动数据元素_,区分循环队列的满与空,有__牺牲一个存储单元__和__设标记_两种方法。
10、在具有n个单元的循环队列中,队满时共有n-1个元素。
11、向栈中压入元素的操作是先移动栈顶指针,后存入元素。
12、从循环队列中删除一个元素时,其操作是先移动队首指针,后取出元素。
13、循环队列用数组A[0..m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列的元素个数是_(rear-front+m)%m;_。
14、设循环队列存放在向量sq.data[0:
M]中,则队头指针sq.front在循环意义下的出队操作可表示为__sq.front=(sq.front+1)%(M+1);return(sq.data(sq.front));,若用牺牲一个单元的办法来区分队满和队空(设队尾指针sq.rear),则队满的条件为_(sq.rear+1)%(M+1)==sq.front;
二、判断题
1、线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。
(×)
2、在表结构中最常用的是线性表,栈和队列不太常用。
(×)
3、栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
(√)
4、对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
(√)
5、队列是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出(先进先出)型结构。
(×)
6、循环队列也存在空间溢出问题。
(√)
7、栈和队列的存储方式,既可以是顺序方式,又可以是链式方式。
(√)
9、队列和栈都是运算受限的线性表,只允许在表的两端进行运算(×)
10、通常使用队列来处理函数或过程的调用。
(×)
11、栈与队列是一种特殊操作的线性表。
(√)
13、栈和队列都是限制存取点的线性结构。
(√)
14、循环队列通常用指针来实现队列的头尾相接(×)
15、循环队列的引入,目的是为了克服假溢出现象。
(√)
三、单项选择题
1、栈中元素的进出原则是(B)
A.先进先出B.后进先出C.栈空则进D.栈满则出
2、若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为(C)
A.iB.n=iC.n-i+1D.不确定
3、判定一个顺序栈ST(最多元素为m)为空的条件是(B)
A、ST->top<>0B、ST->top=0C、.ST->top<>mD、ST->top=m
4、判定一个队列QU(最多元素为m)为满队列的条件是(A)
A、QU->rear-Q