数据结构期末考试复习总结.docx
《数据结构期末考试复习总结.docx》由会员分享,可在线阅读,更多相关《数据结构期末考试复习总结.docx(26页珍藏版)》请在冰豆网上搜索。
![数据结构期末考试复习总结.docx](https://file1.bdocx.com/fileroot1/2023-4/19/815bdede-fb68-4f13-8976-925d9d7f91d6/815bdede-fb68-4f13-8976-925d9d7f91d61.gif)
数据结构期末考试复习总结
集团标准化工作小组#Q8QGGQT-GX8G08Q8-GNQGJ8-MHHGN#
数据结构期末考试复习总结
《数据结构》期末考试题型及分值
(1)简答题6题*5分=30分简要回答要点
(2)分析题6题*5分=30分给出结果
(3)设计题1题*10分=10分设计思想及结果
(4)编程题1题*10分=10分完整代码
(5)综合题1题*20分=20分抽象数据类型的定义、表示、实现、算法分析{定义=功能(ADT)表示=存储结构体实现=算法(基本操作)算法分析=时间、空间复杂度}
考试概念有:
1.数据结构{一、线性表(栈-队-列-串-数组-广义表-逻辑结构-存储结构-运算结构)
二、非线性表(集合-树-图)}
2.抽象数据类型数据对象-数据关系-基本操作
3.算法性质-要求(设计)-效率(度量)
4.实例查找:
高效查找算法
排序:
高效的排序算法
分析题考试题目参考
(1)顺序建BBST
(2)6-5-4-3-2-1顺序建BBST
简答题实例
设计题:
(1)
(2)
数据结构试卷
(一)
三、计算题(每题6分,共24分)
1.在如下数组A中链接存储了一个线性表,表头指针为A[0].next,试写出该线性表。
A01234567
data
60
50
78
90
34
40
next
3
5
7
2
0
4
1
线性表为:
(78,50,40,60,34,90)
2.请画出下图的邻接矩阵和邻接表。
3.已知一个图的顶点集V和边集E分别为:
V={1,2,3,4,5,6,7};
E={(1,2)3,(1,3)5,(1,4)8,(2,5)10,(2,3)6,(3,4)15,
(3,5)12,(3,6)9,(4,6)4,(4,7)20,(5,6)18,(6,7)25};
用克鲁斯卡尔算法得到最小生成树,试写出在最小生成树中依次得到的各条边。
用克鲁斯卡尔算法得到的最小生成树为:
(1,2)3,(4,6)4,(1,3)5,(1,4)8,(2,5)10,(4,7)20
4.画出向小根堆中加入数据4,2,5,8,3时,每加入一个数据后堆的变化。
见图12
图12
图11
四、阅读算法(每题7分,共14分)
1.LinkListmynote(LinkListL)
{
知二叉树的前序遍历序列是AEFBGCDHIKJ,中序遍历序列是EFAGBCHKIJD,画出此二叉树,并画出它的后序线索二叉树。
2.已知待散列的线性表为(36,15,40,63,22),散列用的一维地址空间为[0..6],假定选用的散列函数是H(K)=Kmod7,若发生冲突采用线性探查法处理,试:
H(36)=36mod7=1;H1(22)=(1+1)mod7=2;….冲突
H(15)=15mod7=1;….冲突H2(22)=(2+1)mod7=3;
H1(15)=(1+1)mod7=2;
H(40)=40mod7=5;
H(63)=63mod7=0;
H(22)=22mod7=1;….冲突
(1)计算出每一个元素的散列地址并在下图中填写出散列表:
`0123456
63
36
15
22
40
(2)求出在查找每一个元素概率相等情况下的平均查找长度。
ASL=
3.已知序列(10,18,4,3,6,12,1,9,18,8)请用快速排序写出每一趟排序的结果。
(8,9,4,3,6,1),10,(12,18,18)
(1,6,4,3),8,(9),10,12,(18,18)
1,(3,4,6),8,9,10,12,18,(18)
1,3,(4,6),8,9,10,12,18,18
1,3,4,6,8,9,10,12,18,18
四、算法设计题(每题15分,共30分)
1.设计在单链表中删除值相同的多余结点的算法。
设计在单链表中删除值相同的多余结点的算法。
typedefintdatatype;
typedefstructnode{datatypedata;structnode*next;}lklist;
voiddelredundant(lklist*&head)
{
lklist*p,*q,*s;
for(p=head;p!
=0;p=p->next)
{
for(q=p->next,s=q;q!
=0;)
if(q->data==p->data){s->next=q->next;free(q);q=s->next;}
else{s=q,q=q->next;}
}
}
2.设计一个求结点x在二叉树中的双亲结点算法。
设计一个求结点x在二叉树中的双亲结点算法。
typedefstructnode{datatypedata;structnode*lchild,*rchild;}bitree;
bitree*q[20];intr=0,f=0,flag=0;
voidpreorder(bitree*bt,charx)
{
if(bt!
=0&&flag==0)
if(bt->data==x){flag=1;return;}
else{r=(r+1)%20;q[r]=bt;preorder(bt->lchild,x);preorder(bt->rchild,x);}
}
voidparent(bitree*bt,charx)
{
inti;
preorder(bt,x);
for(i=f+1;i<=r;i++)if(q[i]->lchild->data==x||q[i]->rchild->data)break;
if(flag==0)printf("notfoundx\n");
elseif(i<=r)printf("%c",bt->data);elseprintf("notparent");
}
数据结构试卷(四)
三、计算题(每题10分,共30分)
1、画出广义表LS=((),(e),(a,(b,c,d)))的头尾链表存储结构。
2、下图所示的森林:
(1)求树(a)的先根序列和后根序列;
(1)ABCDEF;BDEFCA;
(2)ABCDEFGHIJK;BDEFCAIJKHG林转换为相应的二叉树;
(2)求森林先序序列和中序序列;
ABCDEF;BDEFCA;
(3)将此森林转换为相应的二叉树;
(2)ABCDEFGHIJK;BDEFCAIJKHG林转换为相应的二叉树;
3、设散列表的地址范围是[0..9],散列函数为H(key)=(key2+2)MOD9,并采用链表处理冲突,请画出元素7、4、5、3、6、2、8、9依次插入散列表的存储结构。
H(4)=H(5)=0,H(3)=H(6)=H(9)=2,H(8)=3,H
(2)=H(7)=6
四、算法设计题(每题10分,共30分)
1.设单链表中有仅三类字符的数据元素(大写字母、数字和其它字符),要求利用原单链表中结点空间设计出三个单链表的算法,使每个单链表只包含同类字符。
设单链表中有仅三类字符的数据元素(大写字母、数字和其它字符),要求利用原单链表中结点空间设计出三个单链表的算法,使每个单链表只包含同类字符。
typedefchardatatype;
typedefstructnode{datatypedata;structnode*next;}lklist;
voidsplit(lklist*head,lklist*&ha,lklist*&hb,lklist*&hc)
{
lklist*p;ha=0,hb=0,hc=0;
for(p=head;p!
=0;p=head)
{
head=p->next;p->next=0;
if(p->data>='A'&&p->data<='Z'){p->next=ha;ha=p;}
elseif(p->data>='0'&&p->data<='9'){p->next=hb;hb=p;}else{p->next=hc;hc=p;}
}
}
2.设计在链式存储结构上交换二叉树中所有结点左右子树的算法。
设计在链式存储结构上交换二叉树中所有结点左右子树的算法。
typedefstructnode{intdata;structnode*lchild,*rchild;}bitree;
voidswapbitree(bitree*bt)
{
bitree*p;
if(bt==0)return;
swapbitree(bt->lchild);swapbitree(bt->rchild);
p=bt->lchild;bt->lchild=bt->rchild;bt->rchild=p;
}
3.在链式存储结构上建立一棵二叉排序树。
在链式存储结构上建立一棵二叉排序树。
#definen10
typedefstructnode{intkey;structnode*lchild,*rchild;}bitree;
voidbstinsert(bitree*&bt,intkey)
{
if(bt==0){bt=(bitree*)malloc(sizeof(bitree));bt->key=key;bt->lchild=bt->rchild=0;}
elseif(bt->key>key)bstinsert(bt->lchild,key);elsebstinsert(bt->rchild,key);
}
voidcreatebsttree(bitree*&bt)
{
inti;
for(i=1;i<=n;i++)bstinsert(bt,random(100));
}
数据结构试卷(五)
三、应用题(32分)
1.
设某棵二叉树的中序遍历序列为DBEAC,前序遍历序列为ABDEC,要求给出该二叉树的的后序遍历序列。
DEBCA
2.设无向图G(如右图所示),给出该图的最小生成树上边的集合并计算最小生成树各边上的权值之和。
E={(1,5),(5,2),(5,3),(3,4)},W=10
3.设一组初始记录关键字序列为(15,17,18,22,35,51,60),要求计算出成功查找时的平均查找长度。
ASL=(1*1+2*2+3*4)/7=17/7
4.设散列表的长度为8,散列函数H(k)=kmod7,初始记录关键字序列为(25,31,8,27,13,68),要求分别计算出用线性探测法和链地址法作为解决冲突方法的平均查找长度。
ASL1=7/6,ASL2=4/3
四、算法设计题(28分)
1.设计判断两个二叉树是否相同的算法。
设计判断两个二叉树是否相同的算法。
typedefstructnode{datatypedata;structnode*lchild,*rchild;}bitree;
intjudgebitree(bitree*bt1,bitree*bt2)
{
if(bt1==0&&bt2==0)return
(1);
elseif(bt1==0||bt2==0||bt1->data!
=bt2->data)return(0);
elsereturn(judgebitree(bt1->lchild,bt2->lchild)*judgebitree(bt1->rchild,bt2->rchild));
}
2.设计两个有序单链表的合并排序算法。
设计两个有序单链表的合并排序算法。
voidmergelklist(lklist*ha,lklist*hb,lklist*&hc)
{
lklist*s=hc=0;
while(ha!
=0&&hb!
=0)
if(ha->datadata){if(s==0)hc=s=ha;else{s->next=ha;s=ha;};ha=ha->next;}
else{if(s==0)hc=s=hb;else{s->next=hb;s=hb;};hb=hb->next;}
if(ha==0)s->next=hb;elses->next=ha;
}
数据结构试卷(六)
四、算法设计题(20分)
1.设计在顺序有序表中实现二分查找的算法。
设计在顺序有序表中实现二分查找的算法。
structrecord{intkey;intothers;};
intbisearch(structrecordr[],intk)
{
intlow=0,mid,high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(r[mid].key==k)return(mid+1);elseif(r[mid].key>k)high=mid-1;elselow=mid+1;
}
return(0);
}
2.设计判断二叉树是否为二叉排序树的算法。
设计判断二叉树是否为二叉排序树的算法。
intminnum=-32768,flag=1;
typedefstructnode{intkey;structnode*lchild,*rchild;}bitree;
voidinorder(bitree*bt)
{
if(bt!
=0){inorder(bt->lchild);if(minnum>bt->key)flag=0;minnum=bt->key;inorder(bt->rchild);}
}
3.在链式存储结构上设计直接插入排序算法
在链式存储结构上设计直接插入排序算法
voidstraightinsertsort(lklist*&head)
{
lklist*s,*p,*q;intt;
if(head==0||head->next==0)return;
elsefor(q=head,p=head->next;p!
=0;p=q->next)
{
for(s=head;s!
=q->next;s=s->next)if(s->data>p->data)break;
if(s==q->next)q=p;
else{q->next=p->next;p->next=s->next;s->next=p;t=p->data;p->data=s->data;s->data=t;}
}
}
数据结构试卷(七)
四、算法设计题(20分)
1.设计在链式结构上实现简单选择排序算法。
设计在链式结构上实现简单选择排序算法。
voidsimpleselectsorlklist(lklist*&head)
{
lklist*p,*q,*s;intmin,t;
if(head==0||head->next==0)return;
for(q=head;q!
=0;q=q->next)
{
min=q->data;s=q;
for(p=q->next;p!
=0;p=p->next)if(min>p->data){min=p->data;s=p;}
if(s!
=q){t=s->data;s->data=q->data;q->data=t;}
}
}
2.设计在顺序存储结构上实现求子串算法。
设计在顺序存储结构上实现求子串算法。
voidsubstring(chars[],longstart,longcount,chart[])
{
longi,j,length=strlen(s);
if(start<1||start>length)printf("Thecopypositioniswrong");
elseif(start+count-1>length)printf("Toocharacterstobecopied");
else{for(i=start-1,j=0;i}
3.设计求结点在二叉排序树中层次的算法。
设计求结点在二叉排序树中层次的算法。
intlev=0;
typedefstructnode{intkey;structnode*lchild,*rchild;}bitree;
voidlevel(bitree*bt,intx)
{
if(bt!
=0)
{lev++;if(bt->key==x)return;elseif(bt->key>x)level(bt->lchild,x);elselevel(bt->rchild,x);}
}
数据结构试卷(八)
四、算法设计题(20分)
1.设计一个在链式存储结构上统计二叉树中结点个数的算法。
设计一个在链式存储结构上统计二叉树中结点个数的算法。
voidcountnode(bitree*bt,int&count)
{
if(bt!
=0)
{count++;countnode(bt->lchild,count);countnode(bt->rchild,count);}
}
2.设计一个算法将无向图的邻接矩阵转为对应邻接表的算法。
设计一个算法将无向图的邻接矩阵转为对应邻接表的算法。
typedefstruct{intvertex[m];intedge[m][m];}gadjmatrix;
typedefstructnode1{intinfo;intadjvertex;structnode1*nextarc;}glinklistnode;
typedefstructnode2{intvertexinfo;glinklistnode*firstarc;}glinkheadnode;
voidadjmatrixtoadjlist(gadjmatrixg1[],glinkheadnodeg2[])
{
inti,j;glinklistnode*p;
for(i=0;i<=n-1;i++)g2[i].firstarc=0;
for(i=0;i<=n-1;i++)for(j=0;j<=n-1;j++)
if[i][j]==1)
{
p=(glinklistnode*)malloc(sizeof(glinklistnode));p->adjvertex=j;
p->nextarc=g[i].firstarc;g[i].firstarc=p;
p=(glinklistnode*)malloc(sizeof(glinklistnode));p->adjvertex=i;
p->nextarc=g[j].firstarc;g[j].firstarc=p;
}
}
数据结构试卷(九)
五、算法设计题(20分)
1.设计计算二叉树中所有结点值之和的算法。
设计计算二叉树中所有结点值之和的算法。
voidsum(bitree*bt,int&s)
{
if(bt!
=0){s=s+bt->data;sum(bt->lchild,s);sum(bt->rchild,s);}
}
2.设计将所有奇数移到所有偶数之前的算法。
设计将所有奇数移到所有偶数之前的算法。
voidquickpass(intr[],ints,intt)
{
inti=s,j=t,x=r[s];
while(i{
while(iwhile(i}
r[i]=x;
}
3.设计判断单链表中元素是否是递增的算法。
设计判断单链表中元素是否是递增的算法。
intisriselk(lklist*head)
{
if(head==0||head->next==0)return
(1);else
for(q=head,p=head->next;p!
=0;q=p,p=p->next)if(q->data>p->data)return(0);
return
(1);
}
数据结构试卷(十)
三、算法设计题(22分)
1.设计在链式存储结构上合并排序的算法。
设计在链式存储结构上合并排序的算法。
voidmergelklist(lklist*ha,lklist*hb,lklist*&hc)
{
lklist*s=hc=0;
while(ha!
=0&&hb!
=0)
if(ha->datadata){if(s==0)hc=s=ha;else{s->next=ha;s=ha;};ha=ha->next;}
else{if(s==0)hc=s=hb;else{s->next=hb;s=hb;};hb=hb->next;}
if(ha==0)s->next=hb;elses->next=ha;
}
2.设计在二叉排序树上查找结点X的算法。
设计在二叉排序树上查找结点X的算法。
bitree*bstsearch1(bitree*t,intkey)
{
bitree*p=t;
while(p!
=0)if(p->key==key)return(p);elseif(p->key>key)p=p->lchild;elsep=p->rchild;
return(0);
}
3.设关键字序列(k1,k2,…,kn-1)是堆,设计算法将关键字序列(k1,k2,…,kn-1,x)调整为堆。
设关键字序列(k1,k2,…,kn-1)是堆,设计算法将关键字序列(k1,k2,…,kn-1,x)调整为堆。
voidadjustheap(intr[],intn)
{
intj=n,i=j/2,temp=r[j-1];
while(i>=1)if(temp>=r[i-1])break;else{r[j-1]=r[i-1];j=i;i=i/2;}
r[j-1]=temp;
}
数据结构试卷
(一)参考答案
三、计算题(每题6分,共24分)
1.线性表为:
(78,50,40,60,34,90)
2.邻接矩阵:
邻接表如图11所示:
图11
3.用克鲁斯卡尔算法得到的最小生成树为:
(1,2)3,(4,6)4,(1,3)5,(1,4)8,(2,5)10,(4,7)20
4.见图12
图12
四、读算法(