江苏省数据结构分析加强Word文件下载.docx

上传人:b****4 文档编号:17383651 上传时间:2022-12-01 格式:DOCX 页数:10 大小:19.85KB
下载 相关 举报
江苏省数据结构分析加强Word文件下载.docx_第1页
第1页 / 共10页
江苏省数据结构分析加强Word文件下载.docx_第2页
第2页 / 共10页
江苏省数据结构分析加强Word文件下载.docx_第3页
第3页 / 共10页
江苏省数据结构分析加强Word文件下载.docx_第4页
第4页 / 共10页
江苏省数据结构分析加强Word文件下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

江苏省数据结构分析加强Word文件下载.docx

《江苏省数据结构分析加强Word文件下载.docx》由会员分享,可在线阅读,更多相关《江苏省数据结构分析加强Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。

江苏省数据结构分析加强Word文件下载.docx

//层数大于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的人又出列,…,如此重复直到所有的人全部出列为止。

现要求采用循环链表结构设计一个算法,模拟此过程。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1