数据结构无向图的建立
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构无向图的建立相关的知识,希望对你有一定的参考价值。
帮忙写个建立无向图的代码,C语言,非常感谢,要能跑通的代码哦~~(无向图通过邻接矩阵建立)
您好,这是我们数据结构一个作业程序,希望能帮到你。#include <stdio.h>
#include<stdlib.h>
#define int_max 10000
#define inf 9999
#define max 20
//邻接矩阵定义
typedef struct ArcCell
int adj;
char *info;
ArcCell,AdjMatrix[20][20];
typedef struct
char vexs[20];
AdjMatrix arcs;
int vexnum,arcnum;
MGraph_L;
int LocateVex(MGraph_L G,char v)//查找顶点v的序号
int i=0;
while(G.vexs[i]!=v)
++i;
return i;
int createMGraph_L(MGraph_L &G)//创建图用邻接矩阵表示
char v1,v2;
int i,j,w;
printf("创建无向图\n");
printf("请输入无向图G的顶点数和弧数:");
scanf("%d%d",G.vexnum,G.arcnum);
for(i=0;i!=G.vexnum;++i)
printf("输入顶点%d\n",i);
scanf("%c",G.vexs[i]);
for(i=0;i!=G.vexnum;++i)
for(j=0;j!=G.vexnum;++j)
G.arcs[i][j].adj=int_max;
G.arcs[i][j].info=NULL;
printf("输入一条边依附的顶点和权:\n");
for(int k=0;k!=G.arcnum;++k)
scanf("%c%c%d",&v1,&v2,&w); //输入一条边依附的两点及权值
i=LocateVex(G,v1); //确定顶点V1和V2在图中的位置
j=LocateVex(G,v2);
G.arcs[i][j].adj=w;
G.arcs[j][i].adj=w;
return G.vexnum;
typedef struct ArcNode //弧结点
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
//char *info; //该弧相关信息的指针
ArcNode;
typedef struct vnode //邻接链表顶点头接点
char data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
vnode,adjlist;
typedef struct //图的定义
adjlist vertices[max];
int vexnum,arcnum; //图的当前顶点数和弧数
ALGraph;
int CreateUDG(ALGraph &gra,MGraph_L G)//用邻接表存储图
int i=0,j=0;
ArcNode *arc,*tem,*p;
for(i=0;i!=G.vexnum;++i)
gra.vertices[i].data=G.vexs[i];
gra.vertices[i].firstarc=NULL;
for(i=0;i!=G.vexnum;++i)
for(j=0;j!=G.vexnum;++j)
if(gra.vertices[i].firstarc==NULL)
if(G.arcs[i][j].adj!=int_max&&j!=G.vexnum)
arc=(ArcNode *)malloc(sizeof(ArcNode));
arc->adjvex=j;
gra.vertices[i].firstarc=arc;
arc->nextarc=NULL;
p=arc;
++j;
while(G.arcs[i][j].adj!=int_max&&j!=G.vexnum)
tem=(ArcNode *)malloc(sizeof(ArcNode));
tem->adjvex=j;
gra.vertices[i].firstarc=tem;
tem->nextarc=arc;
arc=tem;
++j;
--j;
else
if(G.arcs[i][j].adj!=int_max&&j!=G.vexnum)
arc=(ArcNode *)malloc(sizeof(ArcNode));
arc->adjvex=j;
p->nextarc=arc;
arc->nextarc=NULL;
p=arc;
gra.vexnum=G.vexnum;
gra.arcnum=G.arcnum;
printf("图G的邻接表创建成功!\n");
return 1;
typedef struct
int adjvex;
int lowcost;
closedge;
int prim(int g[][max],int n) //最小生成树PRIM算法
int lowcost[max],prevex[max]; //LOWCOST[]存储当前集合U分别到剩余结点的最短路径
//prevex[]存储最短路径在U中的结点
int i,j,k,min;
for(i=2;i<=n;i++) //n个顶点,n-1条边
lowcost[i]=g[1][i]; //初始化
prevex[i]=1; //顶点未加入到最小生成树中
lowcost[1]=0; //标志顶点1加入U集合
for(i=2;i<=n;i++) //形成n-1条边的生成树
min=inf;
k=0;
for(j=2;j<=n;j++) //寻找满足边的一个顶点在U,另一个顶点在V的最小边
if((lowcost[j]<min)&&(lowcost[j]!=0))
min=lowcost[j];
k=j;
printf("(%d,%d)%d\t",prevex[k]-1,k-1,min);
lowcost[k]=0; //顶点k加入U
for(j=2;j<=n;j++) //修改由顶点k到其他顶点边的权值
if(g[k][j]<lowcost[j])
lowcost[j]=g[k][j];
prevex[j]=k;
printf("\n");
return 0;
void list()
printf("……………………菜单……………………\n\n");
printf("0、创建无向图并用邻接表存储边信息…..\n");
printf("1、使用prim算法求最小生成树……………\n");
printf("2、退出系统…………………………………\n\n");
void main()
ALGraph G1;
MGraph_L G;
int i,d,g[20][20];
char y='y';
int k;
while(y=='y')
list();
printf("请选择菜单:\n");
scanf("%d",&k);
switch(k)
case 0:
d=createMGraph_L(G);
CreateUDG(G1,G);
break;
case 1:
for(i=0;i!=G.vexnum;++i)
for(int j=0;j!=G.vexnum;++j)
g[i+1][j+1]=G.arcs[i][j].adj;
printf("prim:\n");
prim(g,d);
break;
case 2:break;
//exit(1);
printf("\n是否继续操作?y/n:");
scanf("%c",&y);
追问
你用哪个编译器的呢?为什么我用c-FREE跑不通你的啊
追答vc++6.0啊,我没用你那个,我想都是c的都行吧……
参考技术A 你的代码是错的数据结构图之存储结构
以上是关于数据结构无向图的建立的主要内容,如果未能解决你的问题,请参考以下文章