编译器:VS Code
语言:C语言
图(顺序存储)
无向图、有向图、无向网、有向网
#include
#include
#include
#define maxvertnum 100
typedef enum{DG,UDG,DN,UDN} graghkind;
typedef struct{
int adj;
int info;
}Edge,adjmatrix[maxvertnum][maxvertnum];
typedef struct {
char vert[maxvertnum];
adjmatrix edges;
int vertnum,edgenum;
graghkind kind;
}amgragh;
int locatevex(amgragh g,char v)
{
int k=0;
for(;k<g.vertnum;k++){
if(g.vert[k]==v){
break;
}
}
if(k>g.vertnum){
printf("没有这样的值\n");
return false;
}
return k;
}
int create_UG(amgragh &g)
{
printf("=====无向图=====\n");
printf("请输入无向图的顶点数和边数:");
scanf("%d %d",&g.vertnum,&g.edgenum);
if(g.edgenum>g.vertnum*(g.vertnum-1)/2){
int edgenum;
printf("边数<=%d\n",g.vertnum*(g.vertnum-1)/2);
printf("输入错误\n");
return false;
}
printf("请输入顶点的名称(空号隔开):");
for(int i=0;i<g.vertnum;i++){
scanf("%s",&g.vert[i]);
}
for(int i=0;i<g.vertnum;i++){
for(int j=0;j<g.vertnum;j++){
g.edges[i][j].adj=0;
g.edges[i][j].info=NULL;
}
}
char v1[40],v2[40];
int i=0,j=0;
for(int k=0;k<g.edgenum;k++){
printf("请输入弧头、弧尾:");
scanf("%s %s",v1,v2);
i=locatevex(g,*v1);
j=locatevex(g,*v2);
printf("下标=%d %d\n",i,j);
g.edges[i][j].adj=1;
g.edges[j][i].adj=1;
}
printf("无向图创建成功!!!\n");
printf("====无向图的邻接矩阵====\n");
for(int i=0;i<g.vertnum;i++){
for(int j=0;j<g.vertnum;j++){
printf("%3d",g.edges[i][j].adj);
}
printf("\n");
}
return true;
}
int create_DG(amgragh &dg)
{
printf("=====有向图=====\n");
printf("请输入有向图的顶点数和弧数:");
scanf("%d %d",&dg.vertnum,&dg.edgenum);
printf("请输入顶点的名称(空号隔开):");
for(int i=0;i<dg.vertnum;i++){
scanf("%s",&dg.vert[i]);
}
if(dg.edgenum>dg.vertnum*(dg.vertnum-1)){
int edgenum;
printf("边数<=%d\n",dg.vertnum*(dg.vertnum-1));
printf("输入错误\n");
return false;
}
for(int i=0;i<dg.vertnum;i++){
for(int j=0;j<dg.vertnum;j++){
dg.edges[i][j].adj=0;
dg.edges[i][j].info=NULL;
}
}
char head[40],tail[40];
int i=0,j=0;
for(int k=0;k<dg.edgenum;k++){
printf("请输入边邻接顶点的名称(空号隔开):");
scanf("%s %s",head,tail);
if(strlen(head)!=strlen(tail)){
printf("输入错误!!!");
return false;
}
i=locatevex(dg,*head);
j=locatevex(dg,*tail);
printf("下标=%d %d\n",i,j);
dg.edges[i][j].adj=1;
}
printf("无向图创建成功!!!\n");
printf("====无向图的邻接矩阵====\n");
for(int i=0;i<dg.vertnum;i++){
for(int j=0;j<dg.vertnum;j++){
printf("%3d",dg.edges[i][j].adj);
}
printf("\n");
}
return true;
}
int create_UDN(amgragh &g)
{
printf("=====无向网=====\n");
printf("请输入无向网的顶点数和边数:");
scanf("%d %d",&g.vertnum,&g.edgenum);
if(g.edgenum>g.vertnum*(g.vertnum-1)/2){
int edgenum;
printf("边数<=%d\n",g.vertnum*(g.vertnum-1)/2);
printf("输入错误\n");
return false;
}
for(int i=0;i<g.vertnum;i++){
for(int j=0;j<g.vertnum;j++){
g.edges[i][j].adj=0;
g.edges[i][j].info=1000;
}
}
printf("请输入顶点的名称(空号隔开):");
for(int i=0;i<g.vertnum;i++){
scanf("%s",&g.vert[i]);
}
char v1[40],v2[40];
int w;
for(int k=0;k<g.edgenum;k++){
printf("请输入边邻接顶点的名称、弧长的信息(空号隔开):");
scanf("%s %s %d",v1,v2,&w);
int i=locatevex(g,*v1);
int j=locatevex(g,*v2);
printf("下标=%d %d\n",i,j);
g.edges[i][j].info=w;
g.edges[j][i].info=w;
}
for(int i=0;i<g.edgenum;i++){
for(int j=0;j<g.edgenum;j++){
printf("%6d",g.edges[i][j].info);
}
printf("\n");
}
}
int create_DN(amgragh &dg)
{
printf("=====有向网=====\n");
printf("请输入有向网的顶点数和弧数:");
scanf("%d %d",&dg.vertnum,&dg.edgenum);
if(dg.edgenum>dg.vertnum*(dg.vertnum-1)){
int edgenum;
printf("边数<=%d\n",dg.vertnum*(dg.vertnum-1));
printf("输入错误\n");
return false;
}
printf("请依次输入顶点的名称:");
for(int i=0;i<dg.vertnum;i++){
scanf("%s",&dg.vert[i]);
}
for(int i=0;i<dg.vertnum;i++){
for(int j=0;j<dg.vertnum;j++){
dg.edges[i][j].adj=0;
dg.edges[i][j].info=1000;
}
}
char head[40],tail[40];
int w;
for(int k=0;k<dg.edgenum;k++){
printf("请输入弧头、弧尾、弧的信息(空号隔开):");
scanf("%s %s %d",head,tail,&w);
if(strlen(head)!=strlen(tail)){
printf("输入错误!!!");
return false;
}
int i=locatevex(dg,*head);
int j=locatevex(dg,*tail);
printf("下标=%d %d\n",i,j);
dg.edges[i][j].info=w;
}
printf("有向网创建成功!!!\n");
printf("====有向网的邻接矩阵====\n");
for(int i=0;i<dg.vertnum;i++){
for(int j=0;j<dg.vertnum;j++){
printf("%6d",dg.edges[i][j].info);
}
printf("\n");
}
return true;
}
int creategragh(amgragh &g)
{
int expression;
printf("0.退出\n1.UDG\n2.DG\n3.UDN\n4.DN\n");
printf("请选择:");
scanf("%d",&expression);
switch (expression)
{
case 1:{
create_UG(g);
break;
}
case 2:{
create_DG(g);
break;
}
case 3:{
create_UDN(g);
break;
}
case 4:{
create_DN(g);
break;
}
default:
break;
}
return true;
}
int main()
{
amgragh G;
creategragh(G);
return true;
}
测试结果如下:
