数据结构无向图的建立

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 你的代码是错的

数据结构图之存储结构

以上是关于数据结构无向图的建立的主要内容,如果未能解决你的问题,请参考以下文章

神秘的“图”--数据结构

数据结构与算法学习笔记 图

数据结构与算法学习笔记 图

Java实现无向图的建立与遍历

大学实验4:利用数组表示法建立无向网

关于数据结构的图的问题