初学数据结构(图的邻接矩阵和邻接表的储存)
初学数据结构(图的邻接矩阵和邻接表的储存)
《数据结构教程》第6版 P307 exp8-1
exp8-1.cpp
//
// Created by Snow on 2023/4/18.
//
#include"graph.cpp"
int main()
{
AdjGraph *G;
MatGraph g;
int A[MAXV][MAXV]={{0,5,0,7,0,0},{0,0,4,0,0,0},{8,0,0,0,0,9},{0,0,5,0,0,6},{0,0,0,5,0,0},{3,0,0,0,1,0}};
int n=6,e=10;
CreateMat(g,A,n,e);
printf("输出邻接矩阵g:\n");
DispMat(g);
CreateAdj(G,A,n,e);
printf("输出邻接表G:\n");
DispAdj(G);
printf("销毁邻接表G\n");
DestroyAdj(G);
}
graph.cpp
//
// Created by Snow on 2023/4/18.
//
#include<cstdio>
#include<cstdlib>
#define INF 32767
#define MAXV 100
typedef char InfoType;
//以下定义领接矩阵类型
typedef struct
{
int no;//顶点编号
InfoType info;//顶点其他信息
}VertexType;//顶点类型
typedef struct
{
int edges[MAXV][MAXV];//领接矩阵数组
int n,e;//顶点数,边数
VertexType vexs[MAXV];//存放顶点信息
}MatGraph;//完整的图领接矩阵类型
//以下定义邻接表类型
typedef struct ANode
{
int adjvex;//该边的邻接点编号
struct ANode *nextarc;//指向下一条边的指针
int weight;//该边的相关信息,如权值(用整形表示)
}ArcNode;//边结点类型
typedef struct VNode
{
InfoType info;//顶点的其他信息
int count;//存放顶点入度,仅仅用于拓扑排序
ArcNode *firstarc;//指向第一条边
}VNode;//邻接点头结点类型
typedef struct
{
VNode adjlist[MAXV];//邻接表头结点数组
int n,e;//图中顶点数n和边数e
}AdjGraph;//完整的图邻接表类型
//邻接表的构造
void CreateMat(MatGraph &g,int A[MAXV][MAXV],int n,int e)
{
int i,j;
g.n=n;
g.e=e;
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
g.edges[i][j]=A[i][j];
}
//邻接矩阵的输出
void DispMat(MatGraph g)
{
int i,j;
for(i=0;i<g.n;i++)
{
for(j=0;j<g.n;j++)
{
if(g.edges[i][j]!=INF)
printf("%4d",g.edges[i][j]);
else
printf("%5s","∞");
}
printf("\n");
}
}
//创建邻接表
void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e)
{
int i,j;
ArcNode *p;
G=(AdjGraph*)malloc(sizeof(AdjGraph));
for(i=0;i<n;i++)
G->adjlist[i].firstarc=nullptr;
for(i=0;i<n;i++)
{
for(j=n-1;j>=0;j--)
if(A[i][j]!=0&&A[i][j]!=INF)
{
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->weight=A[i][j];
p->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=p;
}
}
G->n=n;
G->e=e;
}
//输出邻接表
void DispAdj(AdjGraph *G)
{
int i;
ArcNode *p;
for(i=0;i<G->n;i++)
{
p=G->adjlist[i].firstarc;
printf("%3d:",i);
while(p!=nullptr)
{
printf("%3d[%d]-> ",p->adjvex,p->weight);
p=p->nextarc;
}
printf("∧\n");
}
}
//销毁邻接表
void DestroyAdj(AdjGraph *&G)
{
int i;
ArcNode *pre,*p;
for(i=0;i<G->n;i++)
{
pre=G->adjlist[i].firstarc;
if(pre!=nullptr)
{
p=pre->nextarc;
while(p!=nullptr)
{
free(pre);
pre=p;
p=p->nextarc;
}
free(pre);
}
}
free(G);
}