图的存储 数据结构 陈越

图的邻接矩阵表示-无向网图的初始化程序

#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100
#define INF 65535
typedef int Vertex; //顶点下标表示顶点
typedef int WeightType;//边的权值
typedef char DataType;//顶点存储的数据类型设为字符
/*图结点的定义*/
typedef struct GNode *PtrToGNode;
struct GNode {
int Nv;//顶点数
int Ne;//边数
WeightType G[MaxVertexNum][MaxVertexNum];//邻接矩阵
DataType Data[MaxVertexNum];//存顶点的数据
};
typedef PtrToGNode MGraph;/*以邻接矩阵存储的图的类型*/
typedef struct ENode *PtrToENode;
struct ENode {
Vertex V1, V2; /*有向边 <v1,v2>*/
WeightType Weight;
};
typedef PtrToENode Edge;
MGraph CreatGraph(int VertexNum) {
/*初始化一个有vertexnum个顶点 但没有边的图*/
MGraph Graph;
Graph = (MGraph)malloc(sizeof (struct GNode));
Graph->Nv = VertexNum;
Graph->Ne = 0; //还没建边
for (int i = 0; i < Graph->Nv; i++)
for (int j = 0; j < Graph->Nv; j++) {
Graph->G[i][j] = INF;
}
return Graph;
}
void InsertEdge(MGraph Graph, Edge E) {
/*插入边 <v1,v2>*/
Graph->[E->V1][E->V2] = E->Weight;
/*若是无向图,还要插入边<v2,v1>*/
Graph->G[E->V2][E->V1] = E->Weight;
}
MGraph BuildGraph() {
MGraph Graph;
Edge E;
Vertex V;
int Nv, i;
scanf("%d", &Nv); //读入顶点的个数
Graph = CreatGraph(Nv); /*初始化有nv个顶点 但是没有边的图 */
scanf("%d", &(Graph->Ne)); /*读入边数*/
if (Graph->Ne != 0) { //如果有边
E = (Edge) malloc (sizeof (struct ENode)) ; //建立边结点
/*读入边,格式为“起点 终点 权重”*/
for ( i = 0; i < Graph->Ne; i++) {
scanf("%d %d %d", &E->V1, &E->V2, &E->Weight );
/*权重如果不是整形,输入的格式要改*/
InsertEdge(Graph, E);
}
}
//如果顶点有数据的话,读入数据
for(V=0 ; V<Graph->Nv;V++)
scanf("%c" , &(G->Data[V]));
return Graph;
}

图的邻接表表示-无向图的初始化程序

#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100
#define INF 65535
/*----------邻接表表示法的结构和类型声明-----------------------------------------*/
typedef int Vertex; //顶点下标表示顶点
typedef int WeightType;//边的权值
typedef char DataType;//顶点存储的数据类型设为字符
/*边的定义*/
typedef struct ENode *PtrToENode;
struct ENode{
Vertex V1,V2;// 有向边<v1,v2>
WeightType weight;//权值
};
typedef PtrToENode Edge;
/*邻接点的定义*/
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{
Vertex AdjV; //邻接点的下标
WeightType weight;//边权
PtrToAdjVNode Next;//指向下一个邻接点的指针
};
/*顶点表头结点的定义*/
typedef struct Vnode{
PtrToAdjVNode FirstEdge;/*边表头指针*/
DataType Data; /*存顶点的数据*/
/*注意很多情况下顶点无数据,此时data可以不用出现*/
}AdjList[MaxVertexNum];
/*图结点的定义*/
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv;//顶点
int Ne;//边数
AdjList G;/*邻接表*/
};
typedef PtrToGNode LGraph;
/*------------------------------------------------------------------------------*/
LGraph CreatGraph(int VertexNum)
{
/*初始化一个有vertexnum个顶点但没有边的图*/
Vertex V;
LGraph Graph;
Graph=(LGraph)malloc(sizeof (struct GNode));
Graph->Nv=VertexNum;
Graph->Ne=0;
/*初始化邻接表头指针*/
for(V=0; V<Graph->Nv ;V++)
{
Graph->G[V].FirstEdge=NULL;
}
return Graph;
}
void InsertEdge( LGraph Graph ,Edge E)
{
PtrToAdjVNode NewNode;
/*插入边<v1,v2>*/
/*为V2建立新的邻接点*/
NewNode =(PtrToAdjVNode)malloc(sizeof (struct AdjVNode));
NewNode->AdjV=E->V2;
NewNode->weight=E->weight;
/*将V2插入V1的表头*/
NewNode->Next=Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge=NewNode;
/*若为无向图则还要插入边<v2,v1>*/
NewNode=(PtrToAdjVNode)malloc(sizeof (struct AdjVNode));
NewNode->AdjV=E->V2;
NewNode->weight=E->weight;
NewNode->Next=Graph->G[E->V2].FirstEdge;
Graph->G[E->V2].FirstEdge=NewNode;
}
LGraph BuildGraph()
{
LGraph Graph;
Edge E;
Vertex V;
int Nv, i;
scanf("%d",&Nv);/*读入顶点个数*/
Graph=CreatGraph(Nv);/*初始化有Nv个顶点但没有边的图*/
scanf("%d",&(Graph->Ne));/*读入边数*/
if(Graph->Ne!=0)
{
E=(Edge)malloc(sizeof (struct ENode));
for(int i=0;i<Graph->Ne;i++){
scanf("%d %d %d",&E->V1,&E->V2,&E->weight);
InsertEdge(Graph,E);
}
}
/*如果顶点有数据,读入数据*/
for(V=0;V<Graph->Nv; V++)
{
scanf("%c",&(Graph->G[V].Data));
}
return Graph;
}

posted on   swj2529411658  阅读(17)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示