《严蔚敏_数据结构课后习题及答案解析.doc》由会员分享,可在线阅读,更多相关《严蔚敏_数据结构课后习题及答案解析.doc(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、. .第一章 绪论一、选择题 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研究算法中的
2、输入和输出的关系 C分析算法的效率以求改良D分析算法的易懂性和文档性 6.计算机算法指的是,它必须具备输入、输出和等5个特性。 A计算方法B排序方法C解决问题的有限运算序列D调度方法 A可执行性、可移植性和可扩大性B可行性、确定性和有穷性 C确定性、有穷性和稳定性 D易读性、稳定性和平安性 二、判断题 1.数据的机内表示称为数据的存储构造。 2.算法就是程序。 3.数据元素是数据的最小单位。 4.算法的五个特性为:有穷性、输入、输出、完成性和确定性。 5.算法的时间复杂度取决于问题的规模和待处理数据的初态。 三、填空题 1.数据逻辑构造包括_、_、_ 和_四种类型,其中树形构造和图形构造合称为
3、_。 2.在线性构造中,第一个结点_前驱结点,其余每个结点有且只有_个前驱结点;最后一个结点_后续结点,其余每个结点有且只有_个后续结点。 3.在树形构造中,树根结点没有_结点,其余每个结点有且只有_个前驱结点;叶子结点没有_结点,其余每个结点的后续结点可以_。 4.在图形构造中,每个结点的前驱结点数和后续结点数可以_。 5.线性构造中元素之间存在_关系,树形构造中元素之间存在_关系,图形构造中元素之间存在_关系。6.算法的五个重要特性是_、_、_、_、_。 7.数据构造的三要素是指_、_和_。 8.链式存储构造与顺序存储构造相比拟,主要优点是_。 9.设有一批数据元素,为了最快的存储某元素,
4、数据构造宜用_构造,为了方便插入一个元素,数据构造宜用_构造。 四、算法分析题 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
5、; j+)x=x+1;分析:该算法为一个二重循环,执行次数为内、外循环次数相乘,但内循环次数不固定,与外循环有关,因些,时间频度T(n)=1+2+3+n=n*(n+1)/2有 1/4T(n)/n21,故它的时间复杂度为(n2), 即(n)与n2 数量级一样。 2、分析以下算法段的时间频度及时间复杂度 for i=1;i=n;i+ for (j=1;j=i;j+) for ( k=1;knext=p;p-next=s; B s-next=p-next;p-next=s;Cs-next=p-next;p=s; Dp-next=s;s-next=p;5.在一个单链表中,假设删除p所指结点的后续结点,
6、那么执行 Ap-next=p-next-next; Bp=p-next; p-next=p-next-next;Cp-next=p-next; Dp =p-next-next;6.以下有关线性表的表达中,正确的选项是 A线性表中的元素之间隔是线性关系 B线性表中至少有一个元素 C线性表中任何一个元素有且仅有一个直接前趋 D线性表中任何一个元素有且仅有一个直接后继 7.线性表是具有n个 的有限序列n0)A表元素 B字符 C数据元素 D数据项 二、判断题 1.线性表的存储,表中元素的逻辑顺序与物理顺序一定一样。 2.如果没有提供指针类型的语言,就无法构造链式构造。 3.线性构造的特点是只有一个结点
7、没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继。 4.语句p=p-next完成了指针赋值并使p指针得到了p指针所指后继结点的数据域值。 5.要想删除p指针的后继结点,我们应该执行q=p-next ; p-next=q-next; free(q)。 三、填空题 1.P为单链表中的非首尾结点,在P结点后插入S结点的语句为:_ 。2.顺序表中逻辑上相邻的元素物理位置( )相邻, 单链表中逻辑上相邻的元素物理位置_相邻。 3.线性表La1,a2,.,an采用顺序存储,假定在不同的n1个位置上插入的概率一样,那么插入一个新元素平均需要移动的元素个数是_ 4.在非空双向循环链表中,在结点q的
8、前面插入结点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.
9、试编写一个求单链表的数据域的平均值的函数数据域数据类型为整型。 2.带有头结点的循环链表中头指针为head,试写出删除并释放数据域值为x的所有结点的c函数。 3.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。现出库销售m台价格为h的电视机,试编写算法修改原链表。 4.某百货公司仓库中有一批电视机,按其价格从低到高的次序构成一个循环链表,每个结点有价格、数量和链指针三个域。现新到m台价格为h的电视机,试编写算法修改原链表。 5.线性表中的元素值按递增有序排列,针对顺序表和循环链表两种不同的存储方式,分别编写C函数删除线性表中值介于a与b
10、ab之间的元素。 6.设A=(a0,a1,a2,.,an-1),B=(b0,b1,b2,.,bm-1)是两个给定的线性表,它们的结点个数分别是n和m,且结点值均是整数。 假设n=m,且 ai= bi 0in ,那么A=B; 假设nm ,且ai=bi 0in ,那么AB; 假设存在一个j, jm ,jn ,且ai=bi 0ij , 假设ajbj,那么AB。 试编写一个比拟A和B的C函数,该函数返回 -1或 0或 1,分别表示 AB。 7.试编写算法,删除双向循环链表中第k个结点。 8.线性表由前后两局部性质不同的元素组成(a0,a1,.,an-1,b0,b1,.,bm-1),m和n为两局部元素的
11、个数,假设线性表分别采用数组和链表两种方式存储,编写算法将两局部元素换位成(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,并分析算法的时间复杂度。 10.试写出将一个线性表分解为两个带有头结点的循环链表,并将两个循环链表的长度放在各自的头结点的数据域中的C函数。其中,线性
12、表中序号为偶数的元素分解到第一个循环链表中,序号为奇数的元素分解到第二个循环链表中。 11.试写出把线性链表改为循环链表的C函数。 12.己知非空线性链表中x结点的直接前驱结点为y,试写出删除x结点的C函数。 参考答案:一、选择题1. B 2.C 3. D 4. B 5. A 6.A 7、C二、判断题:参考答案:1、2、3、4、5、三、填空题1、s-next=p-next; p-next=s; 2、一定;不一定 3、n/2 4、q-prior=p; 5、(1)6) 3)(2) 2) 91) 7)四、算法设计题1、#include stdio.h#include malloc.htypedef
13、struct nodeint data; struct node *link;NODE;int aver(NODE *head)int i=0,sum=0,ave; NODE *p; p=head;while(p!=NULL)p=p-link;+i;sum=sum+p-data;ave=sum/i;return (ave);2、#include stdio.h#include malloc.htypedef struct nodeint data; /* 假设数据域为整型 */struct node *link;NODE;void del_link(NODE *head,int x) /* 删
14、除数据域为x的结点*/NODE *p,*q,*s;p=head;q=head-link;while(q!=head)if(q-data=x)p-link=q-link;s=q;q=q-link;free(s); elsep=q;q=q-link;3、void del(NODE *head,float price,int num)NODE *p,*q,*s;p=head;q=head-next;while(q-pricenext;if(q-price=price)q-num=q-num-num;else printf(无此产品);if(q-num=0)p-next=q-next;free(q);
15、4、#include stdio.h#include malloc.htypedef struct nodefloat price;int num;struct node *next;NODE;void ins(NODE *head,float price,int num)NODE *p,*q,*s;p=head;q=head-next;while(q-pricenext;if(q-price=price)q-num=q-num+num;elses=(NODE *)malloc(sizeof(NODE);s-price=price;s-num=num;s-next=p-next;p-next=
16、s;5、顺序表: 算法思想:从0开场扫描线性表,用k记录下元素值在a与b之间的元素个数,对于不满足该条件的元素,前移k个位置,最后修改线性表的长度。 void delelemtype list,int *n,elemtype a,elemtype b int i=0,k=0; whilei=a&listilink; /* 假设循环链表带有头结点 */while(q!=head & q-datalink;while(q!=head & q-datalink;free(r); if(p!=q)p-link=q;6、#define MAXSIZE 100int listAMAXSIZE,listBM
17、AXSIZE;int n,m;int pare(int a,int b)int i=0;while(ai=bi&in&im)i+;if(n=m&i=n) return(0);if(nm&i=m) return(1);if(in&im)if(aibi) return(1);7、void del(DUNODE*head,int i)DUNODE *p;if(i=0)*head=*head-next;*head-prior=NULL;return(0); Elsefor(j=0;jnext;if(p=NULL|ji) return(1);p-prior-next=p-next;p-next-prio
18、r=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=listi;listi=listl+h-i;listl+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),
19、空间复杂度为O(1)存储:(不带头结点的单链表)typedef struct nodeelemtype 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;ilink; /*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),但比顺序存储节省时间(不需要移
20、动元素,只需改变指针),空间复杂度为O(1)9.typedef struct nodeelemtype 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=hea
21、d;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 nodeelemtype 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 *mallocsizeofNODE;/*rh为序号是奇数的链表
22、头指针 */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 nodeelemtype data;struct node *link;NODE;void change(NODE*head)NODE*p;p=head; if(head!=NULL)while(
23、p-link!=NULL)p=p-link;p-link=head;12.typedef struct nodeelemtype data;struct node *link;NODE;void del(NODE *x,NODE *y)NODE *p,*q;elemtype d1; p=y;q=x;while(q-next!=NULL) /* 把后一个结点数据域前移到前一个结点*/ p-data=q-data;q=q-link;p=q;p-link=NULL; /* 删除最后一个结点*/free(q);第三章 栈和队列一、选择题 1. 一个栈的入栈序列是a,b,c,d,e,那么栈的不可能的输出
24、序列是 。A edcbaBdecbaCdceab Dabcde 2.栈构造通常采用的两种存储构造是 。A 线性存储构造和链表存储构造B散列方式和索引方式C链表存储构造和数组 D线性存储构造和非线性存储构造3.判定一个栈ST(最多元素为m0)为空的条件是 。A ST-top!=0 BST-top=0 CST-top!=m0 DST-top=m04.判定一个栈ST(最多元素为m0)为栈满的条件是 。AST-top!=0 BST-top=0 CST-top!=m0-1DST-top=m0-15.一个队列的入列序列是1,2,3,4,那么队列的输出序列是 。A4,3,2,1B1,2,3,4C1,4,3,
25、2D3,2,4,16.循环队列用数组A0,m-1存放其元素值,其头尾指针分别是front和rear那么当前队列中的元素个数是 A(rear-front+m)%m B rear-front+1 Crear-front-1Drear-front7.栈和队列的共同点是 A 都是先进后出 B都是先进先出C只允许在端点处插入和删除元素D没有共同点8.表达式a*(b+c)-d的后缀表达式是 。Aabcd*+-Babc+*d- Cabc*+d-D-+*abcd9.4个元素a1,a2,a3和a4依次通过一个栈,在a4进栈前,栈的状态,那么不可能的出栈序是(A)a4,a3,a2,a1(B)a3,a2,a4,a1
26、 (C)a3,a1,a4,a2(D)a3,a4,a2,a110.以数组Q0.m1存放循环队列中的元素,变量rear和qulen分别指示循环队列中队尾元素的实际位置和当前队列中元素的个数,队列第一个元素的实际位置是(A)rearqulen(B)rearqulenm(C)mqulen (D)1rearmqulen% m二、填空题1.栈的特点是_,队列的特点是_。2.线性表、栈和队列都是_构造,可以在线性表的_位置插入和删除元素,对于栈只能在_插入和删除元素,对于队列只能在_插入元素和_删除元素。3.一个栈的输入序列是12345,那么栈有输出序列12345是_。(正确/错误)4.设栈S和队列Q的初始
27、状态皆为空,元素a1,a2,a3,a4,a5和a6依次通过一个栈,一个元素出栈后即进入队列Q,假设6个元素出队列的顺序是a3,a5,a4,a6,a2,a1那么栈S至少应该容纳_个元素。三、算法设计题 1.假设有两个栈s1和s2共享一个数组stackM,其中一个栈底设在stack0处,另一个栈底设在stackM-1处。试编写对任一栈作进栈和出栈运算的C函数pushx,i)和pop(i),i=l,2。其中i=1表示左边的栈,,i=2表示右边的栈。要求在整个数组元素都被占用时才产生溢出。2.利用两个栈s1,s2模拟一个队列时,如何用栈的运算来实现该队列的运算?写出模拟队列的插入和删除的C函数。 一个
28、栈s1用于插入元素,另一个栈s2用于删除元素.参考答案:一、选择题1. C 2.A 3. B 4. B 5. B 6.B 7、C 8、C 9、C 10、D 二、填空题1、先进先出;先进后出2、线性 ; 任何 ;栈顶;队尾;对头3、正确的 4、3三、算法设计题1.#define M 100elemtype stackM;int top1=0,top2=m-1;int push(elemtype x,int i)if(top1-top2=1) return(1); /*上溢处理*/elseif(i=1) stacktop1+=x;if(i=2)stacktop2-=x;return(0); int
29、 pop(elemtype *px,int i)if(i=1)if(top1=0) return(1);else top1-;*px=stacktop1;return(0);elseif(i=2)if(top2=M-1) return(1);elsetop2+;*px=stacktop2;return(0);2.elemtype s1MAXSIZE,s2MAZSIZE;int top1,top2;void enqueue(elemtype x)if(top1=MAXSIZE) return(1);elsepush(s1,x);return(0);void dequeue(elemtype *p
30、x)elemtype x;top2=0;while(!empty(s1)pop(s1,&x);push(s2,x);pop(s2,&x);while(!empty(s2)pop(s2,&x);push(s1,x);第四章串一、选择题 1.以下关于串的表达中,正确的选项是 (A)一个串的字符个数即该串的长度 (B)一个串的长度至少是1(C)空串是由一个空格字符组成的串 (D)两个串S1和S2假设长度一样,那么这两个串相等2.字符串abaaabab的nextval值为(? )(A)(0,1,01,1,0,4,1,0,1) (B)(0,1,0,0,0,0,2,1,0,1)(C)(0,1,0,1,0,
31、0,0,1,1) (D)(0,1,0,1,0,1,0,1,1)3.字符串满足下式,其中head和tail的定义同广义表类似,如head(xyz)= x,tail(xyz)= yz,那么s=( )。 concat(head(tail(s),head(tail(tail(s)= dc。(A)abcd (B)acbd (C)acdb (D)adcb4.串是一种特殊的线性表,其特殊性表现在 (A)可以顺序存储 (B)数据元素是一个字符(C)可以链式存储 (D)数据元素可以是多个字符5设串S1=ABCDEFG,s2=PQRST,函数CONCATX,Y返回X和Y串的连接串,SUBSTRS,I,J返回串S从
32、序号I开场的J个字符组成的字串,LENGTHS返回串S的长度,那么CONCATSUBSTRS1,2,LENGTHS2,SUBSTRS1,LENGTHS2,2的结果串是 ABCDEF (B) BCDEFG (C)BCPQRST (D)BCDEFEF 二、算法设计 1.分别在顺序存储和一般存储两种方式下,用C语言写出实现把串s1复制到串s2的串复制函数strcpy(s1,s2)。2.在一般存储(一个结点存放一个字符)方式下,写出采用简单算法实现串的模式匹配的C语言函数int L_index(t,p)。参考答案:一、选择题 1. A 2.B 3. D 4. D 5. D 二、算法设计1.顺序存储:
33、#include string.h#define MAXN 100char sMAXN;int S_strlen(char s)int i;for(i=0;si!=0;i+);return(i);void S_strcpy(char s1,char s2) /4.3题int i;for(i=0;s1i!=0;i+)s2i=s1i;s2i=0;一般存储: #include stdio.htypedef struct nodechar data;struct node *link;NODE;NODE *L_strcpy(NODE *s1) NODE *s2,*t1,*t2,*s;if(s1=NUL
34、L) return(NULL);elset1=s1;t2=(NODE *)malloc(sizeof(NODE);s2=t2;while(t1!=NULL)s=(NODE *)malloc(sizeof(NODE);s-data=t1-data;t2-link=s;t2=s;t1=t1-link;t2-link=NULL;s=s2;s2=s2-link;free(s);return(s2); 2.#include stdio.htypedef struct nodechar data;struct node *link;NODE;int L_index(NODE *t,NODE *p) NOD
35、E *t1,*p1,*t2;?int i;t1=t;i=1;while(t1!=NULL)p1=p;t2=t1-link;while(p1-data=t1-data&p1!=NULL) p1=p1-link;t1=t1-link;if(p1=NULL) return(i);i+;t1=t2;return(0);第五章 数组和广义表一、选择题 1. 常对数组进展的两种根本操作是 A建立与删除B索引和修改C查找和修改D查找与索引2.二维数组M的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i的X围从0到4,列下标j的X围从0到5,M按行存储时元素M35的起始地址与M按列存储时元素( )
36、的起始地址一样。AM24BM34CM35DM443.数组A810中,每个元素A的长度为3个字节,从首地址SA开场连续存放在存储器内,存放该数组至少需要的单元数是 。A80B100C240D2704.数组A810中,每个元素A的长度为3个字节,从首地址SA开场连续存放在存储器内,该数组按行存放时,元素A74的起始地址为 。ASA+141BSA+144CSA+222DSA+2255.数组A810中,每个元素A的长度为3个字节,从首地址SA开场连续存放在存储器内,该数组按列存放时,元素A47的起始地址为 。ASA+141BSA+180CSA+222DSA+2256.稀疏矩阵一般的压缩存储方法有两种,
37、即 。A 二维数组和三维数组B三元组和散列C三元组和十字链表 D散列和十字链表7.假设采用三元组压缩技术存储稀疏矩阵,只要把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算,这种观点 。A正确B错误8.设矩阵A是一个对称矩阵,为了节省存储,将其下三角局部按行序存放在一维数组B1,n(n-1)/2中,对下三角局部中任一元素ai,j(i=j),在一组数组B的下标位置k的值是 。Ai(i-1)/2+j-1Bi(i-1)/2+jCi(i+1)/2+j-1 (D)i(i+1)/2+j二、填空题 1.己知二维数组Amn采用行序为主方式存储,每个元素占k个存储单元,并且第一个元素的存储地址是LOC(A00),那么A00的地址是_。2.二维数组A1020采用列序为主方式存储,每个元素占一个存储单元,并且A00的存储地址是200,那么A612的地址是_。3.有一个10阶对称矩阵A,采用压缩存储方式(以行序为主,且A00=1),那么A85的地址是_。4.设n行n列的下三角矩阵A已压缩到一维数组S1.n*(n+1)/2中,假设按行序为主存储,那么Aij对应的S中的存储位置是_