东南大学十套数据结构试题及答案.docx
《东南大学十套数据结构试题及答案.docx》由会员分享,可在线阅读,更多相关《东南大学十套数据结构试题及答案.docx(24页珍藏版)》请在冰豆网上搜索。
东南大学十套数据结构试题及答案
数据结构试卷
(一)
三、计算题(每题6分,共24分)
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};
用克鲁斯卡尔算法得到最小生成树,试写出在最小生成树中依次得到的各条边。
4.画出向小根堆中加入数据4,2,5,8,3时,每加入一个数据后堆的变化。
四、阅读算法(每题7分,共14分)
1.LinkListmynote(LinkListL)
{//L是不带头结点的单链表的头指针
if(L&&L->next){
q=L;L=L—>next;p=L;
S1:
while(p—>next)p=p—>next;
S2:
p—>next=q;q—>next=NULL;
}
returnL;
}
请回答下列问题:
(1)说明语句S1的功能;
(2)说明语句组S2的功能;
(3)设链表表示的线性表为(a1,a2,…,an),写出算法执行后的返回值所表示的线性表。
2.voidABC(BTNode*BT)
{
ifBT{
ABC(BT->left);
ABC(BT->right);
cout<data<<'';
}
}
该算法的功能是:
五、算法填空(共8分)
二叉搜索树的查找一谗归算法:
boolFind(BTreeNode*BST,ElemType&item)
{if(BST==NULL)returnfalse;//查找失败else{if(item==BST->data){item=BST->data;//查找成功return;}
elseif(itemdata)returnFind(,item);
elsereturnFind(,item);
}//if
}
六、编写算法(共8分)统计出单链表HL中结点的值等于给定值X的结点数。
intCountX(LNode*HL,ElemTypex)
数据结构试卷
(二)
三、应用题(36分)
1.设一组初始记录关键字序列为(45,80,48,40,22,78),则分别给出第4趟简单选择排序和第4趟直接插入排序后的结果。
2.设指针变量p指向双向链表中结点A,指针变量q指向被插入结点B,要求给出在结点A
的后面插入结点B的操作序列(设双向链表中结点的两个指针域分别为llink和rlink)。
3.设一组有序的记录关键字序列为(13,18,24,35,47,50,62,83,90),查找方法用
二分查找,要求计算出查找关键字62时的比较次数并计算出查找成功时的平均查找长
度。
4.设一棵树T中边的集合为{(A,B),(A,C),(A,D),(B,E),(C,F),(C,G)},要求用孩子兄弟表示法(二叉链表)表示出该树的存储结构并将该树转化成对应的二叉树。
5.设有无向图G,要求给出用普里姆算法构造最小生成树所走过的边的集合。
6.设有一组初始记录关键字为(45,80,48,40,22,78),要求构造一棵二叉排序树并给
出构造过程。
四、算法设计题(16分)
1.设有一组初始记录关键字序列(K1,K2,…,K0,要求设计一个算法能够在O(n)的时间
复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于K,右半部分的每
个关键字均大于等于K。
2.设有两个集合A和集合B,要求设计生成集合C=AHB的算法,其中集合AB和C用链式存储结构表示。
数据结构试卷(三)
2.填空题
1.下列算法实现在顺序散列表中查找值为x的关键字,请在下划线处填上正确的语句。
structrecord{intkey;intothers;};
inthashsqsearch(structrecordhashtable[],intk)
{
inti,j;j=i=k%p;
while(hashtable[j].key!
=k&&hashtable[j].flag!
=O){j=()%m;if(i==j)return(-1);}
if()return(j);elsereturn(-1);
}
2.下列算法实现在二叉排序树上查找关键值k,请在下划线处填上正确的语句。
typedefstructnode{intkey;structnode*lchild;structnode*rchild;}bitree;
bitree*bstsearch(bitree*t,intk)
{
if(t==0)return(0);elsewhile(t!
=0)
if(t->key==k);elseif(t->key>k)t=t->lchild;else;
}
三、计算题(每题10分,共30分)
1.已知二叉树的前序遍历序列是AEFBGCDHIKJ,中序遍历序列是EFAGBCHKIJD,画出此二叉树,并画出它的后序线索二叉树。
2.已知待散列的线性表为(36,15,40,63,22),散列用的一维地址空间为[0..6],假定选用的散列函数是H(K)=Kmod7,若发生冲突采用线性探查法处理,试:
(1)计算出每一个元素的散列地址并在下图中填写出散列表:
'0123456
(2)求出在查找每一个元素概率相等情况下的平均查找长度。
3.已知序列(10,18,4,3,6,12,1,9,18,8)请用快速排序写出每一趟排序的结果。
四、算法设计题(每题15分,共30分)
1.设计在单链表中删除值相同的多余结点的算法。
2.设计一个求结点x在二叉树中的双亲结点算法。
数据结构试卷(四)
1.设一组初始记录关键字序列为(20,18,22,16,30,19),则以20为中轴的一趟快速
排序结果为。
2.设一组初始记录关键字序列为(20,18,22,16,30,19),则根据这些初始关键字序列
建成的初始堆为。
3.设某无向图G中有n个顶点,用邻接矩阵A作为该图的存储结构,则顶点i和顶点j
互为邻接点的条件是。
4.设无向图对应的邻接矩阵为A,则A中第i上非0元素的个数第i列上非0
元素的个数(填等于,大于或小于)。
5.设前序遍历某二叉树的序列为ABCD,中序遍历该二叉树的序列为BADC,则后序遍历
该二叉树的序列为。
6.设散列函数H(k)=kmodp,解决冲突的方法为链地址法。
要求在下列算法划线处填上正确的语句完成在散列表hashtalbe中查找关键字值等于k的结点,成功时返回指向关键
字的指针,不成功时返回标志0。
typedefstructnode{intkey;structnode*next;}lklist;
voidcreatelkhash(lklist*hashtable[]){
inti,k;lklist*s;
for(i=0;ifor(i=0;i{
s=(lklist*)malloc(sizeof(lklist));s_>key=a[i];k=a[i]%p;s->next=hashtable[k];;
}}
三、计算题(每题10分,共30分)
1、画出广义表LS=((),(e),(a,(b,c,d)))的头尾链表存储结构。
2、下图所示的森林:
(1)求树(a)的先根序列和后根序列;
(2)求森林先序序列和中序序列;
(3)将此森林转换为相应的二叉树;
3、设散列表的地址范围是[0..9],散列函数为H(key)=(key2+2)MOD9,并采用链表处理冲突,请画出元素7、4、5、3、6、2、&9依次插入散列表的存储结构。
四、算法设计题(每题10分,共30分)
1.设单链表中有仅三类字符的数据元素(大写字母、数字和其它字符),要求利用原单链表中结点空间设计出三个单链表的算法,使每个单链表只包含同类字符。
2.设计在链式存储结构上交换二叉树中所有结点左右子树的算法。
3.在链式存储结构上建立一棵二叉排序树。
数据结构试卷(五)
1.下面程序段的功能是实现冒泡排序算法,请在下划线处填上正确的语句。
voidbubble(intr[n])
{
for(i=1;i<=n_1;i++)
{
for(exchange=O,j=O;j<;j++)
if(r[j]>r[j+1]){temp=r[j+1];;r[j]=temp;exchange=1;}
if(exchange==0)return;
}
}
2.下面程序段的功能是实现二分查找算法,请在下划线处填上正确的语句。
structrecord{intkey;intothers;};
intbisearch(structrecordr[],intk)
{
intlow=0,mid,high=n-1;
while(low<=high)
{
if(r[mid].key==k)return(mid+1);elseif()high=mid-1;elselow=mid+1;
}
return(O);
}
三、应用题(32分)
1.设某棵二叉树的中序遍历序列为DBEAC前序遍历序列为ABDEC
要求给出该二叉树的的后序遍历序列。
2.设无向图G(如右图所示),给出该图的最小生成树上边的集合并
计算最小生成树各边上的权值之和。
3.设一组初始记录关键字序列为(15,17,18,22,35,51,60),
要求计算出成功查找时的平均查找长度。
4.设散列表的长度为8,散列函数H(k)=kmod7,初始记录关键字序列为(25,31,8,27,
13,68),要求分别计算出用线性探测法和链地址法作为解决冲突方法的平均查找长度。
四、算法设计题(28分)
1.设计判断两个二叉树是否相同的算法。
2.设计两个有序单链表的合并排序算法。
数据结构试卷(六)
四、算法设计题(20分)
1.设计在顺序有序表中实现二分查找的算法。
2•设计判断二叉树是否为二叉排序树的算法。
3.在链式存储结构上设计直接插入排序算法
数据结构试卷(七)
三、填空题(30分)
1.下面程序段的功能是实现一趟快速排序,请在下划线处填上正确的语句。
structrecord{intkey;datatypeothers;};
voidquickpass(structrecordr[],ints,intt,int&i)
{
intj=t;structrecordx=r[s];i=s;
while(i{
while(ix.key)j=j-1;if(iwhile()i=i+1;if(i}
}
四、算法设计题(20分)
1.设计在链式结构上实现简单选择排序算法。
2.设计在顺序存储结构上实现求子串算法。
3.设计求结点在二叉排序树中层次的算法。
数据结构试卷(八)
三、填空题(30分)
1.设一组初始记录关键字序列为(49,38,65,97,76,13,27,50),则以d=4为增量的一趟希尔排序结束后的结果为。
2.下面程序段的功能是实现在二叉排序树中插入一个新结点,请在下划线处填上正确的内容。
typedefstructnode{intdata;structnode*lchild;structnode*rchild;}bitree;
voidbstinsert(bitree*&t,intk){
if(t==0){;t->data=k;t->lchild=t->rchild=0;}
elseif(t->data>k)bstinsert(t->lchild,k);else;
中的两个指针域分别为llink和rlink)。
5.
设某棵二叉树的中序遍历序列为ABCD后序遍历序列为BADC则其前序遍历序列为
6.完全二叉树中第5层上最少有个结点,最多有个结点。
7.设有向图中不存在有向边,则其对应的邻接矩阵A中的数组元素A[i][j]的值等
于。
8.设一组初始记录关键字序列为(49,38,65,97,76,13,27,50),则第4趟直接选择
排序结束后的结果为。
9.设连通图G中有n个顶点e条边,则对应的最小生成树上有条边。
10.设有一组初始记录关键字序列为(50,16,23,68,94,70,73),则将它们调整成
初始堆只需把16与相互交换即可。
四、算法设计题(20分)
1.设计一个在链式存储结构上统计二叉树中结点个数的算法。
2.设计一个算法将无向图的邻接矩阵转为对应邻接表的算法。
数据结构试卷(九)
五、算法设计题(20分)
1.设计计算二叉树中所有结点值之和的算法。
2.设计将所有奇数移到所有偶数之前的算法。
3.设计判断单链表中元素是否是递增的算法。
数据结构试卷(十)
二、填空题(48分,其中最后两小题各6分)
1.设指针变量p指向单链表中结点A则删除结点A的语句序列为:
q=p->next;p->data=q->data;p->next=;feee(q);
2.数据结构从逻辑上划分为三种基本类型:
、和。
3.设无向图G中有n个顶点e条边,则用邻接矩阵作为图的存储结构进行深度优先或广度
优先遍历时的时间复杂度为;用邻接表作为图的存储结构进行深度优先或广
度优先遍历的时间复杂度为。
4.设散列表的长度为8,散列函数H(k)=k%7,用线性探测法解决冲突,则根据一组初始
关键字序列(8,15,16,22,30,32)构造出的散列表的平均查找长度是。
5.设一组初始关键字序列为(38,65,97,76,13,27,10),则第3趟冒泡排序结束后的
结果为。
6.设一组初始关键字序列为(38,65,97,76,13,27,10),则第3趟简单选择排序后的
结果为。
7.设有向图G中的有向边的集合E={<1,2>,<2,3>,<1,4>,<4,5>,<5,3>,<4,6>,
<6,5>},则该图的一个拓扑序列为。
8.下面程序段的功能是建立二叉树的算法,请在下划线处填上正确的内容。
typedefstructnode{intdata;structnode*lchild;;}bitree;
voidcreatebitree(bitree*&bt)
{
scanf(“%c”,c&h);
if(ch=='#');else
{bt=(bitree*)malloc(sizeof(bitree));bt->data=ch;;createbitree(bt->rchild);}
}
9.下面程序段的功能是利用从尾部插入的方法建立单链表的算法,请在下划线处填上正确
的内容。
typedefstructnode{intdata;structnode*next;}lklist;
voidlklistcreate(*&head)
{
for(i=1;i<=n;i++)
{
p=(lklist*)malloc(sizeof(lklist));scanf(->data“));p%->d”ne,x&t=(p0;
if(i==1)head=q=p;else{q->next=p;;}
}}
三、算法设计题(22分)
1.
设计在链式存储结构上合并排序的算法。
2.
设计在二叉排序树上查找结点
X的算法。
3.
设关键字序列(k1,k2,…,
kn-l)是堆,设计算法将关键字序列(k1,k2,…,kn-1,X)调
整为堆。
、计算题(每题
6分,
共
24分)
1.线性表为:
(78,
50
40,
60,34,90)
0
1
11
0
1
0
10
1
1
1
01
1
1
0
10
1
2.邻接矩阵:
0
1
11
0
邻接表如图
11所;
示:
图11
3.用克鲁斯卡尔算法得到的最小生成树为:
(1,2)3,(4,6)4,(1,3)5,(1,4)8,(2,5)10,(4,7)20
4.见图12
四、读算法(每题7分,共14分)
1.
(1)查询链表的尾结点
(2)将第一个结点链接到链表的尾部,作为新的尾结点
(3)返回的线性表为(a2,a3,…,an,a1)
2.递归地后序遍历链式存储的二叉树。
五、法填空(每空2分,共8分)
trueBST->leftBST->right
六、编写算法(8分)
intCountX(LNode*HL,ElemTypex)
{inti=0;LNode*p=HL;//i为计数器
while(p!
=NULL)
{if(P->data==x)i++;p=p->next;
}//while,出循环时i中的值即为x结点个数returni;
}//CountX
三、应用题
1.(22,40,45,48,80,78),(40,45,48,80,22,78)
2.q->llink=p;q->rlink=p->rlink;p->rlink->llink=q;p->rlink=q;
3.2,ASL=91*1+2*2+3*4+4*2)=25/9
4.树的链式存储结构略,二叉树略
5.E={(1,3),(1,2),(3,5),(5,6),(6,4)}
6.略
四、算法设计题
1.设有一组初始记录关键字序列(Ki,K2,…,K,),要求设计一个算法能够在0(n)的时
间复杂度内将线性表划分成两部分,其中左半部分的每个关键字均小于Ki,右半部分的
每个关键字均大于等于Ki。
voidquickpass(intr[],ints,intt)
{
inti=s,j=t,x=r[s];
while(iwhile(ix)j=j-1;if(iwhile(i}
r[i]=x;
}
2.设有两个集合A和集合B,要求设计生成集合C=AAB的算法,其中集合AB和C用
链式存储结构表示。
typedefstructnode{intdata;structnode*next;}lklist;
voidintersection(lklist*ha,lklist*hb,lklist*&hc)
{
lklist*p,*q,*t;
for(p=ha,hc=0;p!
=0;p=p->next)
{for(q=hb;q!
=0;q=q->next)if(q->data==p->data)break;
if(q!
=0){t=(lklist*)malloc(sizeof(lklist));t->data=p->data;t->next=hc;hc=t;}
}
}
•填空题
13.j+1,hashtable[j].key==k
14.return(t),t=t->rchild
三、计算题
四、算法设计题
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在二叉树中的双亲结点算法。
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");}
二、填空题
1.(19,18,16,20,30,22)
2.(16,18,19,20,32,22)
3.A[i][j]=1
4.等于
5.BDCA
6.hashtable[i]=O,hashtable[k]=s
三、计算题
1.
四、算法设计题
1.设单链表中有仅三类字符的数据元素(大写字母、数字和其它字符),要求利用原单链表
中结点空间设计出三个单链表的算法,使每个单链表只包含同类字符。
typedefchardatatype;
typedefstructnode{dat