严蔚敏 数据结构课后习题及答案解析

更新时间:2023-11-24 11:16:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章 绪论

一、选择题

1.组成数据的基本单位是( )

(A)数据项(B)数据类型(C)数据元素(D)数据变量 2.数据结构是研究数据的( )以及它们之间的相互关系。 (A)理想结构,物理结构 (B)理想结构,抽象结构 (C)物理结构,逻辑结构 (D)抽象结构,逻辑结构 3.在数据结构中,从逻辑上可以把数据结构分成( ) (A)动态结构和静态结构 (B)紧凑结构和非紧凑结构 (C)线性结构和非线性结构(D)内部结构和外部结构

4.数据结构是一门研究非数值计算的程序设计问题中计算机的 (①)以及它们之间的(②)和运算等的学科。

① (A)数据元素(B)计算方法(C)逻辑存储(D)数据映像 ② (A)结构 (B)关系 (C)运算 (D)算法 5.算法分析的目的是()。

(A) 找出数据结构的合理性 (B)研究算法中的输入和输出的关系 (C)分析算法的效率以求改进(D)分析算法的易懂性和文档性

6.计算机算法指的是(①),它必须具备输入、输出和(②)等5个特性。 ① (A)计算方法(B)排序方法(C)解决问题的有限运算序列(D)调度方法 ② (A)可执行性、可移植性和可扩充性(B)可行性、确定性和有穷性 (C)确定性、有穷性和稳定性 (D)易读性、稳定性和安全性 二、判断题

1.数据的机内表示称为数据的存储结构。( ) 2.算法就是程序。( )

3.数据元素是数据的最小单位。( )

4.算法的五个特性为:有穷性、输入、输出、完成性和确定性。( ) 5.算法的时间复杂度取决于问题的规模和待处理数据的初态。( ) 三、填空题

1.数据逻辑结构包括________、________、_________ 和_________四种类型,其中树形结构和图形结构合称为_____。

2.在线性结构中,第一个结点____前驱结点,其余每个结点有且只有______个前驱结点;最后一个结点______后续结点,其余每个结点有且只有_______个后续结点。

3.在树形结构中,树根结点没有_______结点,其余每个结点有且只有_______个前驱结点;叶子结点没有________结点,其余每个结点的后续结点可以_________。 4.在图形结构中,每个结点的前驱结点数和后续结点数可以_________。

5.线性结构中元素之间存在________关系,树形结构中元素之间存在______关系,图形结构中元素之间存在_______关系。

6.算法的五个重要特性是_______、_______、______、_______、_______。 7.数据结构的三要素是指______、_______和________。

8.链式存储结构与顺序存储结构相比较,主要优点是________________________________。 9.设有一批数据元素,为了最快的存储某元素,数据结构宜用_________结构,为了方便插入一个元素,数据结构宜用____________结构。

四、算法分析题

1.求下列算法段的语句频度及时间复杂度

参考答案:

一、选择题

1. C 2.C 3. C 4. A、B 5. C 6.C、B

二、判断题:

1、√ 2、 × 3、× 4、× 5、√

三、填空题

1、线性、树形、图形、集合? ;非线性(网状) 2、没有;1;没有;1 3、前驱;1;后继;任意多个 4、任意多个 5、一对一;一对多;多对多6、有穷性;确定性;可行性;输入;输出 7、数据元素;逻辑结构;存储结构 8、插入、删除、合并等操作较方便 9、顺序存储;链式存储

四、算法分析题

for(i=1; i<=n; i++)

for(j =1; j <=i ; j++) x=x+1;

分析:该算法为一个二重循环,执行次数为内、外循环次数相乘,但内循环次数不固定,与外循环有关,因些,时间频度T(n)=1+2+3+…+n=n*(n+1)/2

有 1/4≤T(n)/n2≤1,故它的时间复杂度为O(n2), 即T(n)与n2 数量级相同。 2、分析下列算法段的时间频度及时间复杂度 for (i=1;i<=n;i++) for (j=1;j<=i;j++) for ( k=1;k<=j;k++) x=i+j-k;

