数据结构校本教材各章习题及答案.docx
- 文档编号:12071812
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:78
- 大小:233.32KB
数据结构校本教材各章习题及答案.docx
《数据结构校本教材各章习题及答案.docx》由会员分享,可在线阅读,更多相关《数据结构校本教材各章习题及答案.docx(78页珍藏版)》请在冰豆网上搜索。
数据结构校本教材各章习题及答案
第一章绪论
1.4总结与提高
1.4.1主要知识点
(1)数据类型、数据结构等基本概念。
(2)几种基本数据结构的逻辑结构及常用的几种存储结构。
(3)算法的概念、算法的表示、算法的时间性能和空间性能评价方法。
练习题目
一、选择题
1.从逻辑上可以把数据结构分为(A)两大类。
A.线性结构、非线性结构B.初等结构、构造型结构
C.顺结构、链式结构D.动态结构、静态结构
2.采用顺序存储结构表示数据时,相邻的数据元素的存储地址(B)。
A.一定不连续B.一定连续
C.不一定连续D.部分连续,部分不连续
3.在发生非法操作时,算法能够做出适当处理的特性称为(A)。
A.健壮性B.可读性C.正确性D.可移植性
4.执行下面程序段的时间复杂度为(C)。
For(inti=0;i For(intj=0;j A.O(m2)B.O(n2)C.O(m*n)D.O(m+n) 5.执行下面程序段时,语句S的执行次数为(D)。 For(inti=0i<=n;i++) For(intj=1;j<=i;j++)S; A.n2B.n2/2C.n(n+1)D.n(n+1)/2 二、判断题 1.算法就是程序。 (×) 2.算法必须有输入,但可以没有输出。 (×) 3.线性结构只能用顺序结构存储,非线性结构只能用非顺序结构存储。 (×) 4.顺序存储结构的特点是对于插入和删除操作的效率非常高。 (×) 5.算法的优劣与所用计算机的性能有关,与描述算法的语言无关。 (×) 三、简答题 1.简述数据结构的含义。 2.简述算法的时间复杂度。 3.简述数据类型的概念。 4.简述算法和程序的区别 5.常见的逻辑结构有哪些? 存储结构有哪些? 各自的特点是什么? 实验题目 1.试着写一算法,自大至小依次输出读入的三个整数X,Y和Z的值。 第二章线性表 2.5总结与提高 2.5.1主要知识点 1、顺序表和链表存储结构的描述方法; 2、顺序表的查找、插入和删除算法; 3、各种链表的查找、插入和删除算法。 2.5.2典型例题 1、链表不具备的特点是(A) A)可随机访问任一结点B)插入删除不需要移动元素 C)不必事先估计存储空间D)所需空间与其长度成正比 顺序表可随机访问任一结点,而链表必须从第1个数据结点出发逐一查找每个结点,答案为A。 2、带头结点的单链表head为空的判定条件是(B) A)head==NULLB)head->next==NULL C)head->next==headD)head! =NULL 在带头结点的单链表head中,head指向头结点,由头结点的next域指向第1个元素结点,head->next==NULL表示该单链表为空,答案为B。 3、若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点,则采用(D)存储方式最节省运算时间。 A)单链表B)给出表头指针的单循环链表 C)双链表D)带头结点的双循环链表 在链表中插入或删除一个结点,需修改相邻结点的指针域。 若不特别指明,则通常只给出链表第i个结点的地址,即头指针。 其他结点的地址只能从它的前驱或后续结点得到。 上述4种答案只有D能从头指针,经过最少的结点,获得最后一个结点的相邻结点的地址,答案为D。 4、需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是(B) A)单链表B)静态链表C)线性链表D)顺序存储结构 由于插入和删除不需要移动元素,所以不能是顺序表,只能是链表,但需要事先分配较大空间,所以为静态链表,答案为B。 5、与单链表相比,双链表的优点之一是(D) A)插入、删除操作更简单B)可以进行随机访问 C)可以省略表头指针或表尾指针D)顺序访问相邻结点更灵活 在双链表中可以访问任一结点的相邻结点,而单链表中只能访问任一结点的下一个结点,答案为D。 6、在一个单链表中的p所指结点之前插入结点s,可执行如下的操作: s->next=①; p->next=s; t=p->data; p->data=②; s->data=③; 采用的方法是在*p之后插入一个结点*s,然后将*p和*s结点的数据域进行交换。 答案为①p->next②s->data③t 练习题目 1、下面是将不带头结点的链表L逆置的程序,请将程序补充完整: voidinvert(Node*L) {Node*p,*q,*r; p=L; q=p->next; while(q! =NULL) {r=q->next; q->next=p; p=q;q=r;} L->next=NULL; L=p; } 2、设线性表中有n个元素,以下算法中,(A)在顺序表上实现比在链表上实现效率更高。 A)输出第i(0≤i≤n-1)个元素B)交换第0个元素与第1个元素的值 C)顺序输出这n个元素的值 D)输出与给定值x相等的元素在线性表中的序号 3、单链表中,增加一个头结点的目的是为了(C)。 A)使单链表至少有一个结点B)标识表结点中首结点的位置 C)方便运算的实现D)说明单链表是线性表的链式存储 4、在一个单链表HL中,若要在指针q所指的结点的后面插入一个由指针p所指的结点,则执行(D)。 A)q->next=p->next;p->next=q; B)p->next=q->next;q=p; C)q->next=p->next;p->next=q; D)p->next=q->next;q->next=p; 5、不带头结点的单链表head为空的判定条件是(A) A)head==NULLB)head->next==NULL C)head->next==headD)head! =NULL 6、设p结点是带表头结点的双循环链表中的结点,则在p结点前插入s结点的语句序列中正确的是(C) A)p->prior=s;p->prior->next=s;s->prior=p->prior;s->next=p B)p->prior->next=s;p->prior=s;s->prior=p->prior;s->next=p C)s->prior=p->prior;p->prior->next;p->prior=s;s->next=p D)p->prior=s;s->next=p;p->prior->next=s;s->prior=p->prior 7、在一个单链表中删除p所指的结点时,应执行以下操作: q=p->next; p->data=p->next->data;或p->data=q->data; p->next=q->next或p->next=p->next->next; free(q); 实验题目 假设有两个集合A和B分别用两个线性表La和Lb表示,即: 线性表中的数据元素即为集合中的成员,现要求一个新的集合A=A∪B,例如A={1,2,3,4},B={1,5,6,4,8,9},则A∪B={1,2,3,4,5,6,8,9}。 其代码如下: #include #include typedefstructstu {intdata; structstu*next;}*Sqlist,Node; Sqlistcreate() {/*创建一个带头结点的链表,数据域为整型,输入为0时创建链表结束*/ Sqlistp,q,head; intn=0; p=(Sqlist)malloc(sizeof(Node)); head=p; head->next=NULL; printf("begincreatelist,inputintegerdata,input0over: "); do {if(n==0)head=p; elseq->next=p; q=p; p=(Sqlist)malloc(sizeof(Node)); scanf("%d",&p->data); n++; }while(p->data! =0); n--; q->next=NULL; free(p); returnhead; } voidprint(Sqlisthead) {/*输出线性表head中的数据元素*/ Sqlistp; p=head->next; do {printf("%d",p->data); p=p->next; }while(p! =NULL); printf("\n"); } intlength(Sqlisthead) {/*求线性表head的长度*/ intcount; Sqlistp; p=head->next; count=0; while(p! =NULL) {count++; p=p->next; } returncount; } intgetelem(Sqlisthead,inti) {/*取线性表head的第i个数据元素赋给e,并返回其值*/ inte; Sqlistp; intj=1; p=head->next; while(p! =NULL&&j { j++; p=p->next; } if(j>=i)e=p->data; elseprintf("cannotfound! "); returne; } intlocateelem(Sqlisthead,inte) {/*查看e是否在线性表head中*/ Sqlistp; intcount=0; p=head; while(p->next! =NULL&&p->data! =e) {p=p->next; count++; } if(p->data==e)returncount; elsereturn0; } voidinsert(Sqlisthead,inte) {/*将e插入到链表head的尾部*/ Sqlistp,q; p=head; while(p->next! =NULL) p=p->next; q=(Sqlist)malloc(sizeof(Node)); q->data=e; q->next=NULL; p->next=q; } voidinverse(Sqlisthead) {/*将链表head逆置*/ Sqlistp,q,r,pp; p=head->next;q=p->next; pp=p; while(q! =NULL) {r=q->next; q->next=p; p=q;q=r; } pp->next=NULL; head->next=p; } voidmerge(SqlistLa,SqlistLb) {/*将所有在线性表Lb中,但不在La中的数据元素插入到La中*/ intla_len,lb_len; inti,e; lb_len=length(Lb); for(i=1;i<=lb_len;i++) {e=getelem(Lb,i); if(! locateelem(La,e))insert(La,e); } } main() {SqlistLa,Lb; intlist; La=create(); /*创建一个带头结点的链表La,数据域为整型,输入为0时创建链表结束*/ printf("La="); print(La); Lb=create(); /*创建一个带头结点的链表Lb,数据域为整型,输入为0时创建链表结束*/ printf("Lb="); print(Lb); printf("input1merge,input2inverse: "); /*输入1求并集,输入2逆置链表*/ pp: scanf("%d",&list); if(list==1) {merge(La,Lb); printf("merge="); print(La); } elseif(list==2) {inverse(La); inverse(Lb); print(La); print(Lb); } else{printf("inputerror,inputagain0or1or2: ");gotopp;} getch(); 第三章栈和队列 3.3总结与提高 3.3.1主要知识点 1.栈和队列这两种抽象数据类型的特点。 2.栈类型的两种实现方法,即两种存储结构表示时的基本操作实现算法,判断栈满和栈空的条件以及它们的描述方法。 3.线性队列和循环队列的基本操作实现算法,判断队满和队空的条件以及它们的描述方法。 4.递归算法执行过程中栈的状态变化过程。 3.3.2典型例题 1.如果输入序列为123456,试问能否通过栈结构得到以下两个序列: 435612和135426,请说明为什么不能或如何才能得到。 输入序列为123456,不能得出435612,其理由是,输出序列最后两元素是12,前面4个元素(4356)得到后,栈中元素剩12,且2在栈顶,不可能栈底元素1在栈顶元素2之前出栈。 得到135426的过程如下: 1入栈并出栈,得到部分输出序列1;然后2和3入栈,3出栈,部分输出序列变为: 13;接着4和5入栈,5,4和2依次出栈,部分输出序列变为13542;最后6入栈并退栈,得最终结果135426。 2.设从键盘输入一整数的序列: a1,a2,a3,…,an,试编写算法实现: 用栈结构存储输入的整数,当ai≠-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。 算法应对异常情况(入栈满等)给出相应的信息。 #definemaxsize//栈空间容量 voidInOutS(ints[maxsize])//s是元素为整数的栈,本算法进行入栈和退栈操作。 { inttop=0;//top为栈顶指针,定义top=0时为栈空。 for(i=1;i<=n;i++)//n个整数序列作处理。 { scanf(“%d”,&x);//从键盘读入整数序列。 if(x! =-1)//读入的整数不等于-1时入栈。 if(top==maxsize-1)printf(“栈满\n”); elses[++top]=x;//x入栈。 else//读入的整数等于-1时退栈。 { if(top==0)printf(“栈空\n”); elseprintf(“出栈元素是%d\n”,s[top--]); } } } 练习题目 一单选题 1.对于栈操作数据的原则是(b)。 A.先进先出B.后进先出C.后进后出D.不分顺序 2.有六个元素6,5,4,3,2,1的顺序进栈,问下列哪一个不是合法的出栈序列? (c) A.543612B.453126C.346521D.234156 3.输入序列为ABC,可以变为CBA时,经过的栈操作为(b)。 A.push,pop,push,pop,push,popB.push,push,push,pop,pop,pop C.push,push,pop,pop,push,popD.push,pop,push,push,pop,pop 4.设计一个判别表达式中左,右括号是否配对出现的算法,采用(d)数据结构最佳。 A.线性表的顺序存储结构B.队列C.线性表的链式存储结构D.栈 5.用链接方式存储的队列,在进行删除运算时(d)。 A.仅修改头指针B.仅修改尾指针 C.头、尾指针都要修改D.头、尾指针可能都要修改 6.假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为(a)。 A.(rear-front+m)%mB.rear-front+1 C.(front-rear+m)%mD.(rear-front)%m 7.若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少? (b) A.1和5B.2和4C.4和2D.5和1 8.栈和队列的共同点是(c)。 A.都是先进先出B.都是先进后出 C.只允许在端点处插入和删除元素D.没有共同点 9.设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应该是(c)。 A.6B.4C.3D.2 10.栈和队列都是(c)。 A.顺序存储的线性结构B.链式存储的非线性结构 C.限制存取点的线性结构D.限制存取点的非线性结构 二、判断题 1.若输入序列为1,2,3,4,5,6,则通过一个栈可以输出序列1,5,4,6,2,3。 (2) 2.队列是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。 (2) 3.队列和栈都是运算受限的线性表,只允许在表的两端进行运算。 (2) 4.栈和队列的存储方式,既可以是顺序方式,又可以是链式方式。 (01) 5.任何一个递归过程都可以转换成非递归过程。 ( 1 ) 三、填空题 1.栈是_______的线性表,其运算遵循_______的原则。 2.在作进栈运算时应先判别栈是否_满_;在作退栈运算时应先判别栈是否空_;当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为_n。 3.用S表示入栈操作,X表示出栈操作,若元素入栈的顺序为1234,为了得到1342出栈顺序,相应的S和X的操作串为_____pdppdpdd__。 4.顺序栈用data[0…n-1]存储数据,栈顶指针是top,则值为x的元素入栈的操作是___data[++top]=x____。 5.队列是限制插入只能在表的一端,而删除在表的另一端进行的线性表,其特点是_先进先出______。 6.已知链队列的头尾指针分别是f和r,则将值x入队的操作序列是__s=(LinkedList)malloc(sizeof(LNode))__s->data=x;s->next=r->next;r->next=s;r=s;___。 7.表达式求值是__栈_____应用的一个典型例子。 8.循环队列的引入,目的是为了克服__假溢出时大量移动数据元素_____。 9.循环队列用数组A[0..m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列的元素个数是______n=(rear-front+m)modm_。 实验题目 1、将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。 当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。 两个栈均从两端向中间增长,当向第0号栈插入一个新元素时,使top[0]增1得到新的栈顶位置,当向第1号栈插入一个新元素时,使top[1]减1得到新的栈顶位置。 当top[0]+1==top[1]时或top[0]=top[1]-1时,栈空间满,此时不能再向任一栈加入新的元素。 试定义这种双栈结构的类型定义,并实现判栈空、判栈满、插入、删除算法。 2、假设以数组Q[m]存放循环队列中的元素,同时设置一个标志tag,以tag==0和tag==1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。 试编写与此结构相应的插入和删除算法。 练习题目答案 一单选题 1 2 3 4 5 6 7 8 9 10 B C B D D A B C C C 二、判断题 1 2 3 4 5 × × × √ √ 三、填空题 1.操作受限(或限定仅在表尾进行插入和删除操作)后进先出 2. (1)满 (2)空(3)n 3.S×SS×S×× 4.data[++top]=x; 5.先进先出 6.s=(LinkedList)malloc(sizeof(LNode));s->data=x;s->next=r->next;r->next=s;r=s; 7.栈 8.假溢出时大量移动数据元素 9.(rear-front+m)%m 第四章串 4.5总结与提高 4.5.1主要知识点 (1)熟悉串的七种基本操作的定义,并能利用这些基本操作来实现串的其它各种操作的方法。 (2)熟练掌握在串的定长顺序存储结构上实现串的各种操作的方法。 (3)了解串的堆存储结构以及在其上实现串操作的基本方法。 (4)理解串匹配的KMP算法,熟悉NEXT函数的定义,学会手工计算给定模式串的next函数值和改进的next函数值。 (5)了解串操作的应用方法和特点。 4.5.2典型例题 1、’abcde’有多少个子串? 解: 自身: 1;空串数: 1 含1个字符的子串数: 5 含2个字符的子串数: 4 含3个字符的子串数: 3 含4个字符的子串数: 2 共有1+1+2+3+4+5=16个子串。 2、设计顺序串上实现串比较运算Strcmp(s,t)的算法。 解: 本例的算法思路如下: (1)比较s和t两个串共同长度范围内的对应字符: ①若s的字符<t的字符,返回1; ②若s的字符>t的字符,返回-1; ③若s的字符=t的字符,按上述规则继续比较。 (2)当 (1)中对应字符均相同时,比较s1和s2的长度: ①两者相等时,返回0; ②s的长度>t的长度,返回1; ③s的长度<t的长度,返回-1。 intStrcmp(SStrings,SStringt){ inti,comlen; if(s.len elsecomlen=t.len; for(i=0;i if(s.data[i] elseif(s.data[i]>t.data[i])return1; if(s.len==t.len)//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 校本 教材 各章 习题 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)