| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 529 人关注过本帖
标题:【求助,非常急!】【代码检错不出错,但程序不能运行】
只看楼主 加入收藏
gujunpu
Rank: 1
等 级:新手上路
帖 子:23
专家分:3
注 册:2012-2-25
结帖率:60%
收藏
已结贴  问题点数:10 回复次数:4 
【求助,非常急!】【代码检错不出错,但程序不能运行】
#define MaxVertices 1000
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "CreatAdjLGraph.h"
void main()
{
 AdjLGraph *G;
 AdjInitiate(G);
 int n,c;
 printf("修道士与野人各有n人,请输入n:\n");
 scanf("%d",&n);
 printf("船只可容纳c人,请输入c:\n");
 scanf("%d",&c);
 CreatGraph(G, n,c);
}


//头文件

typedef struct  
{int mon;                //修道士人数
 int sav;                //野人人数
 int pos;                //船的位置
}DataType;                //定义Data结构体类型(三元组)

typedef struct Node
{
    int dest;
    struct Node *next;
} Edge;                    //邻接边单链表结构体

typedef struct
{
    DataType data;
    int sorce;
    Edge *adj;
} AdjLHeight;            //邻接表数组的结构体

typedef struct
{
    AdjLHeight a[MaxVertices];
    int numOfVerts;
    int numOfEdges;
} AdjLGraph;            //邻接表结构体


void CreatData(int n,DataType* pos1,DataType* pos0)//创建所有有保险的Data(三元组)
{
    int a=n,b=0;//n来源于人数
    int i=0;
  while(a<=b)
  {
   pos1[i].mon=a;
   pos1[i].sav=b;
   pos1[i].pos=1;
   pos0[i].mon=a;
   pos0[i].sav=b;
   pos0[i].pos=0;
   i++;
   a--;
   b++;
   }
  pos1[i+1].mon=-1;
  pos0[i+1].mon=-1;
}

void InsertVertex(AdjLGraph *G, int i, DataType vertex)//插入顶点的功能函数
{
    if(i >= 0 && i < MaxVertices)
    {
        G->a[i].data = vertex;                          //a[numOfVerts/2].data前是此岸顶点,后是彼岸顶点
        G->numOfVerts++;
    }
    else printf("顶点越界");
}

void CreatVertex(AdjLGraph* G,DataType* pos1,DataType* pos0)//创建所有顶点,并赋予Data
{    int i=0;//i为顶点序号
    for( ;pos1[i+1].mon=-1;i++)InsertVertex(G,i,pos1[i]);//插入此岸顶点
    for( ;pos0[i+1].mon=-1;i++)InsertVertex(G,i,pos0[i]);//插入彼岸顶点
}



//以上是创建顶点,以下是创建边


void InsertEdge(AdjLGraph *G, int v1, int v2)//插入边的功能函数
{
    Edge *p;
   
    if(v1 < 0 || v1 >= G->numOfVerts || v2 < 0 || v2 >= G->numOfVerts)
    {
        printf("参数v1或v2越界出错!");
        exit(0);
    }

    p = (Edge *)malloc(sizeof(Edge));
    p->dest = v2;

    p->next = G->a[v1].adj;
    G->a[v1].adj = p;

    G->numOfEdges++;
}


void CreatEdge(AdjLGraph *G,int c)//创建边,c为船可容纳的人数
{int i;
for(i=0;i==G->numOfVerts/2;i++)
    {
        for(int j=G->numOfVerts/2+1;j<=G->numOfVerts;j++)
        {    while((G->a[i].data.mon-G->a[j].data.mon)+(G->a[i].data.sav-G->a[j].data.sav)<=c)//船上人数不可超过限制
            {
            if((G->a[i].data.mon-G->a[j].data.mon)>=(G->a[i].data.sav-G->a[j].data.sav)||(G->a[i].data.mon-G->a[j].data.mon)==0)
            InsertEdge(G,i,j);//建立序号为i,j的顶点的边<i,j>,由此岸到彼岸的边
            }
        }
    }

for(i=G->numOfVerts/2+1;i<=G->numOfVerts;i++)
    {   
        for(int j=0;j<=G->numOfVerts/2;j++)
        {
          while((G->a[i].data.mon-G->a[j].data.mon)+(G->a[i].data.sav-G->a[j].data.sav)<=c)//船上人数不可超过限制
          {
            if((G->a[i].data.mon-G->a[j].data.mon)>=(G->a[i].data.sav-G->a[j].data.sav)||(G->a[i].data.mon-G->a[j].data.mon)==0)
            InsertEdge(G,i,j);//建立序号为i,j的顶点的边<i,j>,由彼岸到此岸的边
          }
        }

    }
}
//以上是创建边,以下是创建图
void AdjInitiate(AdjLGraph *G)//初始化图
{
    int i;

    G->numOfVerts = 0;
    G->numOfEdges = 0;
    for(i = 0; i < MaxVertices; i++)
    {
        G->a[i].sorce = i;
        G->a[i].adj = NULL;
    }
}
void CreatGraph( AdjLGraph *G, int n,int c)//创建图
{DataType pos1[500];
 DataType pos0[500];
CreatData(n,pos1,pos0);//创建数据CreatData(int n,DataType* pos1,DataType* pos0)
CreatVertex(G,pos1,pos0);//创建顶点CreatVertex(AdjLGraph* G,DataType* pos1,DataType* pos0)
CreatEdge(G,c);//创建边CreatEdge(AdjLGraph *G,int c)
}
搜索更多相关主题的帖子: void include 结构体 
2012-12-26 17:15
gujunpu
Rank: 1
等 级:新手上路
帖 子:23
专家分:3
注 册:2012-2-25
收藏
得分:0 
这个程序是没有写完的,我只是想写检测一下写好的。
2012-12-26 17:16
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:10 
程序代码:
//以上是创建边,以下是创建图
void AdjInitiate(AdjLGraph *G)//初始化图
{
    int i;

    //出错的位置在这里,AdjLGraph *G
    //G是一个未被赋值的野指针
    G->numOfVerts = 0;
    G->numOfEdges = 0;
    for(i = 0; i < MaxVertices; i++)
    {
        G->a[i].sorce = i;
        G->a[i].adj = NULL;
    }
}
2012-12-26 17:32
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:0 
程序代码:
//修改

void main()
{
    //AdjLGraph *G;

    AdjLGraph *G = new AdjLGraph;
    if(G == NULL)
    {
        return;
    }

   //...
}
2012-12-26 17:36
gujunpu
Rank: 1
等 级:新手上路
帖 子:23
专家分:3
注 册:2012-2-25
收藏
得分:0 
回复 4楼 crystall
非常感谢,想不到是这样的问题,看来自己基本功很不扎实。若是AdjLGraph G;后面的实参都写成&G也对吧。我这样改的。
2012-12-26 18:40
快速回复:【求助,非常急!】【代码检错不出错,但程序不能运行】
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016281 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved