| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 526 人关注过本帖
标题:问一个关于有向图及无向图的问题?
只看楼主 加入收藏
hehewei
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2009-12-24
结帖率:90%
收藏
已结贴  问题点数:70 回复次数:2 
问一个关于有向图及无向图的问题?
#include <stdio.h>
#include <malloc.h>
#define VERTEX_MAX 30   /*最大顶点数*/
#define MAXSIZE 20

void creat_MGraph1();
void creat_MGraph2();
void CreateALGraph1();
void CreateALGraph2();
void printMG();
void printALG();


/*============以下为邻接矩阵的结构描述============*/
typedef char Vextype[3];  /*顶点类型*/
typedef struct
{
   Vextype vexs[VERTEX_MAX];   /*顶点信息*/
    int arcs[VERTEX_MAX][VERTEX_MAX];       /*邻接矩阵存储 */
    int vexnum,arcnum;    /*顶点数、边数*/
} MGraph;

/*=============以下为邻接表的结构描述============*/
typedef struct node       /*边结点定义*/
 {  int  adjvex;    /*邻接点域*/
    struct node  *next; /*指向下一个边结点的指针域*/
  }EdgeNode;

typedef struct vnode   /*表头结点定义*/
 { Vextype  vertex;   /*顶点信息*/
   EdgeNode   *firstedge;
  }VertexNode;

typedef struct  /*图的邻接表存储*/
 { VertexNode adjlist[VERTEX_MAX];
   int n,e;      /*顶点数和边数*/
 } ALGraph;

/*============以下为创建无向图的邻接矩阵过程=========*/
void creat_MGraph1(MGraph *g)
{   int i,j,k;      
    int n,m;         
    printf("请输入顶点数vex和边数arc:");    /*输入顶点数n和边数m*/
    scanf("%d,%d",&n,&m);
    g->vexnum=n;
    g->arcnum=m;
    printf("请输入顶点信息:");  /*输入顶点信息,如V0,V1等*/
    for (i=0;i<n;i++)
       scanf("%s",g->vexs[i]);  
    for (i=0;i<n;i++)        /*初始化邻接矩阵*/
      for (j=0;j<n;j++)
         g->arcs[i][j]=0;
    printf("请输入两个顶点间的边edge(i,j)\n");
    for (k=0;k<m;k++)        /*根据边的顶点对邻接矩阵进行赋值*/
    {
        scanf("%d,%d",&i,&j);
        g->arcs[i][j]=1;
        g->arcs[j][i]=1;
    }
}
/*============以下为创建有向图的邻接矩阵过程=========*/
void creat_MGraph2(MGraph *g)
{
    int i,j,k;      
    int n,m;         
    printf("请输入顶点数vex和边数arc:");    /*输入顶点数n和边数m*/
    scanf("%d,%d",&n,&m);
    g->vexnum=n;
    g->arcnum=m;
    printf("请输入顶点信息:");  /*输入顶点信息,如V0,V1等*/
    for (i=0;i<n;i++)
      scanf("%s",g->vexs[i]);  
    for (i=0;i<n;i++)        /*初始化邻接矩阵*/
      for (j=0;j<n;j++)
         g->arcs[i][j]=0;
    printf("请输入两个顶点间的边edge(i,j)\n");
    for (k=0;k<m;k++)        /*根据弧的顶点对邻接矩阵进行赋值*/
    {
        scanf("%d,%d",&i,&j);
        g->arcs[i][j]=1;
    }
    printf("创建成功!\n");
}
/*============以下为创建无向图的邻接表过程=========*/
void CreateALGraph1(ALGraph *G)
{  int i,j,k;
   EdgeNode * s,*t;
   printf("请输入顶点数vex和边数arc:");    /*输入顶点数n和边数m*/
   scanf("%d,%d",&(G->n),&(G->e));
   printf("请输入顶点信息:");   /*输入顶点信息,如V0,V1等*/
   for (i=0;i<G->n;i++)
   { scanf("%s",&(G->adjlist[i].vertex));
     G->adjlist[i].firstedge=NULL;        }
     printf("请输入两个顶点间的边edge(i,j)\n");  /*请输入边的信息*/
     for (k=0;k<G->e;k++) /*建立边表*/
      { scanf("%d,%d",&i,&j);
        s=(EdgeNode*)malloc(sizeof(EdgeNode));
       s->adjvex=j;
       t=(EdgeNode*)malloc(sizeof(EdgeNode));
       t->adjvex=i;
       s->next=G->adjlist[i].firstedge;  
         /*前插方法,将边结点s插入到头结点为G->adjlist[i]的单链表中*/
       G->adjlist[i].firstedge=s;
       t->next=G->adjlist[j].firstedge;   
       /*前插方法,将边结点t插入到头结点为G->adjlist[j]的单链表中*/
      G->adjlist[j].firstedge=t;
     }
  }/*CreateALGraph1*/
