主题:[讨论]新手请教---有关图的问题
请大家帮忙看看以下程序,我想实现选择性的图的输出
程序目的是建立有向图,无向图,用邻接矩阵输出,我想用选择语句实现……可有错误,请高手们指教
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 10
#define ERROR 0
typedef char VertexType;
typedef int VPType;
typedef int Graphkind;
typedef int status;
typedef enum {FALSE, TRUE} boolean;
boolean visit[MAX_VERTEX_NUM];
typedef struct Arcell
{
VPType adj;
}Arcell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vex[MAX_VERTEX_NUM];//顶点标志 或者叫代号
int vexnum, arcnum;//点的个数和边的条数
AdjMatrix arcs;
Graphkind kind;//图的类型
}MGraph;
status CreatGraph(MGraph *G) //建立图
{
int i, j, select;
printf("1:建立有向图!\n");
printf("2:建立无向图!\n");
printf("3:请选者种类!\n");
scanf("%d",&select);
if (select == 1)
{
G->kind = 0;
}
else if (select == 2)
{
G->kind = 1;
}
else
{
return ERROR;
}
printf("\n请输入顶点的个数:");
scanf("%d",&G->vexnum);
getchar();// 吃掉内存中的残留数据
printf("\n 请输入顶点的信息(代号)");
for ( i = 0; i < G->vexnum; i++)
{
scanf("%c",&G->vex[i]);//注意一下
}
getchar();
printf("\n 请输入2个顶点之间的相互关系(0表示相邻 1表示不相邻):\n");
for ( i = 0 ; i < G->vexnum; i++)
for ( j = 0; j < G->vexnum; j++)
{
scanf("%d",&G->arcs[i][j].adj);
}
printf("建立成功\n");
return 0;
}
void DFS(MGraph G) //深搜索
{
int i, j;
void DFS1( MGraph G, int i);//函数声明
for (i = 0 ; i < G.vexnum; i++)
{
visit[i] = FALSE;
}
for (j = 0; j <G.vexnum; j++)
{
if (!visit[j])
DFS1(G,j);//不要用&G 因为G已经是地址了
}
// return 0;
}
void DFS1(MGraph G, int i)
{
int j;
visit[i]=TRUE;
printf("%c",G.vex[i]);
for (j = 0; j < G.vexnum; j++)
{
if ((i != j) && (G.arcs[i][j].adj == 1) && !visit[j])
{
DFS1(G,j);
}
}
// return 0;
}
status BFS( const MGraph *G,int k)//广度搜索
{
int s = 0, g = 0;
int i, j;
char a[MAX_VERTEX_NUM];
for (i = 0; i < G->vexnum; i++)
{
visit[i] = FALSE;
}
printf("%c ",G->vex[k]);
visit[k]=TRUE;
for ( j = 0; j < G->vexnum; j++)
{
a[j] = -1;
}
a[s] = k;
while(a[s]!=-1)
{
int j;
i = a[g];
g++;
for ( j = 0; j < G->vexnum; j++)
{
if (G->arcs[i][j].adj == 1 && !visit[j])
{
printf("%c ",G->vex[j]);
visit[j] = TRUE;
s++;
a[s] = j;
}
}
if ( s == G->vexnum-1)
{
break;
}
}
return 0;
}
int main(void)
{
MGraph G;
int flag, select;
int flag1 = 0;
int k;
while(1)
{
do
{
printf("1:构建图\n");
printf("2:深度搜索\n");
printf("3:广度搜索\n");
printf("4:退出\n");
printf("5:请选择\n");
scanf("%d",&select);
if (select == 5)
{
flag = 0;
}
else
{
flag = 1;
}
}while(select < 1 || select > 6);
if (flag == 0)
{
break;
}
switch(select)
{
case 1:
flag1 = 1;
CreatGraph(&G);
break;
case 2:
if(flag1 == 1)
{
qiudu(&G);
}
else
{
printf(" 请先建立图\n");
}
break;
case 3:
if(flag1 == 1)
{
printf("进行深度搜索:\n");
DFS(G);
printf("进行深度搜索:\n");
printf("\n");
}
else
{
printf(" 请先建立图\n");
}
break;
case 4:
if(flag1 == 1)
{
printf("请哪个点开始搜索");
scanf("%d",&k);
getchar();
printf("进行广度搜索\n");
BFS(&G,k);
printf("\n");
}
else
{
printf(" 请先建立图\n");
}
break;
default: continue;
}
}
}
程序目的是建立有向图,无向图,用邻接矩阵输出,我想用选择语句实现……可有错误,请高手们指教
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 10
#define ERROR 0
typedef char VertexType;
typedef int VPType;
typedef int Graphkind;
typedef int status;
typedef enum {FALSE, TRUE} boolean;
boolean visit[MAX_VERTEX_NUM];
typedef struct Arcell
{
VPType adj;
}Arcell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vex[MAX_VERTEX_NUM];//顶点标志 或者叫代号
int vexnum, arcnum;//点的个数和边的条数
AdjMatrix arcs;
Graphkind kind;//图的类型
}MGraph;
status CreatGraph(MGraph *G) //建立图
{
int i, j, select;
printf("1:建立有向图!\n");
printf("2:建立无向图!\n");
printf("3:请选者种类!\n");
scanf("%d",&select);
if (select == 1)
{
G->kind = 0;
}
else if (select == 2)
{
G->kind = 1;
}
else
{
return ERROR;
}
printf("\n请输入顶点的个数:");
scanf("%d",&G->vexnum);
getchar();// 吃掉内存中的残留数据
printf("\n 请输入顶点的信息(代号)");
for ( i = 0; i < G->vexnum; i++)
{
scanf("%c",&G->vex[i]);//注意一下
}
getchar();
printf("\n 请输入2个顶点之间的相互关系(0表示相邻 1表示不相邻):\n");
for ( i = 0 ; i < G->vexnum; i++)
for ( j = 0; j < G->vexnum; j++)
{
scanf("%d",&G->arcs[i][j].adj);
}
printf("建立成功\n");
return 0;
}
void DFS(MGraph G) //深搜索
{
int i, j;
void DFS1( MGraph G, int i);//函数声明
for (i = 0 ; i < G.vexnum; i++)
{
visit[i] = FALSE;
}
for (j = 0; j <G.vexnum; j++)
{
if (!visit[j])
DFS1(G,j);//不要用&G 因为G已经是地址了
}
// return 0;
}
void DFS1(MGraph G, int i)
{
int j;
visit[i]=TRUE;
printf("%c",G.vex[i]);
for (j = 0; j < G.vexnum; j++)
{
if ((i != j) && (G.arcs[i][j].adj == 1) && !visit[j])
{
DFS1(G,j);
}
}
// return 0;
}
status BFS( const MGraph *G,int k)//广度搜索
{
int s = 0, g = 0;
int i, j;
char a[MAX_VERTEX_NUM];
for (i = 0; i < G->vexnum; i++)
{
visit[i] = FALSE;
}
printf("%c ",G->vex[k]);
visit[k]=TRUE;
for ( j = 0; j < G->vexnum; j++)
{
a[j] = -1;
}
a[s] = k;
while(a[s]!=-1)
{
int j;
i = a[g];
g++;
for ( j = 0; j < G->vexnum; j++)
{
if (G->arcs[i][j].adj == 1 && !visit[j])
{
printf("%c ",G->vex[j]);
visit[j] = TRUE;
s++;
a[s] = j;
}
}
if ( s == G->vexnum-1)
{
break;
}
}
return 0;
}
int main(void)
{
MGraph G;
int flag, select;
int flag1 = 0;
int k;
while(1)
{
do
{
printf("1:构建图\n");
printf("2:深度搜索\n");
printf("3:广度搜索\n");
printf("4:退出\n");
printf("5:请选择\n");
scanf("%d",&select);
if (select == 5)
{
flag = 0;
}
else
{
flag = 1;
}
}while(select < 1 || select > 6);
if (flag == 0)
{
break;
}
switch(select)
{
case 1:
flag1 = 1;
CreatGraph(&G);
break;
case 2:
if(flag1 == 1)
{
qiudu(&G);
}
else
{
printf(" 请先建立图\n");
}
break;
case 3:
if(flag1 == 1)
{
printf("进行深度搜索:\n");
DFS(G);
printf("进行深度搜索:\n");
printf("\n");
}
else
{
printf(" 请先建立图\n");
}
break;
case 4:
if(flag1 == 1)
{
printf("请哪个点开始搜索");
scanf("%d",&k);
getchar();
printf("进行广度搜索\n");
BFS(&G,k);
printf("\n");
}
else
{
printf(" 请先建立图\n");
}
break;
default: continue;
}
}
}