数据结构练习2.docx

上传人:b****6 文档编号:4814263 上传时间:2022-12-09 格式:DOCX 页数:25 大小:37.38KB
下载 相关 举报
数据结构练习2.docx_第1页
第1页 / 共25页
数据结构练习2.docx_第2页
第2页 / 共25页
数据结构练习2.docx_第3页
第3页 / 共25页
数据结构练习2.docx_第4页
第4页 / 共25页
数据结构练习2.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

数据结构练习2.docx

《数据结构练习2.docx》由会员分享,可在线阅读,更多相关《数据结构练习2.docx(25页珍藏版)》请在冰豆网上搜索。

数据结构练习2.docx

数据结构练习2

课堂练习一

1.1判断题(在你认为正确的题后的括号中打√,否则打X)。

(1)程序与算法没有区别。

(X)

(2)程序设计框图就是一种图形化的算法。

(√)

(3)采用程序设计语言编写的程序也是算法。

(√)

(4)一个算法可以没有输入,但不能没有输出。

(X)

(5)顺序存储结构通过数据元素的地址直接反映数据元素间的逻辑关系。

(√)

(6)链式存储结构通过指针间接地反映数据元素之间的逻辑关系。

(√)

(7)数据的存储结构通常只有顺序存储结构与链式存储结构两种。

(X)

(8)具有相同逻辑结构的数据可以采用不同的存储结构。

(√)

(9)逻辑结构不相同的数据应该采用不同的存储结构。

(√)

(10)算法分析的前提是算法的时空效率高,(X)

1.2填空题。

(1)“数据结构”课程研究的主要内容包括数据逻辑结构、数据操作结构和数据存储结构三个方面。

(2)一般情况下,算法独立于具体的计算机硬件,与具体的程序设计语言相关。

(3)一个完整的算法应该具有正确性、确定性、有限性、输入和输出五个特性。

P5

(4)数据的逻辑结构可以分为线性结构和非线性结构两大类。

(5)除了顺序存储结构与链式存储结构之外,数据的存储结构通常还有索引和散列结构。

(6)数据的逻辑结构是指研究数据元素之间的关联方式,而存储结构是指数据在计算机中的存放方式。

P3

(7)逻辑上相邻的数据元素在物理位置上也相邻是顺序存储结构的特点之一。

(8)为了实现随机访问,线性结构应该采用顺序存储结构。

(9)链式存储结构的主要优点是数据不必连续存放。

(10)算法分析是指算法效率分析,主要从时间效率和空间效率这两个方面对算法进行分析。

1.3通常说数据结构是一个二元组(D,R),其中D,R分别代表什么?

答:

数据结构是一个二元组Data_Structure=(D,R)其中,D是数据元素的有限集,R是D上关系的有限集。

1.4何谓数据的逻辑结构?

何谓数据的存储结构?

两者有何联系?

书上有

历年试题一

1.在数据结构中,数据的逻辑结构可以分成( B  )

A.内部结构和外部结构B.线性结构和非线性结构

C.紧凑结构和非紧揍结构D.动态结构和静态结构

2.下列说法正确的是( C  )P3

A.数据是数据元素的基本单位

B.数据元素是数据项中不可分割的最小标识单位

C.数据可由若干个数据元素构成

D.数据项可由若干个数据元素构成

3.数据结构的基本任务是( A  )

A.逻辑结构和存储结构的设计B.数据结构的运算实现

C.数据结构的评价与选择D.数据结构的设计与实现

4.在一个具有n个结点的有序单链表中插入一个新结点,并使插入后仍然有序,则该操作的时间复杂性量级为( B  )

A.O

(1)B.O(n)C.O(nlog2n)D.O(n2)

5.若结点的存储地址与其关键字之间存在某种映射关系,则称这种存储结构为(D)

A.顺序存储结构B.链式存储结构

C.索引存储结构D.散列存储结构

6、选出正确的表述

(1)顺序存储方式只能用于存储线性结构。

(2)顺序存储方式的优点是存储密度大,且插入、删除运用算效率高。

错(效率低)

(3)链表的每个结点中都恰好包含一个指针。

(4)散列法存储的基本思想是由关键码的值决定数据的存储地址。

(5)散列表的结点中只包含数据元素自身的信息,不包含任何指针。

(6)负载因子(装填因子)是散列法的一个重要参数,它反映散列表的装满程度。