/*============以下为创建有向图的邻接表过程=========*/
void CreateALGraph2(ALGraph *G)
{ int i,j,k;
  EdgeNode * s;
  printf("请输入定点数vex和边数arc:");    /*输入顶点数n和边数m*/
  scanf("%d,%d",&(G->n),&(G->e));
  printf("请输入顶点信息:");  /*输入顶点信息,如V0,V1等*/
  for (i=0;i<G->n;i++)
   { scanf("%s",&(G->adjlist[i].vertex));
     G->adjlist[i].firstedge=NULL;
    }
  printf("请输入两个顶点间的弧edge<i,j>\n");  /*请输入弧的信息*/
  for (k=0;k<G->e;k++)     /*建立边表*/
  { scanf("%d,%d",&i,&j);
    s=(EdgeNode*)malloc(sizeof(EdgeNode));
    s->adjvex=j;
    s->next=G->adjlist[i].firstedge;    /*前插方法*/
    G->adjlist[i].firstedge=s;
   }
}/*CreateALGraph*/
void printMG(MGraph *g)    /*输出邻接矩阵*/
{
  int i,j;
  for (i=0;i<g->vexnum;i++)
  {for (j=0;j<g->vexnum;j++)
     printf(" %d",g->arcs[i][j]);
   printf("\n");
   }
}
void printALG(ALGraph *g)    /*输出邻接表*/
{
  int i;
  EdgeNode *p;
  for (i=0;i<g->n;i++)
 { printf("%s",g->adjlist[i].vertex);
   p=g->adjlist[i].firstedge;
   while (p)
   {
     printf("->%d",p->adjvex);
     p=p->next;
   }
   printf("\n");
   }
}


void main()
{   
    MGraph *L;
    ALGraph *A;
   
    creat_MGraph1(&L);
    CreateALGraph1(&L);
    printMG(&L);
   
    creat_MGraph2(&A);
   
    CreateALGraph2(&A);
   
    printALG(&A);
   
}

运行后出现
图片附件: 游客没有浏览图片的权限,请 登录注册
,这是什么原因呢?


搜索更多相关主题的帖子: include 
2011-01-04 23:04
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:40 
程序代码:
#include <stdio.h>
#include <malloc.h>

#define VERTEX_MAX 30   /*最大顶点数*/
#define MAXSIZE 20

void creat_MGraph1();
void creat_MGraph2();
void CreateALGraph1();
void CreateALGraph2();
void printMG();
void printALG();


/*============以下为邻接矩阵的结构描述============*/
typedef char Vextype[3];  /*顶点类型*/
typedef struct
{
    Vextype vexs[VERTEX_MAX];   /*顶点信息*/
    int arcs[VERTEX_MAX][VERTEX_MAX];       /*邻接矩阵存储 */
    int vexnum,arcnum;    /*顶点数、边数*/
} MGraph;

/*=============以下为邻接表的结构描述============*/
typedef struct node       /*边结点定义*/
{ 
    int  adjvex;    /*邻接点域*/
    struct node  *next; /*指向下一个边结点的指针域*/
}EdgeNode;

typedef struct vnode   /*表头结点定义*/
{
    Vextype  vertex;   /*顶点信息*/
    EdgeNode   *firstedge;
}VertexNode;

typedef struct  /*图的邻接表存储*/
{
    VertexNode adjlist[VERTEX_MAX];
    int n,e;      /*顶点数和边数*/
}ALGraph;

