江苏省数据结构分析加强Word文件下载.docx
《江苏省数据结构分析加强Word文件下载.docx》由会员分享,可在线阅读,更多相关《江苏省数据结构分析加强Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
![江苏省数据结构分析加强Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/1/c973ecac-f1a9-47b8-8a8b-9d9426351be7/c973ecac-f1a9-47b8-8a8b-9d9426351be71.gif)
//层数大于k后退出运行
}//while}//结束LeafKLevel
2、数组A和B的元素分别有序,欲将两数组合并到C数组,使C仍有序,应将A和B拷贝到C,只要注意A和B数组指针的使用,以及正确处理一数组读完数据后将另一数组余下元素复制到C中即可。
voidunion(intA[],B[],C[],m,n)
//整型数组A和B各有m和n个元素,前者递增有序,后者递减有序,本算法将A和B归并为递增有序的数组C。
{i=0;
j=n-1;
k=0;
//i,j,k分别是数组A,B和C的下标,因用C描述,下标从0开始
while(i<
m&
j>
=0)
if(a[i]<
b[j])c[k++]=a[i++]elsec[k++]=b[j--];
m)c[k++]=a[i++];
while(j>
=0)c[k++]=b[j--];
}算法结束
4、要求二叉树按二叉链表形式存储。
15分
(1)写一个建立二叉树的算法。
(2)写一个判别给定的二叉树是否是完全二叉树的算法。
BiTreeCreat()//建立二叉树的二叉链表形式的存储结构
{ElemTypex;
BiTreebt;
scanf(“%d”,&
x);
//本题假定结点数据域为整型
if(x==0)bt=null;
elseif(x>
0)
{bt=(BiNode*)malloc(sizeof(BiNode));
bt->
data=x;
bt->
lchild=creat();
rchild=creat();
}
elseerror(“输入错误”);
return(bt);
}//结束BiTree
intJudgeComplete(BiTreebt)//判断二叉树是否是完全二叉树,如是,返回1,否则,返回0
{inttag=0;
BiTreep=bt,Q[];
//Q是队列,元素是二叉树结点指针,容量足够大
if(p==null)return
(1);
QueueInit(Q);
QueueIn(Q,p);
//初始化队列,根结点指针入队
while(!
QueueEmpty(Q))
{p=QueueOut(Q);
//出队
if(p->
tag)QueueIn(Q,p->
lchild);
else{if(p->
lchild)return0;
//前边已有结点为空,本结点不空
elsetag=1;
//首次出现结点为空
rchild&
rchild);
elseif(p->
rchild)return0;
}//while
return1;
}//JudgeComplete
3、设从键盘输入一整数的序列:
a1,a2,a3,…,an,试编写算法实现:
用栈结构存储输入的整数,当ai≠-1时,将ai进栈;
当ai=-1时,输出栈顶整数并出栈。
算法应对异常情况(入栈满等)给出相应的信息。
设有一个背包可以放入的物品重量为S,现有n件物品,重量分别为W1,W2,...,Wn。
问能否从这n件物品中选择若干件放入背包,使得放入的重量之和正好是S。
设布尔函数Knap(S,n)表示背包问题的解,Wi(i=1,2,...,n)均为正整数,并已顺序存储地在数组W中。
请在下列算法的下划线处填空,使其正确求解背包问题。
Knap(S,n)
若S=0
则Knap←true
否则若(S<
0)或(S>
0且n<
1)
则Knap←false
否则若Knap
(1),_=true
则print(W[n]);
Knap←true
否则Knap←Knap
(2)_,_
设有一个顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素的出栈顺序为s2,s3,s4,s6,s5,s1,则顺序栈的容量至少应为多少?
画出具体进栈、出栈过程。
假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀存储空间。
例如:
设str1和str2是分别指向两个单词的头结点,请设计一个尽可能的高效算法,找出两个单词共同后缀的起始位置,分析算法时间复杂度。
将n(n>
1)个整数存放到一维数组R中。
设计一个尽可能高效(时间、空间)的算
法,将R中保存的序列循环左移p(0<
p<
n)个位置,即将R中的数据(x0,x1,x2,…,xn-1),变换为(xp,xp+1,…,xn-1,x0,x1,…,xp-1)。
4、连通图的生成树包括图中的全部n个顶点和足以使图连通的n-1条边,最小生成树是边上权值之和最小的生成树。
故可按权值从大到小对边进行排序,然后从大到小将边删除。
每删除一条当前权值最大的边后,就去测试图是否仍连通,若不再连通,则将该边恢复。
若仍连通,继续向下删;
直到剩n-1条边为止。
voidSpnTree(AdjListg)
//用“破圈法”求解带权连通无向图的一棵最小代价生成树。
{typedefstruct{inti,j,w}node;
//设顶点信息就是顶点编号,权是整型数
nodeedge[];
scanf("
%d%d"
&
e,&
n);
//输入边数和顶点数。
for(i=1;
i<
=e;
i++)//输入e条边:
顶点,权值。
scanf("
%d%d%d"
&
edge[i].i,&
edge[i].j,&
edge[i].w);
for(i=2;
i++)//按边上的权值大小,对边进行逆序排序。
{edge[0]=edge[i];
j=i-1;
while(edge[j].w<
edge[0].w)edge[j+1]=edge[j--];
edge[j+1]=edge[0];
}//for
k=1;
eg=e;
while(eg>
=n)//破圈,直到边数e=n-1.
{if(connect(k))//删除第k条边若仍连通。
{edge[k].w=0;
eg--;
}//测试下一条边edge[k],权值置0表示该边被删除
k++;
//下条边
}//while
}//算法结束。
connect()是测试图是否连通的函数,可用图的遍历实现,
5、根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论,为此设全局指针变量pre(初值为null)和全局变量flag,初值为true。
若非二叉排序树,则置flag为false。
#definetrue1
#definefalse0
typedefstructnode
{datatypedata;
structnode*llink,*rlink;
}*BTree;
voidJudgeBST(BTreet,intflag)
//判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag得出结论。
{if(t!
=null&
flag)
{Judgebst(t->
llink,flag);
//中序遍历左子树
if(pre==null)pre=t;
//中序遍历的第一个结点不必判断
elseif(pre->
data<
t->
data)pre=t;
//前驱指针指向当前结点
else{flag=flase;
}//不是完全二叉树
Judgebst(t->
rlink,flag);
//中序遍历右子树
}//JudgeBST算法结束
6、请编写一个判别给定二叉树是否为二叉排序树的算法,设二叉树用llink-rlink法存储。
7、给定n个村庄之间的交通图,若村庄i和j之间有道路,则将顶点i和j用边连接,边上的Wij表示这条道路的长度,现在要从这n个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院的路程最短?
试设计一个解答上述问题的算法,并应用该算法解答如图所示的实例。
20分
voidHospital(AdjMatrixw,intn)
//在以邻接带权矩阵表示的n个村庄中,求医院建在何处,使离医院最远的村庄到医院的路径最短。
{for(k=1;
k<
=n;
k++)//求任意两顶点间的最短路径
i++)
for(j=1;
j<
j++)
if(w[i][k]+w[k][j]<
w[i][j])w[i][j]=w[i][k]+w[k][j];
m=MAXINT;
//设定m为机器内最大整数。
i++)//求最长路径中最短的一条。
{s=0;
j++)//求从某村庄i(1<
=i<
=n)到其它村庄的最长路径。
if(w[i][j]>
s)s=w[i][j];
if(s<
=m){m=s;
k=i;
}//在最长路径中,取最短的一条。
m记最长路径,k记出发顶点的下标。
Printf(“医院应建在%d村庄,到医院距离为%d\n”,i,m);
}//算法结束
对以上实例模拟的过程略。
各行中最大数依次是9,9,6,7,9,9。
这几个最大数中最小者为6,故医院应建在第三个村庄中,离医院最远的村庄到医院的距离是6。
1、对图1所示的连通网G,请用Prim算法构造其最小生成树(每选取一条边画一个图)。
8、对二叉树的某层上的结点进行运算,采用队列结构按层次遍历最适宜。
9、若第n件物品能放入背包,则问题变为能否再从n-1件物品中选出若干件放入背包(这时背包可放入物品的重量变为s-w[n])。
若第n件物品不能放入背包,则考虑从n-1件物品选若干件放入背包(这时背包可放入物品仍为s)。
若最终s=0,则有一解;
否则,若s<
0或虽然s>
0但物品数n<
1,则无解。
(1)s-w[n],n-1//Knap(s-w[n],n-1)=true
(2)s,n-1//Knap←Knap(s,n-1)
10、数组A和B的元素分别有序,欲将两数组合并到C数组,使C仍有序,应将A和B拷贝到C,只要注意A和B数组指针的使用,以及正确处理一数组读完数据后将另一数组余下元素复制到C中即可。
11、请编写一个判别给定二叉树是否为二叉排序树的算法,设二叉树用llink-rlink法存储。
12、由二叉树的前序遍历和中序遍历序列能确定唯一的一棵二叉树,下面程序的作用是实现由已知某二叉树的前序遍历和中序遍历序列,生成一棵用二叉链表表示的二叉树并打印出后序遍历序列,请写出程序所缺的语句。
#defineMAX100
typedefstructNode
{charinfo;
structNode*llink,*rlink;
}TNODE;
charpred[MAX],inod[MAX];
main(intargc,int**argv)
{TNODE*root;
if(argc<
3)exit0;
strcpy(pred,argv[1]);
strcpy(inod,argv[2]);
root=restore(pred,inod,strlen(pred));
postorder(root);
}
TNODE*restore(char*ppos,char*ipos,intn)
{TNODE*ptr;
char*rpos;
intk;
if(n<
=0)returnNULL;
ptr->
info=
(1)_______;
for(
(2)_______;
rpos<
ipos+n;
rpos++)if(*rpos==*ppos)break;
k=(3)_______;
llink=restore(ppos+1,(4)_______,k);
rlink=restore((5)_______+k,rpos+1,n-1-k);
returnptr;
postorder(TNODE*ptr)
{if(ptr=NULL)return;
postorder(ptr->
llink);
rlink);
printf(“%c”,ptr->
info);
}
13、对二叉树的某层上的结点进行运算,采用队列结构按层次遍历最适宜。
14、题目中要求矩阵两行元素的平均值按递增顺序排序,由于每行元素个数相等,按平均值排列与按每行元素之和排列是一个意思。
所以应先求出各行元素之和,放入一维数组中,然后选择一种排序方法,对该数组进行排序,注意在排序时若有元素移动,则与之相应的行中各元素也必须做相应变动。
voidTranslation(float*matrix,intn)
//本算法对n×
n的矩阵matrix,通过行变换,使其各行元素的平均值按递增排列。
{inti,j,k,l;
floatsum,min;
//sum暂存各行元素之和
float*p,*pi,*pk;
for(i=0;
i<
n;
i++)
{sum=0.0;
pk=matrix+i*n;
//pk指向矩阵各行第1个元素.
for(j=0;
j<
j++){sum+=*(pk);
pk++;
}//求一行元素之和.
*(p+i)=sum;
//将一行元素之和存入一维数组.
}//fori
n-1;
i++)//用选择法对数组p进行排序
{min=*(p+i);
//初始设第i行元素之和最小.
for(j=i+1;
j++)if(p[j]<
min){k=j;
min=p[j];
}//记新的最小值及行号.
if(i!
=k)//若最小行不是当前行,要进行交换(行元素及行元素之和)
{pk=matrix+n*k;
//pk指向第k行第1个元素.
pi=matrix+n*i;
//pi指向第i行第1个元素.
for(j=0;
j++)//交换两行中对应元素.
{sum=*(pk+j);
*(pk+j)=*(pi+j);
*(pi+j)=sum;
sum=p[i];
p[i]=p[k];
p[k]=sum;
//交换一维数组中元素之和.
}//if
}//fori
free(p);
//释放p数组.
}//Translation
[算法分析]算法中使用选择法排序,比较次数较多,但数据交换(移动)较少.若用其它排序方法,虽可减少比较次数,但数据移动会增多.算法时间复杂度为O(n2).
15、约瑟夫环问题(Josephus问题)是指编号为1、2、…,n的n(n>
0)个人按顺时针方向围坐成一圈,现从第s个人开始按顺时针方向报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,…,如此重复直到所有的人全部出列为止。
现要求采用循环链表结构设计一个算法,模拟此过程。