分析算法规律可知时间频度T(n)=1+(1+2)+(1+2+3)+...+(1+2+3+…+n) 由于有1/6 ≤ T(n)/ n3 ≤1,故时间复杂度为O(n3)

第二章 线性表

一、选择题

1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( ) (A)110 (B)108(C)100 (D)120

2. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动( )个元素。

(A)64(B)63 (C)63.5 (D)7

3.线性表采用链式存储结构时,其地址( )。 (A) 必须是连续的 (B) 部分地址必须是连续的 (C) 一定是不连续的 (D) 连续与否均可以

4. 在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行( ) (A)s->next=p;p->next=s; (B) s->next=p->next;p->next=s; (C)s->next=p->next;p=s; (D)p->next=s;s->next=p;

5.在一个单链表中,若删除p所指结点的后续结点,则执行( )

(A)p->next=p->next->next; (B)p=p->next; p->next=p->next->next; (C)p->next=p->next; (D)p =p->next->next; 6.下列有关线性表的叙述中,正确的是( ) (A)线性表中的元素之间隔是线性关系 (B)线性表中至少有一个元素

(C)线性表中任何一个元素有且仅有一个直接前趋

(D)线性表中任何一个元素有且仅有一个直接后继 7.线性表是具有n个( )的有限序列(n≠0)

(A)表元素 (B)字符 (C)数据元素 (D)数据项 二、判断题

1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。( ) 2.如果没有提供指针类型的语言,就无法构造链式结构。( )

3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继。( )

4.语句p=p->next完成了指针赋值并使p指针得到了p指针所指后继结点的数据域值。( ) 5.要想删除p指针的后继结点,我们应该执行q=p->next ; p->next=q->next; free(q)。( ) 三、填空题

1.已知P为单链表中的非首尾结点,在P结点后插入S结点的语句为:_______________________ 。

2.顺序表中逻辑上相邻的元素物理位置( )相邻, 单链表中逻辑上相邻的元素物理位置_________相邻。

3.线性表L=(a1,a2,...,an)采用顺序存储,假定在不同的n+1个位置上插入的概率相同,则插入一个新元素平均需要移动的元素个数是________________________ 4.在非空双向循环链表中,在结点q的前面插入结点p的过程如下: p->prior=q->prior; q->prior->next=p; p->next=q;

______________________;

5.已知L是无表头结点的单链表,是从下列提供的答案中选择合适的语句序列,分别实现: (1)表尾插入s结点的语句序列是_______________________________ (2) 表尾插入 s结点的语句序列是_______________________________

1. p->next=s; 2. p=L; 3. L=s;

4. p->next=s->next;

5. s->next=p->next; 6. s->next=L; 7. s->next=null;

8. while(p->next!= Q)? p=p-next; 9. while(p->next!=null) p=p->next;

四、算法设计题

1.试编写一个求已知单链表的数据域的平均值的函数(数据域数据类型为整型)。 2.已知带有头结点的循环链表中头指针为head,试写出删除并释放数据域值为x的所有结点的c函数。

3.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。现出库(销售)m台价格为h的电视机,试编写算法修改原链表。

4.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。现新到m台价格为h的电视机,试编写算法修改原链表。 5.线性表中的元素值按递增有序排列,针对顺序表和循环链表两种不同的存储方式,分别编写C函数删除线性表中值介于a与b(a≤b)之间的元素。

6.设A=(a0,a1,a2,...,an-1),B=(b0,b1,b2,...,bm-1)是两个给定的线性表,它们的结点个数分别是n和m,且结点值均是整数。

