2 qq 33166758 qq_33166758 于 2016.03.14 21:40 提问

为什么第一个程序不能正常运行

/*******************************************************************************************/
//c语言关键路径第一种
#include
#include

typedef struct arcnode
{
    int adjvex;   //活动末端
    struct arcnode *nextarc;
    double info;    //活动持续时间
}arcnode;

typedef struct vnode
{
    int data;     //事件名
    arcnode *firstarc;
    int du;    //入度
}vnode;

typedef struct
{
    int vexnum;
    int actnum;
    vnode *program;
}AOE;

//建立AOE网
void create(AOE T)
{
    int i,start,end;
    double time;
    arcnode p;
    T.program=(vnode *)malloc(T.vexnum*sizeof(vnode));
    if(!T.program)
        exit(0);
    for(i=0;i<T.vexnum;i++)
    {
        T.program[i].data=i;
        T.program[i].du=0;
        T.program[i].firstarc=NULL;
    }
    printf("该项目的开始到结束在图中的点的输入 i,j,info ");
    printf("如:4,5,9回车表示第四节点到第五节点之间的活动用了9个单位时间 ");
    for(i=0;i<T.actnum;i++)
    {
        scanf("%d,%d,%lf",&start,&end,&time);
        p=(arcnode
)malloc(sizeof(arcnode));
        p->adjvex=end-1;
        T.program[end-1].du++;
        p->info=time;
        p->nextarc=T.program[start-1].firstarc;
        T.program[start-1].firstarc=p;
    }
}