/*============以下为创建无向图的邻接矩阵过程=========*/
void creat_MGraph1(MGraph **g)
{
    (*g) = (MGraph*) malloc (sizeof(MGraph));

    int i,j,k;     
    int n,m;        
    printf("请输入顶点数vex和边数arc:");    /*输入顶点数n和边数m*/
    scanf("%d,%d",&n,&m);
    (*g)->vexnum=n;
    (*g)->arcnum=m;
    printf("请输入顶点信息:");  /*输入顶点信息,如V0,V1等*/
    for (i=0;i<n;i++)
       scanf("%s",(*g)->vexs[i]); 
    for (i=0; i<n; i++)        /*初始化邻接矩阵*/
        for (j=0; j<n; j++)
            (*g)->arcs[i][j] = 0;
    printf("请输入两个顶点间的边edge(i,j)\n");
    for (k=0; k<m; k++)        /*根据边的顶点对邻接矩阵进行赋值*/
    {
        scanf("%d,%d",&i,&j);
        (*g)->arcs[i][j]=1;
        (*g)->arcs[j][i]=1;
    }
}
/*============以下为创建有向图的邻接矩阵过程=========*/
void creat_MGraph2(MGraph **g)
{
    (*g) = (MGraph*) malloc (sizeof(MGraph));

    int i,j,k;     
    int n,m;        
    printf("请输入顶点数vex和边数arc:");    /*输入顶点数n和边数m*/
    scanf("%d,%d",&n,&m);
    (*g)->vexnum=n;
    (*g)->arcnum=m;
    printf("请输入顶点信息:");  /*输入顶点信息,如V0,V1等*/
    for (i=0;i<n;i++)
      scanf("%s",(*g)->vexs[i]); 
    for (i=0;i<n;i++)        /*初始化邻接矩阵*/
      for (j=0;j<n;j++)
         (*g)->arcs[i][j]=0;
    printf("请输入两个顶点间的边edge(i,j)\n");
    for (k=0;k<m;k++)        /*根据弧的顶点对邻接矩阵进行赋值*/
    {
        scanf("%d,%d",&i,&j);
        (*g)->arcs[i][j]=1;
    }
    printf("创建成功!\n");
}
/*============以下为创建无向图的邻接表过程=========*/
void CreateALGraph1(ALGraph **G)
{ 
    (*G) = (ALGraph*) malloc (sizeof(ALGraph));

    int i,j,k;
    EdgeNode * s,*t;
    printf("请输入顶点数vex和边数arc:");    /*输入顶点数n和边数m*/
    scanf("%d,%d",&((*G)->n),&((*G)->e));
    printf("请输入顶点信息:");   /*输入顶点信息,如V0,V1等*/
    for (i=0;i<(*G)->n;i++)
    {
        scanf("%s",&((*G)->adjlist[i].vertex));
        (*G)->adjlist[i].firstedge=NULL;       
    }
    printf("请输入两个顶点间的边edge(i,j)\n");  /*请输入边的信息*/
    for (k=0;k<(*G)->e;k++) /*建立边表*/
    {
        scanf("%d,%d",&i,&j);
        s=(EdgeNode*)malloc(sizeof(EdgeNode));
        s->adjvex=j;
        t=(EdgeNode*)malloc(sizeof(EdgeNode));
        t->adjvex=i;
        s->next=(*G)->adjlist[i].firstedge; 
        /*前插方法,将边结点s插入到头结点为G->adjlist[i]的单链表中*/
        (*G)->adjlist[i].firstedge=s;
        t->next=(*G)->adjlist[j].firstedge;   
       /*前插方法,将边结点t插入到头结点为G->adjlist[j]的单链表中*/
        (*G)->adjlist[j].firstedge=t;
    }
}/*CreateALGraph1*/

/*============以下为创建有向图的邻接表过程=========*/
void CreateALGraph2(ALGraph **G)
{
    (*G) = (ALGraph*) malloc (sizeof(ALGraph));

    int i,j,k;
    EdgeNode * s;
    printf("请输入定点数vex和边数arc:");    /*输入顶点数n和边数m*/
    scanf("%d,%d",&((*G)->n),&((*G)->e));
    printf("请输入顶点信息:");  /*输入顶点信息,如V0,V1等*/
    for (i=0;i<(*G)->n;i++)
    {
        scanf("%s",&((*G)->adjlist[i].vertex));
        (*G)->adjlist[i].firstedge=NULL;
    }
    printf("请输入两个顶点间的弧edge<i,j>\n");  /*请输入弧的信息*/
    for (k=0;k<(*G)->e;k++)     /*建立边表*/
    {
        scanf("%d,%d",&i,&j);
        s=(EdgeNode*)malloc(sizeof(EdgeNode));
        s->adjvex=j;
        s->next=(*G)->adjlist[i].firstedge;    /*前插方法*/
        (*G)->adjlist[i].firstedge=s;
   }
}/*CreateALGraph*/

void printMG(MGraph *g)    /*输出邻接矩阵*/
{
    int i,j;
    for (i=0;i<g->vexnum;i++)
    {
        for (j=0;j<g->vexnum;j++)
            printf(" %d",g->arcs[i][j]);
        printf("\n");
   }
}
void printALG(ALGraph *g)    /*输出邻接表*/
{
    int i;
    EdgeNode *p;
    for (i=0;i<g->n;i++)
    {
        printf("%s",g->adjlist[i].vertex);
        p=g->adjlist[i].firstedge;
        while (p)
        {
            printf("->%d",p->adjvex);
            p=p->next;
        }
        printf("\n");
    }
}


void main()
{   
    MGraph *L = NULL;
    ALGraph *A = NULL;
   
    creat_MGraph1(&L);
  //  CreateALGraph1(&L);
   //printMG(&L);
    printMG(L);
   
   // creat_MGraph2(&A);
   
    CreateALGraph2(&A);
   
    printALG(A);
}

图片附件: 游客没有浏览图片的权限,请 登录注册
2011-01-05 12:43
aaronhexin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:199
注 册:2010-12-6
收藏
得分:30 
首先,你在主函数中调用函数时,出现类型不匹配错误,MGraph和ALGraph之间弄混了。
其次,在创建函数中,没有分配存储空间,
在每个函数的前面要加上g = (MGraph *)malloc(sizeof(MGraph)); 或者
G = (ALGraph *)malloc(sizeof(ALGraph));
2011-01-05 13:12
快速回复:问一个关于有向图及无向图的问题?
数据加载中...
 
   



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

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