数据结构作业系统第七章答案.docx

上传人:b****4 文档编号:4742049 上传时间:2022-12-08 格式:DOCX 页数:12 大小:17.74KB
下载 相关 举报
数据结构作业系统第七章答案.docx_第1页
第1页 / 共12页
数据结构作业系统第七章答案.docx_第2页
第2页 / 共12页
数据结构作业系统第七章答案.docx_第3页
第3页 / 共12页
数据结构作业系统第七章答案.docx_第4页
第4页 / 共12页
数据结构作业系统第七章答案.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构作业系统第七章答案.docx

《数据结构作业系统第七章答案.docx》由会员分享,可在线阅读,更多相关《数据结构作业系统第七章答案.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构作业系统第七章答案.docx

数据结构作业系统第七章答案

7.22③试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点Vi到顶点Vj的路径(i≠j)。

注意:

算法中涉及的图的基本操作必须在此存储结构上实现。

实现下列函数:

StatusDfsReachable(ALGraphg,inti,intj);

*/

*/

/*JudgeifitexistsapathfromVertex'i'to/*Vertex'j'indigraph'g'.

/*Array'Visited[]'hasbeeninitialedto'false'.*/

图的邻接表以及相关类型和辅助变量定义如下:

StatusVisited[MAX_VERTEX_NUM];

typedefcharVertexType;

typedefstructArcNode{

intadjVex;

structArcNode*nextarc;

}ArcNode;

typedefstructVNode{

VertexTypedata;

ArcNode*firstarc;

}VNode,AdjList[MAX_VERTEX_NUM];

typedefstruct{

AdjListVertices;

intVexnum,arcnum;

}ALGraph;

StatusDfsReachable(ALGraphg,inti,intj)

/*JudgeifitexistsapathfromVertex'i'to*/

/*Vertex'j'indigraph'g'.*//*Array'Visited[]'hasbeeninitialedto'false'.*/{

intk;

ArcNode*p;

Visited[i]=1;

for(p=g.Vertices[i].firstarc;p;p=p->nextarc){

if(p)

{

k=p->adjVex;if(k==j)return1;if(Visited[k]!

=1)

if(DfsReachable(g,k,j))return1;

}

}

return0;

}

7.23③同7.22题要求。

试基于图的广度优先搜索策略写一算法。

实现下列函数:

StatusBfsReachable(ALGraphg,inti,intj);

/*Determinewhetheritexistspathfromvertexito*/

/*vertexjindigraphgwithBreadth_FirstSearch.*/

/*Array'visited'hasbeeninitialedto'false'.*/

图的邻接表以及相关类型和辅助变量定义如下:

Statusvisited[MAX_VERTEX_NUM];

typedefcharVertexType;

typedefstructArcNode{

intadjvex;

structArcNode*nextarc;

}ArcNode;

typedefstructVNode{

VertexTypedata;

ArcNode*firstarc;

}VNode,AdjList[MAX_VERTEX_NUM];

typedefstruct{

AdjListvertices;

intvexnum,arcnum;

}ALGraph;

StatusInitQueue(Queue&q);

StatusEnQueue(Queue&q,inte);

StatusDeQueue(Queue&q,int&e);

StatusQueueEmpty(Queueq);

StatusGetFront(Queueq,int&e);

StatusBfsReachable(ALGraphg,inti,intj)

/*Determinewhetheritexistspathfromvertexito*/

/*vertexjindigraphgwithBreadth_FirstSearch.*/

/*Array'visited'hasbeeninitialedto'false'.*/

{

Queueq;intk,n;ArcNode*p;

InitQueue(q);EnQueue(q,i);while(!

QueueEmpty(q))

{

DeQueue(q,k);visited[k]=1;

for(p=g.vertices[k].firstarc;p;p=p->nextarc)

{n=p->adjvex;if(n==j)return1;if(visited[n]!

=1)EnQueue(q,n);

}}return0;

}

7.24③试利用栈的基本操作编写,按深度优先搜索策略遍历一个强连通图的非递归形式的算法。

算法中不规定具体的存储结构,而将图Graph看成是一种抽象的数据类型。

实现下列函数:

voidTraverse(Graphdig,VertexTypev0,void(*visit)(VertexType));/*Travelthedigraph'dig'withDepth_FirstSearch.*/

图以及相关类型、函数和辅助变量定义如下:

Statusvisited[MAX_VERTEX_NUM];intLocateVex(Graphg,VertexTypev);

VertexTypeGetVex(Graphg,inti);intFirstAdjVex(Graphg,intv);intNextAdjVex(Graphg,intv,intw);voidvisit(charv);

StatusInitStack(SStack&s);

StatusPush(SStack&s,SElemTypex);

StatusPop(SStack&s,SElemType&x);

StatusStackEmpty(SStacks);

StatusGetTop(SStacks,SElemType&e);

