数据结构习题最终13年.docx
- 文档编号:28984523
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:30
- 大小:110.31KB
数据结构习题最终13年.docx
《数据结构习题最终13年.docx》由会员分享,可在线阅读,更多相关《数据结构习题最终13年.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构习题最终13年
《数据结构》作业习题
班级:
学号:
姓名:
习题一绪论
1、数据结构主要研究的三个内容为、以及定义在该结构上的。
2、数据结构从逻辑结构上可分为线性结构与非线性结构,其中树、图属于。
3、数据结构被形式地定义为(D,R),其中D是的有限集,R是D上的有限集。
4、程序作用是利用swap函数,实现main函数中变量a与b的值的交换。
填写空缺使代码完整。
voidswap()
{inttemp;
;
;
;
}
intmain()
{inta=7,b=11;
printf("a=%d,b=%d\n",a,b);
swap();
printf("a=%d,b=%d\n",a,b);
}
5、函数triangleArea的作用是:
根据三角形的三条边a、b、c,求三角形的面积。
求三角形面积的公式为
,其中s=(a+b+c)/2。
要求函数返回值类型定义为状态类型(Status类型),当给定的三条边不能构成三角形时,函数返回ERROR;否则函数返回OK,并利用引用类型参数返回三角形的面积。
填写空缺使代码完整。
triangleArea(doublea,doubleb,doublec,area)
{doubles;
if(a+b<=c||a+c<=b||b+c<=a)return;
else
{s=(a+b+c)/2;
=sqrt(s*(s-a)*(s-b)*(s-c));
return;
}
6、设有定义如下:
typedefstructstuInfo{
intnum;
charname[20];
charsex;
structstuInfo*next;
}stuType;
(1)利用指针变量stus,实现一个能容纳40个stuType类型元素动态数组。
实现该功能正确的代码为:
stuType*stus;
stus=()malloc();
(2)从内存中分配两个stuType类型的结点空间,其指针分别为p、q。
按注释给出相应功能的正确代码:
stuType*p,*q;
p=()malloc();//分配p结点
q=()malloc();//分配q结点
;//p结点的next指针指向q结点
;//q结点的next指针指向空
;//利用p给p结点的学号赋为1
;//利用p给q结点的学号赋为2
;//释放p结点空间
7、给出以下给定的两个程序段中划波浪线的语句的执行频度(次数)与时间复杂度。
(1)sum=0;
for(i=0;i for(j=0;j 执行频度: f(n)= 时间复杂度: T(n)=O() (2)sum=0; for(i=0;i for(j=0;j<=i;j++)sum+=a[i][j]; 执行频度: 时间复杂度: (3)sum=0; for(i=0;i for(j=0;j 执行频度: 时间复杂度: 8、分析以下各程序段的时间复杂度为(用大O记号表示) (1)i=s=0; while(s {i++; s+=i; } T(n)= (2)i=1; while(i<=n) i=i*3; T(n)= 习题二线性表 1、n(n>=0)个元素的线性结构表示成(a1,a2,……an),a1称为______元素,an称为______元素,i称为ai在线性表中的____________。 对任意一对相邻结点ai、ai+1(1<=i 2、在表长为n的顺序表的第i个位置插入一元素(1<=i<=n+1,插入的新元素作为第i个元素),则涉及到的元素的移动次数为;若删除第i(1<=i<=n)个元素,则涉及到的元素的移动次数为。 3、线性表的顺序存储结构(顺序表)其存储空间。 A)必须是连续的B)部分是连续的C)一定是不连续的D)连续不连续都可以 4、一个顺序表的第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是。 A)110B)108C)100D)120 5、顺序表的存取特点为,单链表的存取特点为。 6、对于顺序表的优缺点,以下说法错误的是() A)无需为表示结点间的逻辑关系而增加额外的存储空间; B)可以方便地随机存取表中的任一结点; C)插人和删除运算较方便; D)容易造成一部分空间长期闲置而得不到充分利用; 7、以下说法正确的是() A)线性结构的基本特征是: 每个结点有且仅有一个直接前趋和一个直接后继。 B)线性表的各种基本运算在顺序存储结构上的实现均比在链式存储结构上的实现效率要低。 C)在顺序表中,插入和删除元素时,移动元素的个数与插入或删除位置有关。 D)顺序存储的线性表的插人和删除操作不需要付出很大的代价,因为平均每次操只有近一半的元素需要移动。 8、以下说法正确的是() A)顺序存储方式的优点是存储密度大、且插入、删除运算效率高 B)链表的每个结点中都恰好包含一个指针 C)线性表的顺序存储结构优于链式存储结构 D)顺序存储结构属于静态结构,链式结构属于动态结构 9、若某线性表中最常用的操作是取第i个元素和找第i个元素的前趋元素,则采用()存储方式最节省时间。 A)顺序表B)单链表C)双链表D)单循环链表 10、单链表中,增加头结点的目的是为了() A)使单链表至少有一个结点。 B)标示表结点中首结点的位置。 C)使每个元素都能有前驱结点,从而方便运算的实现。 D)说明单链表是线性表的链式存储实现。 11、对于一单链表L(L为头指针,且结点的后继指针分量为next),其p结点(p为链表中某结点的指针)既不是第一个结点,也不是最后一个结点。 (1)在p结点后插入s结点(s为某结点的指针)的语句序列是: (2)删除p结点的直接后继结点的语句序列是: q=p->next;;free(q); (3)若L为带头结点的单链表,则: a)在表首插入s结点的语句序列是: b)单链表为空的判定条件为: (4)若L为不带头结点的单链表,则: a)在表首插入s结点的语句序列是: b)单链表为空的判定条件为: 12、已知L是带表头结点的双向链表(L为头指针,结点的后继指针分量为next,前驱指针为pre),其p结点(p为链表中某结点的指针)既不是首元结点,也不是尾元结点。 a)在p结点后插入s结点(s为某结点的指针)的语句序列是: s->next=p->next;s->pre=;=s;p->next=s; b)在p结点前插入s结点(s为某结点的指针)的语句序列是: s->pre=p->pre;s->next=;=s;p->pre=s; c)删除p结点的直接后继结点的语句序列是: q=p->next;p->next=;=p;free(q); d)删除p结点的直接前驱结点的语句序列是: q=p>pre;;=p;free(q); e)删除p结点语句序列: =p->next;p->next->pre=;free(p); f)在表首插入s结点的语句序列是: s->next=L->next;=L;;L->next=s; 13、设带头结点的单链表类型定义如下: typedefstructLNode {LElemtypedata;//LElemtype为数据元素类型 structLnode*next;//后继结点的指针 }*LinkList; (1)函数InverseList(L)的作用是将一带头结点的单链表实现就地逆置的算法(即利用原来链表的空间,将单链表中的结点按相反的顺序存储)。 填写空缺使算法完整。 voidInverseList(LinkList&L){ LinkListp; p=L->next; L->next=NULL; while(p){ q=p->next; ; ; p=q; } } (2)MergeList(La,Lb)函数的作用是将两个递增有序的带头结点的单链表La,Lb,利用原来的结点空间,合并成一个递增有序的链表La。 填写空缺位置,使此该算法完整。 voidMergeList(LinkList&La,LinkList&Lb) {LinkListpa,pb,s; pa=La->next;pb=Lb->next;s=La; while(){ if(pa->data<=pb->data){ s->next=pa;s=pa; pa=pa->next; } else{ s->next=pb;s=pb; ; } } if(pa)s->next=pa; elses->next=; free(Lb); } (3)函数Search(L,i)用来返回带头结点的单链表L的第i个元素的位置指针。 填写空缺位置,使此该算法完整。 LinkListSearch(LinkListL,inti){ LinkListp; intj; p=L; j=; while(){ p=p->next;j++; } if()returnp; elsereturnNULL; } (4)函数ListLength(L)用来求一带头结点的单链表L的长度。 请写出此函数的完整代码。 习题三栈与队列 1、栈与队列是二种特殊的线性表,栈其亦称为;队列亦称为。 2、现有一个空栈,现有4个元素其入栈顺序为a、b、c、d,则不可能得到了出栈顺序为()。 A)a,b,c,dB)d,c,b,aC)c,a,b,dD)a,c,b,d 3、栈与队列的共同点是。 A)都是先进后出B)都是先进先出 C)只允许在端点处插入和删除元素D)没有共同点 4、设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出线的顺序是s2,s3,s4,s6,s5,s1,则栈的容量至少应该是() A)2B)3C)5D)6 5、一个队列的入列序是a1,a2,a3,a4,则队列的输出系列是() A)a4,a3,a2,a1B)a1,a2,a3,a4,C)a1,a4,a3,a2D)a3,a2,a4,a1 6、向一个栈顶指针为S(S指向栈顶元素)的链式栈中插入一个p所指结点时,其操作步骤为() A)S->next=pB)p->next=S->next;S->next=p C)p->next=S;S=pD)p->next=S;S=S->next 7、现用一数组base和栈顶位置指针Top表示一顺序栈,其定义如下 SElemTypebase[MAX];//MAX为一预定义常量,数组base的首端为栈底, inttop;//top指示栈顶位置,其值为下标值 }SqStack; (1)若top指示的位置为当前栈顶元素的位置,则栈空的判定条件为: ;将元素e入栈的操作语句(或语句组)为: ;将栈顶元素出栈并将其值赋给元素e的操作语句为(或语句组): 。 (2)若top指示的位置为当前栈顶元素的下一位置(即入栈位置),则栈空的判定条件为: ;将元素e入栈的操作语句为(或语句组): ;将栈顶元素出栈并将其值赋给元素e的操作语句(或语句组)为: 。 8、以下算法是以顺序存储结构实现一个双向栈(即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点,如下图所示)。 以下给出了此双向栈类型的定义及初始化、入栈与出栈的操作算法。 填写空白位置,使此算法完整。 0 1 2 …… i ………… Max-j-1 …… Max-2 Max-1 a0 a1 a2 …… ai ………… bj …… b1 b0 Top0 #defineMax200 typedefstruct {SElemTypeElem[Max];//SElemType为栈内数据元素的类型 intTop0,Top1;//定义两个栈顶位置指针,分别存储两个栈的当前栈顶元素的下标 }DStack; voidinistack(DStack&S)//双向栈S的初始化操作 {S.Top0=-1; S.Top1=; } Statuspush(DStack&S,inti,SElemTypee) /*将e入栈;其中i为0或1,i为0表示对设在低下标处的栈进行操作,i为1,表示对设在高下标处的栈进行操作*/ {if()//若栈满 return(OVERFLOW); elseif(i==0)S.Elem[++S.Top0]=e; else; retrunOK; } Statuspop(DStack&S,inti,SElemType&e) /*出栈操作,其中i为0或1,i为0表示对设在低下标处的栈进行操作,i为1,表示对设在高下标处的栈进行操作,并通过参数e返回出栈元素的值*/ {if(i==0) {if(S.Top0==-1)return0; else {e=S.Elem[S.Top0--]; return1; } } else {if()return0; else {e=; return1; } } } 13、以下是有关循环队列的类型定义及其有关操作,填写上相应的空白位置。 #defineMAX100 typedefstruct {QElemTypebase[MAX];//QElemType为队列元素的数据类型 intfront;//头指针,若队列不空,指向队列头元素 intrear;//尾指针,若队列不空,指向队列尾元素的下一个位置 }SqQueue;//说明: 少用一个元素空间,以区别队列判空和判满条件 StatusInitQueue(SqQueue&Q)//初始化操作 {Q.front=Q.rear=; returnOK; } StatusEnQueue(SqQueue&Q,QElemTypee)//入队操作 {if()returnERROR;//若队列满,返回出错 Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAX; retrunOK; } StatusDeQueue(SqQueue&Q,QElemType&e)//出队操作 {if()returnERROR;//若队列空,则返回出错 e=Q.base[Q.front]; Q.front=; retrunOK; } 14、若用如下图所示一带头结点的单链表来表示队列。 以下给出了此队列的类型描述、初始化操作、入队操作和出队操作,在空白处填写上正确答案。 (1)一般的队列形式 (2)空队列形式 structqnode//结点类型描述 {QElemTypedata;//QElemType为元素的数据类型 structqnode*next; }; typedefstruct//链队类型描述 {structqnode*front; structqnode*rear; }LinkQueue; StatusInitQueue(LinkQueue&Q)//初始化建立空队列 {Q.front=Q.rear=(LinkQueue)malloc(sizeof(structqnode)); if(! Q.front)returnOVERFLOW; ; returnOK; } StatusEnQueue(LinkQueue&Q,QElemTypee)//入队操作 {structqnode*p; p=(LinkQueue)malloc(sizeof(structqnode*)); if(! p)returnOVERFLOW; p->data=e;p->next=NULL; ; ; returnOK; } StatusDeQueue(LinkQueue&Q,QElemType&e)//出队操作 {structqnode*p; if()returnFALSE;//空队时 p=Q.front->next; Q.front->next=p->next; if(p==Q.rear); e=p->data; free(p); returnOK; } 15、用下图所示一带头结点的循环单链表表示队列,并且只设一个指针Q指向队尾结点(注意不设头指针)。 以下给出了此队列的类型描述及初始化、入队和出队操作算法,在空白处填写上正确答案。 (1)一般的队列形式 (2)空队列形式 typedefstructLnode {QElemTypedata;//QElemType为元素的数据类型 structqnode*next; }*CLinkQueue; StatusInitQueue(CLinkQueue&Q)//初始化建立空队列Q, {Q=(CLinkQueue)malloc(sizeof(structLnode)); if(! Q)returnOVERFLOW; Q->next=; returnOK; } StatusEnQueue(CLinkQueue&Q,QElemTypee) {structqnode*p; p=(CLinkQueue)malloc(sizeof(structLnode*)); if(! p)returnOVERFLOW; p->data=e; p->next=Q->next; Q->next=p; ; returnOK; } StatusDeQueue(CLinkQueue&Q,QElemType&e)//出队操作 {structqnode*p; if()returnFALSE;//空队时 p=Q->next->next; Q->next->next=p->next; if(p==Q); e=p->data;l free(p); returnOK; } 习题四树与二叉树 1、在一棵含有n个结点的二叉树中,其分支数(边数)为: ;若此二叉树只有度为2的分支结点,和度为0的叶子结点,则该树中叶子结点的数目为;若此二叉树的深度(根所在数为1,深度为树的最大层数)为d,且此树为满二叉树,则此树的结点数n为。 2、对于一棵有n个结点的完全二叉树,其深度为(根所在数为1,深度为树的最大层数);若对其结点按层进行编号(根结点为1,每层从左到右),则对于一编号为i(1 ,其左孩子结点编号为: ,右孩子结点的编号为。 3、在一棵二叉树中,叶子结点数为22,度为1的结点数为13,则该二叉树的结点总数为。 4、具有n个结点的二叉树,其深度最大为,最小为。 5、深度为k的二叉树至少有个结点,至多有个结点;深度k的完全二叉树,最少有个结点,最多有个结点。 6、一棵完全二叉树按层遍历得到结点序列为ABCDEFGH,则结点H的双亲为,结点C的左孩子为。 7、某二叉树的先序序列和后序序列正好相反,则该二叉树一定是的二叉树。 A)空或只有一个结点B)高度等于其结点数 C)任一结点无左孩子D)任一结点无右孩子 8、一棵完全二叉树按层次遍历的序列为ABCDEFGHI,则在先序遍历序列中结点E的直接前驱为,后序遍历中节点B的直接后继为。 9、某二叉树的中序序列为ABCDEFG,后序序列为BDCAFGE,则该二叉树的先序序列为,该二叉树对应的森林中包括棵树。 10、一棵二叉树的节点数据采用顺序存储结构,存储于数组T中(如下图所示,“^”表示空),则该二叉树的后序序列为。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 E A F ^ D ^ G ^ ^ C J ^ ^ I H ^ ^ ^ ^ ^ B 11、下列叙述正确的是() A)二叉树是度为2的有序树 B)二叉树中结点只有一个孩子时无左右之分 C)二叉树中必有度为2的节点 D)二叉树中每一个结点最多只有两棵子树,并且有左右之分 12、深度为k的完全二叉树所含叶结点的个数最多为( ) A)2k B)2k-1 C)k D)2k 13、根据二叉树的定义,具有3个结点的二叉树共有( )种 A)3 B)4 C)5 D)6 14、深度为5的二叉树至多有( )结点 A)16 B)32 C)31D)10 15、由n个权值构成的哈夫曼树共有个节点。 16、若一棵二叉树的先序(根)遍历序列和中序(根)遍历序列分别是ABDGLHEICFJK和GLDHBEIACJFK。 (1)请画出此二叉树; (2)给出此二叉树的后序(根)遍历序列和层次遍历序列。 后序序列: 层次序列: (3)画出此二叉树所对应的森林。 17、一棵二叉树的先序、中序和后序序列如下,其中一部分未标出,请将补充空缺位置给出完整遍历序列。 先序序列: CDEGHIK 中序序列: CBFAJKIG 后序序列: EFDBJIHA 18
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 习题 最终 13