若n=m,且 ai= bi (0≤i

若存在一个j, jB。 试编写一个比较A和B的C函数,该函数返回 -1或 0或 1,分别表示 AB。 7.试编写算法,删除双向循环链表中第k个结点。

8.线性表由前后两部分性质不同的元素组成(a0,a1,...,an-1,b0,b1,...,bm-1),m和n为两部分元素的个数,若线性表分别采用数组和链表两种方式存储,编写算法将两部分元素换位成(b0,b1,...,bm-1,a0,a1,...,an-1),分析两种存储方式下算法的时间和空间复杂度。 9.用循环链表作线性表(a0,a1,...,an-1)和(b0,b1,...,bm-1)的存储结构,头指针分别为ah和bh,设计C函数,把两个线性表合并成形如(a0,b0,a1,b1,…)的线性表,要求不开辟新的动态空间,利用原来循环链表的结点完成合并操作,结构仍为循环链表,头指针为head,并分析算法的时间复杂度。

while(a[i]==b[i]&&i

if(n==m&&i==n) return(0); if(nm&&i==m) return(1); if(i

if(a[i]b[i]) return(1); }

7、

void del(DUNODE **head,int i) {

DUNODE *p; if(i==0) {

*head=*head->next; *head->prior=NULL; return(0); } Else

{for(j=0;jnext;

if(p==NULL||j>i) return(1); p->prior->next=p->next; p->next->prior=p->proir; free(p); return(0); }

8. 顺序存储:

void convert(elemtype list[],int l,int h) /* 将数组中第l个到第h个元素逆置*/ { int i;

elemtype temp;

for(i=h;i<=(l+h)/2;i++) {

temp=list[i]; list[i]=list[l+h-i]; list[l+h-i]=temp; } }

void exchange(elemtype list[],int n,int m); {

convert(list,0,n+m-1); convert(list,0,m-1); convert(list,m,n+m-1); }

该算法的时间复杂度为O(n+m),空间复杂度为O(1) 链接存储:(不带头结点的单链表) typedef struct node {

elemtype data; struct node *link; }NODE;

void convert(NODE **head,int n,int m) {

NODE *p,*q,*r; int i; p=*head; q=*head;

for(i=0;i

q=q->link; /*q指向an-1结点 */ r=q->link; q->link=NULL; while(r->link!=NULL)

r=r->link; /*r指向最后一个bm-1结点 */ *head=q; r->link=p; }

该算法的时间复杂度为O(n+m),但比顺序存储节省时间(不需要移动元素,只需改变指针),空间复杂度为O(1) 9.

typedef struct node {

elemtype data; struct node *link; }NODE;

NODE *union(NODE *ah,NODE *bh) {

NODE *a,*b,*head,*r,*q; head=ah; a=ah; b=bh;

while(a->link!=ah&&b->link!=bh) {

r=a->link; q=b->link; a->link=b; b->link=r; a=r; b=q; }

if(a->link==ah) /*a的结点个数小于等于b的结点个数 */ {

a->link=b;

while(b->link!=bh) b=b->link; b->link=head; }

if(b->link==bh) /*b的结点个数小于a的结点个数 */ {

r=a->link; a->link=b; b->link=r; }

return(head); }

该算法的时间复杂度为O(n+m),其中n和m为两个循环链表的结点个数. 10.

typedef struct node {

elemtype data; struct node *link; }NODE;

void analyze(NODE *a) {

NODE *rh,*qh,*r,*q,*p;

int i=0,j=0;/*i为序号是奇数的结点个数 j为序号是偶数的结点个数 */ p=a;

rh=(NODE *)malloc(sizeof(NODE));/*rh为序号是奇数的链表头指针 */ qh=(NODE *)malloc(sizeof(NODE)); /*qh为序号是偶数的链表头指针 */ r=rh; q=qh;

while(p!=NULL) {

r->link=p; r=p; i++; p=p->link; if(p!=NULL) {

q->link=p; q=p; j++; p=p->link; } }

rh->data=i; r->link=rh; qh->data=j; q->link=qh; } 11.

typedef struct node {

elemtype data; struct node *link; }NODE;

void change(NODE *head) {

NODE *p; p=head; if(head!=NULL) {

本文来源:https://www.bwwdw.com/article/91zt.html

Top