回 帖 发 新 帖 刷新版面

主题:用邻接矩阵表示图

//***以下是用邻接矩阵表示图******
#define N 100  //图的顶点数
#define E 100 //图的边数
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef char vextype; //顶点的数据类型
typedef float adjtype; //权值类型
typedef struct
{
     vextype vexs[N]; //顶点
     adjtype arcs[N][N]; //权值
  
}graph;
void creatgraph(graph *ga,int n,int e); //建立无向网络
main()
{
    graph *ga;
    int i,j,n,e; //n是图的顶点数,e是图的边数
    ga=(graph *)malloc(sizeof(graph));
    printf("请输的顶点数和边数:");
    scanf("%d %d",&n,&e);
    creatgraph(ga,n,e);
    printf("输出无向网络的顶点:");
    for(i=0;i<=n;i++)
      printf("v%c ",ga->vexs[i]);
    printf("\n");
    printf("图的路径形成的情况:\n");
    for(i=1;i<=n;i++)
        {
          for(j=1;j<=n;j++)
              printf("%-2.0f",ga->arcs[i][j]);
          printf("\n");
        }
            

}
void creatgraph(graph *ga,int n,int e) //建立无向网络
{
    int i,j,k;
    float w;
    printf("请按顺序输入%d个顶点(按下标输入):",n);
    for(i=0;i<=n;i++)
        scanf("%c",&ga->vexs[i]); //读入顶点信息,建立顶点表
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            ga->arcs[i][j]=0; //邻接矩阵初始化
    for(k=0;k<e;k++)
        {
          printf("请输入第%d条的起点、终点和权:",k+1);
          scanf("%d %d %f",&i,&j,&w); //读入边(vi,vj)上的权w
          ga->arcs[i][j]=w;
          ga->arcs[j][i]=w; //有向图和无向图的区别
        }
}
//***以上是用邻接矩阵表示图******
[em9][em9][em9][em9][em9][em18][em18][em18][em18][em20][em20][em1][em1][em1][em1][em1][em1]

回复列表 (共8个回复)

沙发

读入顶点信息,建立顶点表
时,你是否回按回车键?

板凳

"读入边(vi,vj)上的权w"
时,输入的是数字,而在
  "读入顶点信息,建立顶点表"
时你是用的字符.这里就有了矛盾.

3 楼

" printf("请按顺序输入%d个顶点(按下标输入):",n);
    for(i=0;i<=n;i++)
        scanf("%c",&ga->vexs[i]); //读入顶点信息,建立顶点表"
时,要么i=1,要么i<n.进行循环.

4 楼

我个人觉得
" for(k=0;k<e;k++)
        {
          printf("请输入第%d条的起点、终点和权:",k+1);
          scanf("%d %d %f",&i,&j,&w); //读入边(vi,vj)上的权w
          ga->arcs[i][j]=w;
          ga->arcs[j][i]=w; //有向图和无向图的区别
        }"
应改为
"char i,j;"再定义:"int n,m,t;"

"for(k=0;k<e;k++)
{printf("请输入(A--通--B)的两个顶点及权值W:\n");
printf("NO.%d\n",e+1);
scanf("%c  %c  %f",&i,&j,&w); 
for(t=1;t<=e;t++)
{if(ga->vexs[t]==i)
n=t;
if(ga->vexs[t]==j)
m=t;
 ga->arcs[n][m]=w;
          ga->arcs[n][m]=w;
}
 
}




5 楼

对不起!上面应改为:
for(t=0;t<e;t++)
......
n=t+1;
......
m=t+1;
.....

6 楼

有,也可以让它自动输入啊:
  printf("请按顺序输入%d个顶点(按下标输入):",n);
    for(i=0;i<=n;i++)
        scanf("%c",&ga->vexs[i]); //读入顶点信息,建立顶点表
改为:
  for(i=0;i<n;i++)
        ga->vexs[i]=char(i+1);
[em13][em13][em13][em13][em13][em13][em7][em7][em7][em9][em9][em9][em15][em16][em16][em16][em16][em16][em16][em16][em16][em16]

7 楼

顶点和权是两回事啊,两者数据类型可以不同啊
[em1][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1][em16][em16][em16][em16][em16][em16][em16][em16][em16][em16][em16][em16]

8 楼

你看看吧!
#define max 100
#include "malloc.h"
 typedef struct
{char dd[max];
int w[max][max];
int bs;
int dds;
}g;
g *creat2(void)
{g *mg;
int i,j,a,b,c,v1,v2,v3;
char aa,w1,w2;
mg=(g *)malloc(sizeof(g));
    printf("请输入顶点数和边数:\n");
    
scanf("%d%d",&mg->dds,&mg->bs);
printf("请输入各个顶点:(为一个字符)\n");
for(b=0;b<mg->dds;b++)
{printf("NO.%d\n",b+1);
        
   scanf("%c",&aa);
    scanf("%c",&mg->dd[b]);
    }
for(i=0;i<mg->dds;i++)
    for(j=0;j<mg->dds;j++)
        mg->w[i][j]=0;
    for(a=0;a<mg->bs;a++)
    {printf("请输入A-到-B的权值w(注:总共要输入3个.):\n");
    scanf("%c",&aa);
    scanf("%c",&w1);
    printf("\n到\n");
    scanf("%c",&aa);
    scanf("%c",&w2);
    printf("\n权值:\n");
    scanf("%c",&aa);
    scanf("%d",&v3);
    for(c=0;c<mg->dds;c++)
    {if(w1==mg->dd[c])
        v1=c+1;
    if(w2==mg->dd[c])
        v2=c+1;
    }
    mg->w[v1-1][v2-1]=v3;
    }
    return(mg);
}
void print2(g *mm)
{int i,j,v1,v2;
printf("数组表示为:\n");
printf("\n");

for(i=0;i<mm->dds;i++)
    {for(j=0;j<mm->dds;j++)
        printf("%4d",mm->w[i][j]);
    printf("\n");
    }
    printf("\n");
    printf("其它信息为:\n");
    printf("\t总共有顶点:      %d\n",mm->dds);
    printf("\t总共有边:      %d\n",mm->bs);
    printf("\t相通的顶点为:\n");
for(v1=0;v1<mm->dds;v1++)
    for(v2=0;v2<mm->dds;v2++)
if(mm->w[v1][v2]!=0)
    printf("\n\t%c---到---%c\n",mm->dd[v1],mm->dd[v2]);
        }


g *creat1(void)
{g *mg;
int i,j,a,b,c,v1,v2,v3;
char aa,w1,w2;
mg=(g *)malloc(sizeof(g));
    printf("请输入顶点数和边数:\n");
    
scanf("%d%d",&mg->dds,&mg->bs);
printf("请输入各个顶点:(为字符)\n");
for(b=0;b<mg->dds;b++)
{printf("NO.%d\n",b+1);
        
   scanf("%c",&aa);
    scanf("%c",&mg->dd[b]);
    }
for(i=0;i<mg->dds;i++)
    for(j=0;j<mg->dds;j++)
        mg->w[i][j]=0;
    for(a=0;a<mg->bs;a++)
    {printf("请输入A-连-B的权值w(注:总共要输入3个.):\n");
    scanf("%c",&aa);
    scanf("%c",&w1);
    printf("\n通\n");
    scanf("%c",&aa);
    scanf("%c",&w2);
    printf("\n权值:\n");
    scanf("%c",&aa);
    scanf("%d",&v3);
    for(c=0;c<mg->dds;c++)
    {if(w1==mg->dd[c])
        v1=c+1;
    if(w2==mg->dd[c])
        v2=c+1;
    }
    mg->w[v1-1][v2-1]=v3;
    mg->w[v2-1][v1-1]=v3;
    }
return(mg);
}
void print1(g *mm)
{int i,j,v1,v2;
printf("\n");
printf("\n");
printf("\n");
printf("数组表示为:\n");
printf("\n");

for(i=0;i<mm->dds;i++)
    {for(j=0;j<mm->dds;j++)
        printf("%4d",mm->w[i][j]);
    printf("\n");
    }
    printf("\n");
    printf("\t其它信息为:\n");
    printf("\t总共有顶点:      %d\n",mm->dds);
    printf("\t总共有边:      %d\n",mm->bs);
printf("\t相通的顶点为:\n");
for(v1=0;v1<mm->dds;v1++)
    for(v2=0;v2<mm->dds;v2++)
        if(mm->w[v1][v2]!=0&&v1>=v2)
            printf("\t%c---通---%c\n",mm->dd[v1],mm->dd[v2]);
        }
main()
{g *m,*n;
int fag,i;
do{
printf("\n");
printf("\t=====================\n");
printf("\t1----------建立有向图.\n");
printf("\t2----------输出有向图.\n");
printf("\t3----------建立无向图.\n");
printf("\t4----------输出无向图.\n");
printf("\t0----------退出.\n");
printf("\t=====================\n");
printf("\n");
printf("请选择:\n");
scanf("%d",&i);
switch(i)
{case 0:fag=0;break;
case 1:m=creat2();break;
case 2:print2(m);break;
case 3:n=creat1();break;
case 4:print1(n);break;
defult :printf("ERROR\n");
    }
}while(fag);

}

我来回复

您尚未登录,请登录后再回复。点此登录或注册