跪求C语言代码纠错,急~~~,克鲁斯卡尔算法

qq_41434893 2018-06-14 10:48:11
程序可以运行,但是输入一半时会停止运行,极少数时能成功运行。
#include <stdio.h>
#define MaxVertexNum 100 //最大顶点个数
#define M 30
typedef enum{FALSE,TRUE}Boolean;
Boolean visited[MaxVertexNum]; //访问标志数组
typedef char VertexType;
typedef int EdgeType;
typedef struct Lnode
{
int w;//相应一条边的权值
}Link;
typedef struct
{
VertexType vexs[MaxVertexNum]; //顶点表
Link edges[MaxVertexNum][MaxVertexNum]; //图中当前的相连接的两个顶点
int n,e; //图中当前的顶点数和边数
}MGraph;
typedef struct
{
char data;
int jihe;
}VEX;
typedef struct
{
int vexh,vext; //边顶点
int weight; //权值
int flag; //标记
}EDGE;
EDGE e[M];
int p=0;
/*************************图邻接矩阵的建立**************************/
MGraph CreateMGraph()
{
MGraph G;
int i,j,k,ch3;
char ch1,ch2;
printf("请输入该图的顶点数和边数:\n");
scanf("%d,%d",&(G.n),&(G.e));
while(G.e>(G.n-1)*G.n/2)
{
printf("输入错误,请重新输入:\n");
scanf("%d,%d",&(G.n),&(G.e));
}
printf("请输入该图的顶点信息:\n");
for(i=1;i<=G.n;i++)
{
getchar();
scanf("%c",&(G.vexs[i]));
}
for(i=1;i<=G.n;i++)
for(j=1;j<=G.n;j++)
G.edges[i][j].w=0;
printf("请输入该图每条边对应的两个顶点的名称:\n");
for(k=1;k<=G.e;k++)
{
scanf("%c",&ch1);
printf("请输入第%d条边的顶点序号:",k);
scanf("%c %c",&ch1,&ch2);
printf("请输入第%d条边的权值大小:",k);
scanf("%d",&ch3);
for(i=1;ch1!=G.vexs[i];i++);
for(j=1;ch2!=G.vexs[j];j++);
e[p].vexh=i;
e[p].vext=j;
e[p].weight=G.edges[i][j].w=ch3; //权值
e[p].flag=0;
p++;
}
return G;
}
/*************************克鲁斯卡尔最小生成树*************************/
void minitree_KRUSKAL(MGraph *G)
{
int i,min,j,k;
VEX t[M];
for(i=1;i<=G->n;i++)
{
t[i].data=G->vexs[i];
t[i].jihe=i;
}
i=1;
while (i<G->n)
{
min=MaxVertexNum;
for (j=0;j<G->e;j++)
{
if (e[j].weight<min&&e[j].flag==0)
{
min=e[j].weight;
k=j;
}
}
if (t[e[k].vexh].jihe!=t[e[k].vext].jihe)
{
e[k].flag=1;
for (j=1;j<=G->n;j++)
if (t[j].jihe==t[e[k].vext].jihe)
t[j].jihe=t[e[k].vexh].jihe;
t[e[k].vext].jihe=t[e[k].vexh].jihe;
i++;
}
else e[k].flag=2;
}
printf("克鲁斯卡尔最小生成树:\n");
for (i=0;i<G->e;i++)
if (e[i].flag==1)
printf("(%d,%d) %d\n",e[i].vexh,e[i].vext,e[i].weight);//输出最小生成树
}

/****************************主函数调用**********************************/
int main()
{
MGraph G;
printf("\n");
printf("**********************************************************\n");
printf("*** 克鲁斯卡尔算法求图的最小生成树 ***\n");
printf("**********************************************************\n");
G=CreateMGraph(); //建立该图的邻接矩阵
minitree_KRUSKAL(&G); //克鲁斯卡尔算法最小生成树
return 0;
}
...全文
1095 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-06-15
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 百度搜相关关键字。
qq_41434893 2018-06-14
  • 打赏
  • 举报
回复
真的很着急,有大神科知道怎么回事的话,加我微信:15511986910
qq_41434893 2018-06-14
  • 打赏
  • 举报
回复
问题大概在这里

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