算法与数据结构课程设计有向图无向图有向网无向网.docx
- 文档编号:6529794
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:24
- 大小:349.85KB
算法与数据结构课程设计有向图无向图有向网无向网.docx
《算法与数据结构课程设计有向图无向图有向网无向网.docx》由会员分享,可在线阅读,更多相关《算法与数据结构课程设计有向图无向图有向网无向网.docx(24页珍藏版)》请在冰豆网上搜索。
算法与数据结构课程设计有向图无向图有向网无向网
算法与数据结构课程设计报告
系(院):
计算机科学学院
专业班级:
教技1001班
******
学号:
*********
*******
设计时间:
2012.6.16-2012.6.24
设计地点:
4号楼2号机房
一、设计方案及实现过程******************第3页
二、实现代码***********************************第4页
三、测试******************************************第19页
四、难点与收获********************************第21页
一、设计方案及实现过程
这次课程设计要求实现无向图、有向图、无向网以及有向网的一些基本操作以及应用,大体的方案是先进入界面后,选择无向图、有向图、无向网、无向网中的一个,然后创建相应的图或者网,创建好后,在此基础上选择进行相关的操作,具体的函数放在main函数前面,通过多次函数调用已达到具体操作的实现。
有向图、无向网、有向网的操作和无向图类似,在这里不一一列举。
流程图如下:
二、实现代码
#include
#include
#definemaxlen10
#definelarge999
#definetrue1
#definefalse0
#defineok1
#defineerror0
#defineoverflow-2
#definenull0
typedefintstatus;
#include
#include
#include
#include
#include
usingnamespacestd;
#defineMAX_VERTEX_NUM20
#defineMAX1000
typedefstruct{
inta[maxlen],b[maxlen],h[maxlen];
charvexs[maxlen];
intvexnum,arcnum;
intkind;
intarcs[maxlen][maxlen];
}graph;
typedefstructnode{
intadjvex;
intinfo;
structnode*next;
}edgenode;
typedefstruct{
intid;
chardata;
edgenode*link;
}vexnode;
typedefstruct{
vexnodeadjs[maxlen];
intvexnum,arcnum;
intkind;
}adjlist;
typedefstructqnode{
intdata;
structqnode*next;
}linkqlist;
typedefstruct
{linkqlist*front;
linkqlist*rear;
}linkqueue;
typedefstruct
{intstack[maxlen];
inttop;
}stackstru;
intcnull=-1;
graphg;
adjlistadjl;
stackstru*t;
stackstru*s;
linkqueue*q;
graphprintf_adjmatrix(graphg){
inti,j;
printf("邻接矩阵:
\n");
printf("vertex\t");
for(i=0;i printf("\n"); for(i=0;i printf("%4c\t",g.vexs[i]); for(j=0;j printf("\n"); } returng; } voidcreate_2(graphg){//构造有向图 inti,j,k,c=0; for(i=0;i for(j=0;j g.arcs[i][j]=c; for(k=0;k g.arcs[g.a[k]-1][g.b[k]-1]=1; printf_adjmatrix(g); } voidcreate_1(graphg){//构造无向图 inti,j,k,c=0; for(i=0;i for(j=0;j g.arcs[i][j]=c; for(k=0;k g.arcs[g.a[k]-1][g.b[k]-1]=1; g.arcs[g.b[k]-1][g.a[k]-1]=1; } printf_adjmatrix(g); } graphcreate_4(graphg){//构造有向网 inti,j,k,c=999; for(i=0;i for(j=0;j g.arcs[i][j]=c; for(k=0;k g.arcs[g.a[k]-1][g.b[k]-1]=g.h[k]; printf_adjmatrix(g); returng; } graphcreate_3(graphg){//构造无向网 inti,j,k,c=999; for(i=0;i for(j=0;j g.arcs[i][j]=c; for(k=0;k g.arcs[g.a[k]-1][g.b[k]-1]=g.h[k]; g.arcs[g.b[k]-1][g.a[k]-1]=g.h[k]; } printf_adjmatrix(g); returng; } voidcreategraph(graphg){ switch(g.kind){ case1: create_1(g);break; case2: create_2(g);break; case3: create_3(g);break; case4: create_4(g);break; default: printf("Error\n"); } } adjlistcreatelist(graphg,adjlistadjl){//创建邻接表 inti; edgenode*p; if(g.kind==1||g.kind==3){//创建有向邻接表 for(i=0;i p=(edgenode*)malloc(sizeof(edgenode)); p->adjvex=g.b[i]; p->info=g.h[i]; p->next=adjl.adjs[g.a[i]-1].link; adjl.adjs[g.a[i]-1].link=p; } } if(g.kind==2||g.kind==4){//创建无向邻接表 for(i=0;i p=(edgenode*)malloc(sizeof(edgenode)); p->info=g.h[i]; p->adjvex=g.b[i]; p->next=adjl.adjs[g.a[i]-1].link; adjl.adjs[g.a[i]-1].link=p; p=(edgenode*)malloc(sizeof(edgenode)); p->info=g.h[i]; p->adjvex=g.a[i]; p->next=adjl.adjs[g.b[i]-1].link; adjl.adjs[g.b[i]-1].link=p; } } printf("邻接表为: \n"); for(i=0;i printf("[%d,%c]=>",i+1,adjl.adjs[i].data); p=adjl.adjs[i].link; while(p! =null){ printf("[%c,%d]-->",adjl.adjs[(p->adjvex)-1].data,p->info); p=p->next; } printf("^\n"); } returnadjl; } voidinitqueue(linkqueue*p){//构造空队列 p->front=(linkqlist*)malloc(sizeof(linkqlist)); p->rear=p->front; (p->front)->next=null; } statusempty(linkqueue*q){//判断是否为空 intv; if(q->front==q->rear)v=true; elsev=false; returnv; } intaddqueue(linkqueue*q,inte){ q->rear->next=(linkqlist*)malloc(sizeof(linkqlist)); q->rear=q->rear->next; if(! q->rear)return-1; q->rear->data=e; q->rear->next=null; returnok; } statusdelqueue(linkqueue*q){// linkqlist*p; inte; if(q->front==q->rear) printf("thelinklistisoverflow"); elsep=(q->front)->next; (q->front)->next=p->next; e=p->data; if(q->rear==p) q->rear=q->front; free(p); return(e); } boolvisit[maxlen];//深度优先搜索 voidDFS(adjlistadjl,inti){ edgenode*p; visit[i]=1; printf("%c",adjl.adjs[i].data); for(p=adjl.adjs[i].link;p;p=p->next){ if(! visit[p->adjvex])DFS(adjl,p->adjvex); } } voidDFSTraverse(adjlistadjl){ inti; printf("\t\t深度优先搜索: "); for(i=0;i visit[i]=false; for(i=0;i<=adjl.vexnum;i++) if(! visit[i])DFS(adjl,i); } queue voidBFSTraverse(adjlistadjl){//广度优先搜索 edgenode*w; inti,j; printf("\n\t\t广度优先搜索: "); for(i=0;i visit[i]=0; for(i=0;i<=adjl.vexnum;i++){ if(! visit[i]){ visit[i]=1; printf("%c",adjl.adjs[i].data); Q.push(i); while(! Q.empty()){ j=Q.front(); Q.pop(); for(w=adjl.adjs[i].link;w;w=w->next) if(! visit[w->adjvex]){ visit[w->adjvex]=1; printf("%c",adjl.adjs[w->adjvex-1].data); Q.push(w->adjvex); } } } } } statusinitstack(stackstru*s){//构造空栈 s->top=0; returnok; } statuspush(stackstru*s,intx){//进栈 if(s->top==maxlen) printf("thestackisoverflow! \n"); else{ s->top=s->top+1; s->stack[s->top]=x; } return1; } statuspop(stackstru*s)//出栈 { inty; if(s->top==0)printf("thestackisempty! \n"); else {y=s->stack[s->top]; s->top=s->top-1; } returny; } statusstackempty(stackstru*s)//判断栈是否为空 {if(s->top==maxlen)return(true); elsereturn(false); } intTopologicalSort(adjlistadjl)//拓扑排序 { stack edgenode*p; inti,j,count=0; printf("\n拓扑排序: "); for(i=0;i<=adjl.vexnum;i++) if(adjl.adjs[i].id==0)S.push(i);count=0; while(! S.empty()) { j=S.top();S.pop(); count++; printf("(%d%c)",j,adjl.adjs[j].data); for(p=adjl.adjs[i].link;p;p=p->next) { intk=p->adjvex; intd=--(adjl.adjs[k].id); if(! d)S.push(k); } } if(count {printf("\n网中有环! \n"); returnerror; } elsereturnok; } voidprim(graphg){ inti,j,k,min; intlowcost[maxlen]; intcloset[maxlen]; printf("最小生成树的边为: \n"); for(i=1;i lowcost[i]=g.arcs[0][i]; closet[i]=1; } closet[1]=0; j=1; for(i=1;i min=lowcost[j]; k=i; for(j=1;j if(lowcost[j] =0){ min=lowcost[j]; k=j; } printf("(%c,%c),",g.vexs[k-1],g.vexs[closet[k-1]]); closet[k]=0; for(j=1;j if(g.arcs[k][j] =0){ lowcost[j]=g.arcs[k][j]; closet[j]=k; } } } intve[maxlen]; intvl[maxlen]; statustoporder(adjlistadjl,stackstru*t){//关键路径 inti,j,count,k; edgenode*p; initstack(s); initstack(t); for(i=0;i if(adjl.adjs[i].id==0)push(s,i); count=0; for(i=0;i while(! stackempty(s)) { j=pop(s);push(t,j);++count; for(p=adjl.adjs[j].link;p;p=p->next) { k=p->adjvex; if(--adjl.adjs[k-1].id==0)push(s,k-1); if(ve[j]+(p->info)>ve[k-1])ve[k-1]=ve[j]+(p->info); } } if(count elsereturnok; } intcriticalpath(adjlistadjl) { inti,j,k,dut,ee,el; edgenode*p; if(! toporder(adjl,t))returnerror; for(i=0;i printf("关键路径为: \n"); while(! stackempty(t)) for(j=pop(t),p=adjl.adjs[j].link;p;p=p->next) { k=p->adjvex;dut=(p->info); if(vl[k]-dut } for(j=0;j for(p=adjl.adjs[j].link;p;p=p->next){ k=p->adjvex;dut=p->info; ee=ve[j];el=vl[k-1]-dut; if(ee==el)printf("(%c,%c)->",adjl.adjs[j].data,adjl.adjs[k-1].data); } returnok; } voidshortpath_dijkstra(graphg)//有向网的最短路径 { intcost[maxlen][maxlen]; intdist[maxlen]; intpath[maxlen]; ints[maxlen]; inti,j,v0,min,u; printf("\n请输入起点的编号: "); scanf("%d",&v0); v0--; for(i=0;i { for(j=0;j cost[i][j]=g.arcs[i][j]; } for(i=0;i { dist[i]=cost[v0][i]; if(dist[i] s[i]=0; } s[v0]=1; for(i=0;i { min=large; u=v0; for(j=0;j if(s[j]==0&&dist[j] { min=dist[j];u=j; } s[u]=1; for(j=0;j if(s[j]==0&&dist[u]+cost[u][j] { dist[j]=dist[u]+cost[u][j]; path[j]=u; } } printf("\n顶点%d到各顶点的最短路径长度为: \n",v0); for(i=0;i if(s[i]==1) { u=i; while(u! =v0) {printf("%4c<-",g.vexs[u]); u=path[u]; } printf("%4c",g.vexs[u]); printf(": %d\n",path[i]); } elseprintf("%4c<-%4c: 无路径\n",g.vexs[i],g.vexs[v0]); } voidShowMainMenu(){ printf("\n"); printf("**************图的基本操作及应用***************\n"); printf("*1无向图的基本操作及应用*\n"); printf("*2有向图的基本操作及应用*\n"); printf("*3无向网的基本操作及应用*\n"); printf("*4有向网的基本操作及应用*\n"); printf("*5退出\n"); printf("***********************************************\n"); } voidUDG(){ intn; do{ printf("\n"); printf("**************无向图的基本操作及应用***************\n"); printf("*1创建无向图的邻接矩阵*\n"); printf("*2创建无向图的邻接表*\n"); printf("*3无向图的深度优先遍历*\n"); printf("*4无向图的广度优先遍历*\n"); printf("*5退出\n"); printf("***************************************************\n"); printf("请选择: "); scanf("%d",&n); switch(n){ case1:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 数据结构 课程设计