姝隅 2021-12-05 12:43
浏览 31
已结题

这个代码有什么错误啊,我找不出来😭

输入顶点和弧后就结束了
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef struct edgenode
{ int endvex;/相邻顶点在顶点表中的下标/
int weight;/边的权值/
struct edgenode*nextedge;/链字段/
}EdgeNode,*EdgeList;/边表中的结点/
typedef struct
{ int vertex;/顶点/
EdgeList edgelist;/边表头指针/
}VexNode;/顶点表中的结点/
typedef struct{
int vexnum;
int arcnum;
VexNode *vexs;
}GraphList;

void FindInDegree(GraphList G,int indegree);
int CriticalPath(GraphList G)
{ int i,j,k,sum=0;EdgeList p;
int
ee=(int
)malloc(sizeof(int)G->vexnum);
int
le=(int
)malloc(sizeof(int)G->vexnum);
int
l=(int*)malloc(sizeof(int)G->vexnum);
int
e=(int*)malloc(sizeof(int)G->vexnum);
int
topo=(int*)malloc(sizeof(int)*G->vexnum);
if (TopoSort(G,topo)==0)
{ printf("AOE网有一个循环!\n");
getch();
return(0);
}
/求事件可能的最早发生时间/
for(i=0;ivexnum;i++)
ee[i]=0;
for(k=0;kvexnum;k++)
{ i=topo[k];
p=G->vexs[i].edgelist;
while(p!=NULL)
{ j=p->endvex;
if(ee[i]+p->weight>ee[j])
ee[j]=ee[i]+p->weight;
p=p->nextedge;
}
}
sum=ee[G->vexnum-1];/工程的最短完成时间/
for(i=0;ivexnum;i++)/求事件允许的最迟发生时间/
e[i]=ee[G->vexnum-1];
for(k=G->vexnum-2;k>=0;k--)
{ i=topo[k];
p=G->vexs[i].edgelist;
while(p!=NULL)
{ j=p->endvex;
if((le[j]-p->weight)<le[i])
le[i]=le[j]-p->weight;
p=p->nextedge;
}
}
k=0;
printf("\n关键路径:\n");
/求活动ak的最早开始时间e(k)和最晚开始时间1(k)/
printf("\n| 活动 | 最早 | 最迟 | 差 | 关键 \n");
for(i=0;ivexnum;i++)
{ p=G->vexs[i].edgelist;
while(p!=NULL)
{ j=p->endvex;
e[k]=ee[i];
l[k]=le[j]-p->weight;
printf("| <%d,%d> | %4d | %4d | %4d | ",i,j,e[k],l[k],l[k]-e[k]);
if(e[k]==l[k])
printf("关键");
printf("\n");
k++;
p=p->nextedge;
}
}
printf("\n最短时间是:%d\n", sum);
getch();
return(1);
}
void InitGraph(GraphList *G)/初始化图/
{ int i,vexnum,arcnum,weight=0;
int v1,v2;
EdgeList p;
printf("请输入顶点数和弧-->如:(x,y)\n");
scanf("%d,%d",&vexnum, &arcnum);
G->vexnum=vexnum;
G->arcnum=arcnum;
for(i=0;i<vexnum;i++)
{
G->vexs[i].vertex=i+1;
G->vexs[i].edgelist=NULL;
}
for(i=0;i<arcnum;i++)
{ printf("请输入第%d条边(例如:1,2, 10)\n",i+1);
scanf("%d,%d,%d",&v1,&v2,&weight);
if(v1>G->vexnum||v2>G->vexnum)
{
printf("您刚刚输入的结点不存在!!");
getch();
exit(0);
}
p=(EdgeList) malloc(sizeof(EdgeNode));
p->endvex=v2;
p->weight=weight;
p->nextedge=G->vexs[v1]. edgelist;
G->vexs[v1].edgelist=p;
}
}
int TopoSort(GraphList G,int ptopo)/拓扑排序/
{ EdgeList p;
int i,j,k,nodeno=0,top=-1;
int
indegree=(int
)malloc(sizeof(int)*G->vexnum);
FindInDegree(G,indegree);/indegree数组赋初值/
for(i=0;ivexnum;i++)/将入度为零的顶点人栈/
if(indegree[i]==0)
{/静态链式栈/
indegree[i]=top;
top=i;
}
while(top!=-1)
{ j=top;
top=indegree[top];/取当前栈顶元素并退栈/
ptopo[nodeno++]=j;/将该顶点输出到拓扑序列中/
p=G->vexs[j].edgelist;/取该元素边表中的第一个边结点/
while(p)
{ k=p->endvex;
indegree[k]--;/删除以该顶点为起点的边/
if(indegree[k]==0)
{ indegree[k]=top;/将新的入度为零的顶点入栈/
top=k;
}
p=p->nextedge;
}
}
free(indegree);
if(nodenovexnum)/AOV网中存在回路/
return(0);
else
return(1);
}

void FindInDegree(GraphListG, intindegree)/求出图中所有顶点的入度/
{ int i;
EdgeList p;
for(i=0;ivexnum;i++)
indegree[i]=0;
for(i=0;ivexnum;i++)
{ p=G->vexs[i].edgelist;
while(p)
{
++indegree[p->endvex];
p=p->nextedge;
}
}
}
void TopoSortMenu(void)
{ intptopo;
int i;
GraphList Graph=(GraphList)malloc(sizeof(GraphList));
system("cls");
InitGraph(Graph);
ptopo=(int
)malloc(sizeof(int)Graph->vexnum);
if(TopoSort(Graph,ptopo)!=0)
{ printf("\n拓扑排序结果:\n");
for(i=0;ivexnum-1;i++)
printf("v%d-->",ptopo[i]);/打印前n-1个(有-->)/
printf("v%d", ptopo[i]);/打印最后一个(没有-->)/
}
else
printf("这个AOE网有一个循环!\n");
getch();
free(ptopo);
free(Graph);
}
void CriticalMenu(void)
{ GraphList
Graph=(GraphList*)malloc(sizeof(GraphList));
system("cls");
InitGraph(Graph);
CriticalPath(Graph);
free(Graph);
}
void TopoCriticalMenu(void)
{ char ch;
while(1)
{ system("cls");
printf("1.拓扑排序\n2.关键路径\n0.退出\n");
ch=getch();
switch(ch-'0')
{ case 0:exit(0);
case 1:TopoSortMenu();break;
case 2:CriticalMenu();break;
default:system("cls");continue;
}
}
}
int main(void){
TopoCriticalMenu();
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月13日
    • 创建了问题 12月5日

    悬赏问题

    • ¥15 python天天向上类似问题,但没有清零
    • ¥30 3天&7天&&15天&销量如何统计同一行
    • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
    • ¥15 C#调用python代码(python带有库)
    • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
    • ¥15 活动选择题。最多可以参加几个项目?
    • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
    • ¥15 vs2019中数据导出问题
    • ¥20 云服务Linux系统TCP-MSS值修改?
    • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)