voidTraverse(Graphdig,VertexTypev0,void(*visit)(VertexType)){

inti,v,flag;SStacks;VertexTypep;InitStack(s);

//flag来记录某点还有没有邻接点

if(dig.vexnum&&dig.arcnum)

{i=LocateVex(dig,v0);visited[i]=TRUE;visit(v0);Push(s,v0);while(!

StackEmpty(s))

{GetTop(s,p);v=LocateVex(dig,p);flag=0;for(i=FirstAdjVex(dig,v);i>=0;i=NextAdjVex(dig,v,i))

{if(!

visited[i]){p=GetVex(dig,i);flag=1;break;}}

if(flag)

{visit(p);visited[i]=TRUE;

Push(s,p);

}

else{Pop(s,p);}

}

}

}

7.27④采用邻接表存储结构,编写一个判别无向图中任意给定的

两个顶点之间是否存在一条长度为k的简单路径的算法。

实现下列函数:

StatusSinglePath(ALGraphg,VertexTypesv,VertexTypetv,

intk,char*sp);

/*Judgewhetheritexistsapathfromsvtotvwithlengthk*/

/*ingraphg,returnpathusingstringspifexists.*/

图的邻接表以及相关类型、函数和辅助变量定义如下:

Statusvisited[MAX_VERTEX_NUM];

typedefcharStrARR[100][MAX_VERTEX_NUM+1];

typedefcharVertexType;

typedefstructArcNode{

intadjvex;

structArcNode*nextarc;

}ArcNode;

typedefstructVNode{

VertexTypedata;

ArcNode*firstarc;

}VNode,AdjList[MAX_VERTEX_NUM];

typedefstruct{

AdjListvertices;

intvexnum,arcnum;

}ALGraph;

intLocateVex(Graphg,VertexTypev);

voidinpath(char*&path,VertexTypev);

/*Addvertex'v'to'path'*/

voiddepath(char*&path,VertexTypev);

/*Removevertex'v'from'path'*/

StatusSinglePath(ALGraphg,VertexTypesv,VertexTypetv,intk,char*sp)

/*Judgewhetheritexistsapathfromsvtotvwithlengthk*/

/*ingraphg,returnpathusingstringspifexists.*/

{inti,j,l;

ArcNode*p;

if(sv==tv&&k==0)

{inpath(sp,tv);

returnOK;}

else

{

i=LocateVex(g,sv);

visited[i]=1;

inpath(sp,sv);

for(p=g.vertices[i].firstarc;p;p=p->nextarc)

{

l=p->adjvex;

if(!

visited[l])

{

if(SinglePath(g,g.vertices[l].data,tv,k-1,sp))

returnOK;

else

depath(sp,g.vertices[l].data);

}

}

visited[i]=0;

}

}

7.28⑤已知有向图和图中两个顶点U和V,试编写算法求

有向图中从u到v的所有简单路径。

实现下列函数:

VoidAllPath(ALGraphg,VertexTypesV,VertexTypetV,

StrARR&path,int&i);

/*GetallthepathsfromVertexsVtotV,saVethem*/

/*intoArraypathwhichcontainsstringcomponents.*/

/*RetUrnthenUmberofpathUsingi*/

图的邻接表以及相关类型、函数和辅助变量定义如下:

Statusvisited[MAX_VERTEX_NUM];

typedefcharStrARR[100][MAX_VERTEX_NUM+1];

typedefcharVertexType;

typedefstructArcNode{

intadjvex;

structArcNode*nextarc;

}ArcNode;

typedefstructVNode{

VertexTypedata;

ArcNode*firstarc;

}VNode,AdjList[MAX_VERTEX_NUM];

typedefstruct{

AdjListvertices;

intvexnum,arcnum;

}ALGraph;

intLocateVex(Graphg,VertexTypev);

voidinpath(char*path,VertexTypev);

/*Addvertex'v'to'path'*/

voiddepath(char*path,VertexTypev);

/*Removevertex'v'from'path'*/