//找关键路径
void crtical_activity(AOE T)
{
    int stack=(int)malloc((T.vexnum+1)*sizeof(int));
    double ve=(double)malloc(T.vexnum*sizeof(double));   //储存事件最早发生时间
    double vl=(double)malloc(T.vexnum*sizeof(double)) ;    //储存事件最晚发生时间
    double e=(double)malloc(T.actnum*sizeof(double));      //存储活动最早发生时间
    double l=(double)malloc(T.actnum*sizeof(double));      //储存活动最晚发生时间
    int i,j,k,top=0,bottom=0;
    arcnode *p;
    double sumtime=0.0;
    for(i=0;i     {
        if(T.program[i].du==0)
        {
            stack[top++]=i;
        }
    }
    while(top!=bottom)
    {
        i=stack[bottom++];
        p=T.program[i].firstarc;
        while(p)
        {
            k=p->adjvex;
            T.program[k].du--;
            if(T.program[k].du==0)
            {
                stack[top++]=k;
            }
            if(ve[k]info)
            {
                ve[k]=ve[i]+p->info;
            }
            p=p->nextarc;
        }
    }
    sumtime=ve[T.vexnum-1];
    for(i=0;i     {
        vl[i]=ve[T.vexnum-1];
    }
    for(i=T.vexnum;i>=0;i--)
    {
        int k=stack[i];
        p=T.program[k].firstarc;
        while(p)
        {
            j=p->adjvex;
            if(vl[j]-p->info             {
                vl[k]=vl[j]-p->info;
            }
            p=p->nextarc;
        }
    }
    printf("|起点|终点|最早开始时间|最迟开始时间|差|判断| ");
    i=0;
    for(j=0;j     {
        p=T.program[j].firstarc;
        while(p)
        {
            int k=p->adjvex;
            e[++i]=ve[j];
            l[i]=vl[k]-p->info;
            printf("|%4d|%4d|%lf|%lf|%lf|",T.program[j].data+1,T.program[k].data+1,e[i],l[i],l[i]-e[i]);
            if(l[i]==e[i])
            {
                printf("关键活动| ");
            }
            printf(" ");
            p=p->nextarc;
        }
    }
    printf("整个工程所用的最短时间为: %lf个单位时间 ",sumtime);
}

int  main()
{
    AOE t;
    printf("请输入AOE网的事件个数:  ");
    scanf("%d",&t.vexnum);
    printf("请输入AOE网的活动个数:  ");
    scanf("%d",&t.actnum);
    create(t);
    crtical_activity(t);
    return 0;
}

/****************************************************************************************************/
//第二种
/*
#include "stdio.h"
#include "stdlib.h"
#define MAX 50
typedef struct ArcNode
{
int adjvex;
int info;//权值
struct ArcNode *nextarc;
}ArcNode;

typedef struct Vnode
{
char data;
int inDegree;
ArcNode *link;
}Vnode,AdjList[MAX+1];

typedef struct
{
AdjList vertices;
int vexnum;
int arcnum;
}ALGraph;

void CreateGraph(ALGraph &G)
{
int i,j,s,d,w;
ArcNode p;
ArcNode *t;
for(i=0;i<G.vexnum;i++)
{
getchar();
printf("第%d个结点信息(char)型:",i);
scanf("%c",&G.vertices[i].data);
G.vertices[i].inDegree=0;
G.vertices[i].link=NULL;
}
for(i=0;i<G.arcnum;i++)
{
printf("第%d条边----起点序号,终点序号,权值:",i);
scanf("%d %d %d",&s,&d,&w);
p=(ArcNode
)malloc(sizeof(ArcNode));
p->adjvex=d;
p->info=w;
p->nextarc=G.vertices[s].link;
G.vertices[s].link=p;
}
for(i=0;i {
int counter=0;
for(j=0;j {
if (j!=i)
{
t=G.vertices[j].link;
while (t)
{
if (t->adjvex==i)
{
counter++;

}
t=t->nextarc;
}
}
}
G.vertices[i].inDegree=counter;
}
}

void OutputGraph(ALGraph &G)
{
int i;
ArcNode *p;
printf("遍历图的结果如下: ");
for(i=0;i {
printf("[%c(%d)]",G.vertices[i].data,G.vertices[i].inDegree);
p=G.vertices[i].link;
while (p!=NULL)
{
printf("---->%d",p->adjvex);
p=p->nextarc;
}
printf(" ");
}
}

int ve[MAX+1]={0};
int stack2[MAX+1];
int top2=0;

void TopologicalOrder(ALGraph &G)
{
int stack[MAX+1];

ArcNode *p;
int i,top=0,k;
for(i=0;i if (G.vertices[i].inDegree==0)
{
stack[top++]=i;
}
int count=0;
while (top>0)
{
i=stack[--top];
stack2[top2++]=i;
//printf("(%d,%c)",i,G.vertices[i].data);
++count;
for(p=G.vertices[i].link;p;p=p->nextarc)
{
k=p->adjvex;
if (--G.vertices[k].inDegree==0)
{
stack[top++]=k;
}
if ((ve[i]+p->info)>ve[k])
{
ve[k]=ve[i]+p->info;
}
}
}
if (count<G.vexnum)
{
printf("网中有环!");
}
}

void CriticalPath(ALGraph G)
{
TopologicalOrder(G);
int vl[MAX+1];
int j;
ArcNode* p;
int k,dut,ee,el;
char tag;
for(int i=0;i {
vl[i]=ve[G.vexnum-1];
}
while (top2>0)
{
j=stack2[--top2];
for(p=G.vertices[j].link;p;p=p->nextarc)
{
k=p->adjvex;
dut=p->info;
if (vl[k]-dut {
vl[j]=vl[k]-dut;
}
}
}
for(j=0;j for(p=G.vertices[j].link;p;p=p->nextarc)
{
k=p->adjvex;
dut=p->info;
ee=ve[j];
el=vl[k]-dut;
tag=(ee==el)?'*':' ';
printf("活动%d--->%d权值:%d 最早开始时间%d 最晚开始时间%d 是否关键活动:%c ",j,k,dut,ee,el,tag);
}
}

int  main()
{
ALGraph G;
printf("输入节点数和边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);

CreateGraph(G);
TopologicalOrder(G);
CriticalPath(G);
return 0;
}

*/

1个回答

devmiao
devmiao   Ds   Rxr 2016.03.14 22:51

代码太长了,建议自己调试下看看

qq_33166758
qq_33166758 不不行
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!