最小单元路径 数据结构 实验 程序.docx
《最小单元路径 数据结构 实验 程序.docx》由会员分享,可在线阅读,更多相关《最小单元路径 数据结构 实验 程序.docx(11页珍藏版)》请在冰豆网上搜索。
最小单元路径数据结构实验程序
#include
#include
#defineINFINITY1000
#defineMAX_VERTEX_NUM20
typedefenum{DG,DN,UDG,UDN}Graphkind;
typedefstructArcCell{
intadj;
char*info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct{
charvexs[MAX_VERTEX_NUM][4];
AdjMatrixarcs;
intvexnum,arcnum;
Graphkindkind;
}MGraph;
intvisited[MAX_VERTEX_NUM];
voidCreateGraph(MGraph*G);
voidCreateDG(MGraph*G);//有向图
voidCreateDN(MGraph*G);//有向网
voidCreateUDG(MGraph*G);//无向图
voidCreateUDN(MGraph*G);//无向网
intLocateVex(MGraph*G,charv[4]);
voidFirst_next_adj(MGraph*G,inti);
voiddfs1(MGraph*G,inti);
voidbfs1(MGraph*G,inti);
voidshortesPath_DIJ(MGraph*G,intv0,intp[][MAX_VERTEX_NUM],intd[MAX_VERTEX_NUM]);
#defineQUEUE_INIT_SIZE100
#defineQUEUEINCREMENT10
typedefintQElemType;
typedefstruct{
QElemType*elem;
intfront;
intrear;
intqueuesize;
intincrementsize;
}SqQueue;
voidInitqueue_sq(SqQueue*q,intn);
intQueuelength_sq(SqQueueQ);
intDequeue_sq(SqQueue*Q,QElemType*e);
voidincrement(SqQueue*Q);
voidEnqueue_sq(SqQueue*Q,QElemTypee);
intGetqueue_sq(SqQueueQ,QElemType*e);
intQueueempty(SqQueueQ);
voidmain(){
MGraphG;
inti,j;
charv[4];
intp[MAX_VERTEX_NUM][MAX_VERTEX_NUM],d[MAX_VERTEX_NUM];
CreateGraph(&G);
for(i=0;ifor(j=0;jprintf("%8d",G.arcs[i][j].adj);
putchar('\n');
}
printf("请输入深度优先搜索初始顶点Vi:
");
getchar();
scanf("%s",v);
i=LocateVex(&G,v);
dfs1(&G,i);
printf("\n请输入广度优先搜索初始顶点Vi:
");
getchar();
scanf("%s",v);
i=LocateVex(&G,v);
bfs1(&G,i);
if(G.kind==DN||G.kind==UDN){
printf("\n输入查找第一邻接点的顶点:
");
getchar();
scanf("%s",v);
i=LocateVex(&G,v);
First_next_adj(&G,i);
shortesPath_DIJ(&G,0,p,d);
}
}
voiddfs1(MGraph*G,inti){
intj;
printf("%5s",G->vexs[i]);
visited[i]=1;
for(j=0;jvexnum;j++)
if(i!
=j&&G->arcs[i][j].adj!
=INFINITY&&!
visited[j])
dfs1(G,j);
}
voidbfs1(MGraph*G,inti){
intk,j;
SqQueueQ;
for(j=0;jvexnum;j++)
visited[j]=0;
Initqueue_sq(&Q,G->vexnum);
printf("\n%5s",G->vexs[i]);
visited[i]=1;
Enqueue_sq(&Q,i);
while(!
Queueempty(Q)){
Dequeue_sq(&Q,&k);
for(j=0;jvexnum;j++){
if(k!
=j&&G->arcs[k][j].adj!
=INFINITY&&!
visited[j]){
printf("%5s",G->vexs[j]);
visited[j]=1;
Enqueue_sq(&Q,j);
}
}
}
}
intLocateVex(MGraph*G,charv[4]){
inti=0;
while(ivexnum){
if(strcmp(G->vexs[i],v)==0)returni;
i++;
}
printf("\n输入的顶点不存在!
");
return0;
}
voidCreateUDG(MGraph*G){
inti,j,k;
charv1[4],v2[4];
printf("输入vexnum,arcnum:
");
scanf("%d%d",&G->vexnum,&G->arcnum);
printf("输入vexs[i]:
\n");
getchar();
for(i=0;ivexnum;++i)
gets(G->vexs[i]);
for(i=0;ivexnum;++i)
for(j=0;jvexnum;++j){
G->arcs[i][j].adj=INFINITY;
G->arcs[i][j].info=NULL;
}
for(k=0;kvexnum;++k){
printf("输入v1,v2:
");
scanf("%s%s",v1,v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
printf("%4s%4s%8d%8d\n",v1,v2,i,j);
G->arcs[i][j].adj=1;
G->arcs[j][i].adj=1;
}
}
voidCreateUDN(MGraph*G){
inti,j,k,w;
charv1[4],v2[4];
printf("输入vexnum,arcnum:
");
scanf("%d%d",&G->vexnum,&G->arcnum);
printf("输入vexs[i]:
\n");
getchar();
for(i=0;ivexnum;++i)
gets(G->vexs[i]);
for(i=0;ivexnum;++i)
for(j=0;jvexnum;++j){
G->arcs[i][j].adj=INFINITY;
G->arcs[i][j].info=NULL;
}
for(k=0;kvexnum;++k){
printf("输入v1,v2,w:
");
scanf("%s%s%d",v1,v2,&w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
printf("%4s%4s%8d%8d\n",v1,v2,i,j);
G->arcs[i][j].adj=w;
G->arcs[j][i].adj=G->arcs[i][j].adj;
}
}
voidCreateDG(MGraph*G)
{
inti,j,k;
charv1[4],v2[4];
printf("输入vexnum,arcnum:
");
scanf("%d%d",&G->vexnum,&G->arcnum);
printf("输入vexs[i]:
\n");
getchar();
for(i=0;ivexnum;++i)
gets(G->vexs[i]);
for(i=0;ivexnum;++i)
for(j=0;jvexnum;++j){
G->arcs[i][j].adj=INFINITY;
G->arcs[i][j].info=NULL;
}
for(k=0;kvexnum;++k){
printf("输入v1,v2:
");
scanf("%s%s",v1,v2);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
printf("%4s%4s%8d%8d\n",v1,v2,i,j);
G->arcs[i][j].adj=1;
}
}
voidCreateDN(MGraph*G){
inti,j,k,w;
charv1[4],v2[4];
printf("输入vexnum,arcnum:
");
scanf("%d%d",&G->vexnum,&G->arcnum);
printf("输入vexs[i]:
\n");
getchar();
for(i=0;ivexnum;++i)
gets(G->vexs[i]);
for(i=0;ivexnum;++i)
for(j=0;jvexnum;++j){
G->arcs[i][j].adj=INFINITY;
G->arcs[i][j].info=NULL;
}
for(k=0;karcnum;++k){
printf("输入v1,v2,w:
");
scanf("%s%s%d",v1,v2,&w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
printf("%4s%4s%8d%8d\n",v1,v2,i,j);
G->arcs[i][j].adj=w;
}
}
voidCreateGraph(MGraph*G){
intk;
printf("输入图的类型\nDG-0,DN-1,UDG-2,UDN-3:
");
scanf("%d",&k);
switch(k){
case0:
G-