voidAllPath2(ALGraphg,VertexTypesv,VertexTypetv,StrARR&path,int&i,int&d,VertexTypeA[]){intj,k,l,m,n;

ArcNode*p;

j=LocateVex(g,sv);

visited[j]=1;

A[d++]=sv;

if(sv==tv)

{

m=0;

for(n=0;n

path[i][m++]=A[n];

i++;

}

else

for(p=g.vertices[j].firstarc;p;p=p->nextarc)

{

l=p->adjvex;

if(!

visited[l])

AllPath2(g,g.vertices[l].data,tv,path,i,d,A);

}visited[j]=0;d--;

}

voidAllPath(ALGraphg,VertexTypesv,VertexTypetv,StrARR&path,int&i)

/*Getallthepathsfromvertexsvtotv,savethem*/

/*intoArraypathwhichcontainsstringcomponents.*/

/*Returnthenumberofpathusingi*/{

intd=0,j,l;

VertexTypeA[MAX_VERTEX_NUM],B[MAX_VERTEX_NUM];for(l=0;l<5;l++)

{

strcpy(B,path[l]);for(j=0;j

}AllPath2(g,sv,tv,path,i,d,A);

}

7.31③试完成求有向图的强连通分量的算法,并分析算法的时间复杂度。

实现下列函数:

voidStronglyConnected(OLGraphdig,StrARR&scc,int&n);/*Getallthestronglyconnectedcomponentsinthedigraphdig,*//*andputtheithintoscc[i]whichisastring.*/

记录各强连通分量

图的十字链表以及相关类型和辅助变量定义如下:

Statusvisited[MAX_VERTEX_NUM];intfinished[MAX_VERTEX_NUM];

typedefcharStrARR[MAX_VERTEX_NUM][MAX_VERTEX_NUM+1];//typedefstructArcBox{

inttailvex,headvex;

structArcBox*hlink,*tlink;

}ArcBox;typedefstructVexNode{

VertexTypedata;

ArcBox*firstin,*firstout;

}VexNode;

typedefstruct{

VexNodexlist[MAX_VERTEX_NUM];

intvexnum,arcnum;

}OLGraph;

intcount;

voidDFS1(OLGraphdig,intv);

voidDFS2(OLGraphdig,intv,StrARR&scc,intj,intk);

voidStronglyConnected(OLGraphdig,StrARR&scc,int&n)

/*Getallthestronglyconnectedcomponentsinthedigraphdig,*/

/*andputtheithintoscc[i]whichisastring.*/{

inti,k=0,v;

count=0;

for(v=0;v

if(!

visited[v])

DFS1(dig,v);

for(v=0;v

visited[v]=0;

for(i=dig.vexnum-1;i>=0;i--)

{

v=finished[i];

if(!

visited[v])

{

DFS2(dig,v,scc,n,k);

n++;

}

}

}

voidDFS1(OLGraphdig,intv)

{

intw;

ArcBox*p;

visited[v]=1;

for(p=dig.xlist[v].firstout;p;p=p->tlink)

{w=p->headvex;

if(!

visited[w])

DFS1(dig,w);

}

finished[count++]=v;

voidDFS2(OLGraphdig,intv,StrARR&scc,intj,intk)

{

intw;

ArcBox*p;

visited[v]=1;

scc[j][k++]=dig.xlist[v].data;

for(p=dig.xlist[v].firstin;p;p=p->hlink)

{

w=p->tailvex;

if(!

visited[w])

DFS2(dig,w,scc,j,k);

}

}

7.29⑤试写一个算法,在以邻接矩阵方式存储的有向图G中求顶点i到顶点j的不含回路的、长度为k

的路径数。

实现下列函数:

intSimplePath(MGraphG,inti,intj,intk);

/*求有向图G的顶点i到j之间长度为k的简单路径条数*/

图的邻接矩阵存储结构的类型定义如下:

typedefenum{DG,DN,AG,AN}GraphKind;//有向图,有向网,无向图,无向网

typedefstruct{

VRTypeadj;//顶点关系类型。

对无权图,用1(是)或0(否)表示相邻否;

//对带权图,则为权值类型

InfoType*info;//该弧相关信息的指针(可无)}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedefstruct{

AdjMatrixarcs;//邻接矩阵

VertexTypevexs[MAX_VERTEX_NUM];//顶点向量

intvexnum,arcnum;//图的当前顶点数和弧数

GraphKindkind;//图的种类标志

}MGraph;

intSimplePath(MGraphG,inti,intj,intk)

/*求有向图G的顶点i到j之间长度为k的简单路径条数*/

{

intsum=0,v;

if(G.arcs[i][j].adj&&k==1&&!

visited[j])

sum=1;

else

if(k>1)

{visited[i]=1;

for(v=0;v

{

if(G.arcs[i][v].adj&&!

visited[v])sum+=SimplePath(G,v,j,k-1);

}

visited[i]=0;

}

returnsum;

}

实现下列函数:

intSearch(SSTables,KeyTypek);

/*Indextheelementwhichkeyisk*/

/*inStaticSearchTables.*/

/*Return0ifxisnotfound.*/

静态查找表的类型SSTable定义如下:

typedefstruct{

KeyTypekey;

......//其他数据域

}ElemType;

typedefstruct{

ElemType*elem;

intlength;

}SSTable;

intSearch(SSTablea,KeyTypek)

/*Indextheelementwhichkeyisk*//*inStaticSearchTables.*/

/*Return0ifxisnotfound.*/

{

inti;

for(i=1;i<=a.length;i++)if(a.elem[i].key==k)returni;

return0;

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

当前位置:首页 > 求职职场 > 简历

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

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