(7)栈和队列的存储方式既可是顺序方式,也可是链接方式。

*(8)用二叉链表法(llink--rlink法)存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。

*(9)用相邻矩阵法存储一个图时,在不考虑压缩存储的情况下,所占用的存储空间大小只与图中结点个数有关,而与图的边数无关。

*(10)邻接表法只能用于有向图的存储,而相邻矩阵法对于有向图和无向图的存储都适用。

7.表示逻辑关系的存储结构可以有四种方式,即顺序存储方式、链式存储方式、索引存储方式和散列存储方式。

8.下列程序段的时间复杂度为O(n2)。

  product=1;执行了1次

  for(i=n;i>0;i--)

   for(j=i+1;j

    product*=j;

n0

n-10

n-21

n-32

````

1n-2

0+0+1+2+(n-2)=(1+n-2)*(n_2)/2=(n-1)(n-2)/2

9.文件上的两类主要操作为读和写。

10.文件的基本运算包括浏览和修改两类。

11.下列程序段的时间复杂性量级是O(n2)。

for(i=1;i

for(j=1;j

t=t+1;

10

21

32

```

n-1n-2

0+1+2+````+(n-2)=同上

12.若一个算法中的语句频度之和为T(n)=3720n+4nlogn,则算法的时间复杂度为O(nlogn)。

(影响最大的那个项)

第二章课后练习

例2.1已知长度为n的非空线性表A采用顺序存储结构,表中数据元素按值的大小非递减排列,请写出删除该线性表中值相同的多余元素的算法。

算法思想比较简单,只需从表的第一个数据元素开始到最后那个数据元素,反复做以下动作:

比较相邻的两个数据元素是否相同,若相同,则删除其中一个;若不相同,则比较下一对相邻元素。

算法如下:

voidDELETEITEM1(ElemTypeA[],ihth))

{

intj,i:

0;

while(i

if(A[i]!

=A[i+1])/x若相邻两个元素不相同。

i++;

else{/*若相邻两个元素相同,则删除其中一个*/

for(j=i++;i

A[j-]=A[j];

n--;/x表长减1x/

}

}

}

上述算法的时间复杂度为O(n2)。

对算法进行改进,得到一个时间复杂度为O(n)的

算法不是很困难。

这里,设置两个整型变量i与k,它们的初值分别为1与0。

若在比较

过程中发现A[i]与A[k]不同,则先将k后移一个位置,然后将A[i]送到A[k]的位置上;

若A[i]与A[k]相同,只是将i后移一个位置。

当表中所有元素都处理完毕时,k+1正好

是删除多余元素以后线性表的长度。

改进后的算法如下:

voidDELETEITEM2(ElemTypeA[],int&n)

{

intk,i;

if(n>1)1

k=0;

for(i=1;i

if(A[i]!

=A[k])/x若A[i]与A[k]不相同时。

A[++k]=A[i];

n=k+1;/。

得到删除以后的表长。

}

}

14.将两个按值有序的非空线性链表合并为一个按值有序的线性链表

设lista与listb分别为两个有序链表第一个链结点的指针。

将这两个有序链表合并

为一个有序链表,其第一个链结点的指针为listc。

这里,只需设置三个指针p,q和r,其中,p和q分别指向链表lista和链表listb当前待

比较插入的链结点,而r指向链表listc中当前最后那个链结点。

然后不断地比较p与q

所指的链结点的数据域值,若p->datadata,则将p指的链结点链接到r所指的链

结点之后,否则将q指的链结点链接到r所指的链结点之后。

当其中一个链表为空时,只

需将另一个链表中剩余的链结点都依次链接到r所指的链结点之后即可。

初始时,让

listc指向lista和listb所指向的链结点中值小的那一个链结点。

LinkListMERGELIST(LinkListlista,LinkListlistb)

{

LinkListlistc,p,q,r;

if(lista->dada<=listb->data){

listc=lista;

r=lista;

p=lista->link;

1

else{

listc=listb;

r=listb;

q=listb->link;

}/xlistc指向lista和listb所指结点中值小者x/

while(p!

=NULL&&q!

=NULL)1

if(p->data<:

q->data){/x若当前p所指结点的值不大于q所指结点的值x/

r->link=p;/y将p所指结点链接到r所指结点之后x/

r=p;

p=p->link;

}

else{

r->link:

q;/。

将q所指结点链接到r所指结点之后‘/

r=q;

q=q—>link;

[

[

r->link=p?

p:

q;/x插人剩余链结点x/

return(listc);/x返回合并后的链表第一个链结点地址x/

}

若两个链表的长度分别为n与m,则上述算法的时间复杂度为O(n十m)。

在合并两

个链表为一个链表时不需要另外建立新链表的链结点空间,只需将给定的两个链表中的

链结点之间的链接关系解除,重新按照元素值的非递减关系将所有链结点链接成为一个

链表即可。

例2.5约瑟夫(Josephu)问题已知n个人(不妨以编号1,2,3,…,n分别表示)围坐在一张圆桌周围。

从编号为k的人开始报数,数到m的那个人出列,他的下一个人又从1开始报数,数到m的那个人又出列,依此规则重复下去,直到圆桌周围的人全部出歹,J。

例如,当n:

8,m’4,k二3时,出列的顺序依次为6,2,7,4,3,5,1,8。

解决约瑟夫问题可以利用多种数据结构,但比较简单和自然的方法是利用一个具有n个链结点、且不带头结点的循环链表。

将圆桌周围的每一个人对应着该链表中的一个链结点,某个人出列相当于从链表中删除一个链结点。

下面的算法就是在该循环链表中不断地报数,不断地删除一个链结点,直到循环链表中还剩一个链结点时游戏结束。

整个算法可以分为三个部分:

(1)建立一个具有n个链结点且无头结点的循环链表;

(2)确定第一个报数点的位置;

(3)不断地从链表中删除一个链结点,直至链表中还有一个链结点。

voidJOSEPHUS(intn,int,m,intk)LinkListp,r,listxNULL;inti;for(i;1;i<:

n;i++){

p’(LinkList)malloc(sizeof(LNode))

p—>data:

i;

if(1ist;;NULL)

list’p;else

r—>linkr=p;p->link:

list;p=list;for(i=1;i

r=p;

p=p->link;while(p->link!

=p){

for(i=1;i

r=p;

p=p->link;r->link=p->link;printf("%4d",p->data);free(p);p=r->link;/x申请一个新的链结点。

//x存放第i个结点的编号。

//x至此,建立一个循环链表x//x此时p指向第一个出发结点。

/P指向第m个结点,r指向第m—/。

删除第m个结点,//x输出一个结点编号x//x释放被删除结点的空间x//*p指向新的出发结点x/1个结点x/

}

printf("最后被删除的节点是:

%4d\n",p->data);

}

习题2.1判断题(在你认为正确的题后的括号中打√,否则打X)。

(1)空线性表的特征是表中数据元素都未赋值。

(X)

(2)线性表的顺序存储结构必须占用一片地址连续的存储单元。

(√)

(3)用一维数组存储线性表时,表中第i个元素存放在下标为i的数组元素中。

(X)

(4)采用顺序存储结构的线性表又称为顺序表。

(√)

(5)—个数据元素的地址是指该元素占用的若干存储单元的第一个单元的地址。

(√)

(6)线性表占用的存储单元的数量与表中数据元素的类型有关。

(√)

(7)线性表的顺序存储结构要比链式存储结构节省存储空间。

(√)

(8)线性表的链式存储结构要比顺序存储结构节省存储空间。

(X)

(9)若线性表采用顺序存储结构线性表的长度等于表中元素的个数与每个元素所占内存单元之乘积。

(√)

(10)若线性表采用顺序存储结构,每个数据元素占用4个存储单元,第12个数据元素的存储地址为144则第1个数据元素的存储地址是101。

(X)

a+4(i-1)=144a+4*11=144a=100

(11)在长度为n的顺序表的第i个位置插入一个数据元素,i的合法值为1≤i≤N。

(X)1<=i<=N+1

(12)删除长度为n的顺序表的第i个数据元素,i的合法值为1≤i≤n。

(√)

(13)在长度为n的顺序表中插入一个数据元素的时间复杂度为O(n)。

(√)

(14)线性表的链式存储结构不必占用地址连续的存储空间。

(√)

(15)链表中的每个链结点占用的存储空间不必连续。

(X)

(16)一个链结点的地址是指该链结点占用的若干存储单元的第一个单元的地址。

(√)

(17)非空线性链表的最后那个链结点的指针域不能为空,应该存放NULL。

(√)

(18)所谓空链表是指没有任何链结点的链表。

(X)

(19)任何一个链表都可以根据需要设置一个头结点。

(√)

(20)每个链表的前面都必须设置一个头结点。

(X)

(21)线性链表(单向链表)中的每个链结点只有后继结点,没有前驱结点。

(X)

(22)一个空的链表不占用任何存储空间。

(X)

(23)若指针变量list指向一个空链表,则list中什么也没有。

(√)

(24)无论出现在算法的什么地方,符号p->data表示的意思都一样。

(√)

(25)在算法中,符号p->link表示p所指的下一个链结点的地址。

(√)

(26)删除非空线性链表的第一个链结点只需执行语句list=list->link。

(√)

(27)循环链表的最后那个链结点的指针域中存放着链表最前面那个结点的地址。

(X)

(28)设置一个指针变量,它可以遍历整个循环链表。

(√)

(29)双向链表的头结点指针要比线性链表的头结点指针占用更多的存储空间。

(√)

(30)在链结点数目相同的前提下,双向链表占用的空间是线性链表的2倍。

(X)

单项选择题。

B

(1)一个顺序表所占用的存储空间大小与——无关。

A.表的长度B.元素的存放顺序C.元素的类型D。

元素中各字段的类型

A

(2)设存储分配是从低地址到高地址进行的。

若每个元素占用4个存储单元,则某元素的地

址是指它所占用的单元的

A.第1个单元的地址B.第2个单元的地址

C.第3个单元的地址n第4个单元的地址

B(3)若线性表采用顺序存储结构,每个元素占用4个存储单元,第1个元素的存储地址为100,

则第12个元素的存储地址是.。

A.112B.144C.1480.412

D(4)若长度为n的线性表采用顺序存储结构,在表的第i个位置插入一个数据元素,i的合法值应该是——。

A.i>OB.i≤nC.1≤i≤nD.1≤i≤n+1

C(5)若长度为n的非空线性表采用顺序存储结构,删除表的第i个数据元素,i的合法值应该是

A.i>OB.i≤nC.1≤i≤nD。

1≤i≤n十1

A(6)若长度为n的非空线性表采用顺序存储结构,删除表的第i个数据元素,首先需要移动表

中——个数据元素。

A.n-iB.n+iC.n-i+lD.n-i-1

C(7)若长度为n的线性表采用顺序存储结构,在表的第i个位置插入一个数据元素,需要移动

表中——个元素。

A.iB.n+iC.n-i+lD.n-i-1

A(8)若频繁地对线性表进行插入和删除操作,该线性表应该采用——存储结构。

A.散列B.顺序C.链式D.索引

C(9)链表中所占用的存储单元地址一定是。

A.无序的B.连续的C.不连续的D.部分连续的

B(10)链表中的每一个链结点所占用的存储单元——。

A.不必连续B.一定连续C.部分连续D.连续与否无所谓

D(11)与单链表相比,双向链表的优点之一是。

A.插入、删除操作更简单B.可以进行随机访问

C.可以省略头结点指针D.顺序访问相邻结点更灵活

A(12)若list是某带头结点的循环链表的头结点指针,则该链表最后那个链结点的指针域中存

放的是——。

A.1ist的地址B.1ist的内容

C.1ist指的链结点的值D.链表第一个链结点的地址

D(13)若list是某带头结点的循环链表的头结点指针,当p(p与list同类型)指向链表的最后那

个链结点时,——。

A.该结点的指针域为空B.p为空

C.p的内容与头结点的内容相同D.该链结点指针域内容与list的内容相同

A(14)若listl和list2分别为一个单链表与一个双向链表的第一个结点的指针,则——。

A.1ist2比listl占用更多的存储单元B.1istl与list2占用相同的存储单元

C.1istl和list2应该是相同类型的指针变量D.双向链表比单链表占用更多的存储单元

A(15)在表达式中,符号p->link表示——。

A.p所指的链结点的指针域(位置)

B.p所指的链结点的指针域的内容

C.p所指的链结点的下一个链结点的地址

D.p所指的链结点的下一个链结点的地址(出现在表达式中)

B(16)在一个具有n个链结点的线性链表中查找某一个链结点,若查找成功,需要平均比较

——个链结点。

A.nB.n/2C.(n+1)/2D.(n-1)/Q

B(17)从一个具有n个链结点的有序线性链表(即链结点按照数据域值有序链接)中插入一个

新的链结点,并且仍然保持链表有序的时间复杂度为——。

A.O

(1)B.O(n)C.O(n

(2))D.O(log2(n))

B(18)给定具有n个元素的顺序表,建立一个有序线性链表的时间复杂度为——。

A.O

(1)B.O(n)C.O(n

(2))D.O(log2(n))

B(19)在非空线性链表中由p所指的链结点后面插入一个由q所指的链结点的过程是依次执

行——。

A.q->link=p;p->link=q;B.q->link=p->link;p->link=q;

C.q->link=p->link;p=q;D.p->link=q;q->link=p;

C(20)若删除非空线性链表中由p所指的链结点的直接后继链结点的过程是依次执行

________.

A.r=p->link;p->link=r;free(r);

B.r=p->link;p->link=r->link;free(r);

C.r=p->link;p->link=r->link;free(p);

D.p->link=p->link->link;free(p);

B(21)在非空双向循环链表中由q所指的链结点后面插入一个由p所指的链结点的动作依次

为:

p->llink=Q;p->rlink=q->rlink;q->rlink=p;——。

(空白处为一条赋值

语句)

A.q->llink=pB.q->rlink->llink=p

C.p->fiink->llink=pD.p->llink->llink=p

B(22)在非空双向循环链表中由q所指的那个链结点前面插入一个p所指的链结点的动作对

应的语句依次为:

p->rlink(右边)=Q;p->llink(左边)=q->llink;q->[1ink=p;——。

(空白

处为一条赋值语句)

A.q->rlink=p;B.q->llink->rlink=p;

C.p->rlink->rlink=p;D.p->llink->rlink=p;

A(23)在包含有1000个数据元素的线性表中实现如下四个操作,所需要的执行时间最长的是

一O

A.线性表采用顺序存储结构,在第10个元素后面插入一个新的元素

需要移动的元素(1000-10+1)

B.线性表采用链式存储结构,在第10个元素后面插入一个新的元素(10)

C.线性表采用顺序存储结构,删除第990个元素(1000-990)

D.线性表采用链式存储结构,删除p所指的链结点

2.3填空题。

(1)顺序表是一种顺序存储线性表。

(2)在程序设计中,描述线性表的顺序存储结构一般都用数组。

(3)在顺序表情况下,删除线性表中一个数据元素平均要移动表中近一半的元素。

(4)在顺序表的尾部第n+1处插入一个新的数据元素不必移动任何元素。

(5)若长度为n的线性表采用顺序存储结构,在其第i个位置(1≤i≤n+1)插入一个新的数据

元素,当不溢出时,首先移动I到n之间的元素,然后在第i的位置写上新元素,最后返回前,线性表长度加1。

(6)若长度为n的线性表采用顺序存储结构,删除其第i个元素(1≤i≤n),首先将i+1到n移动,然后长度加1。

(7)若长度为n的线性表采用顺序存储结构,插入或删除一个元素的时间复杂度为O(n)。

(8)若某线性表采用顺序存储结构,每个元素占4个存储单元,首地址为100,则第12个元素的存储地址为144。

=100+4*(12-1)

(9)线性表的链式存储结构主要包括单链表、双向链表和单向循环链表三种形式。

(10)线性表的顺序存储结构是通过数组来直接反映数据元素之间的逻辑关系,而链式存

储结构则是通过指针间接反映数据元素之间的逻辑关系。

(11)根据链数率的多少,可以将链表分为线性链表(单链表)与双向链表。

(12)若对线性表进行的操作主要不是插入和删除,则该线性表宜采用顺序存储结构,若

频繁地对线性表进行插入和删除操作,则该线性表宜采用链式存储结构。

(13)删除由list所指的线性链表的第一个链结点是执行操作r=list->next;list->next=r->next;free(r)。

(14)删除非空线性链表中由q所指的链结点(其直接前驱结点由r指出)的动作是执行语句

r->next=q->next和free(q)。

(15)在线性链表中由q所指的链结点后面插入一个地址为p的新结点的过程是依次执行操

作p->next=q->next和q->next=p。

(16)若p为指向循环链表中某链结点的指针变量,判断循环链表是否只有一个链结点的标志是head->next=head。

(17)删除非空双向链表中由q所指的链结点的过程是执行语句q->prior->next=q->next;q->next->prior=q->prior和free(q)。

(18)在具有n个链结点的链表的已知位置插入一个链结点的时间复杂度为O

(1)。

(19)在具有n个链结点的链表中查找一个链结点的时

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1