graph.cpp文件以邻接矩阵和邻接表的形式来表示图的存储
#include<stdio.h>#include<stdlib.h>#include<math.h>#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 vex[MAXV]; //存放顶点信息}MatGraph; //图的邻接矩阵类型//------------------------------定义邻接表类型-------------------------------------------------typedef struct ArcNode{int adjvex; //该边邻接点编号ArcNode* nextarc; //指向下一条边的指针int weight; //该边的相关信息:权重}ArcNode; //边节点类型typedef struct VNode{InfoType info; //顶点信息int count; //顶点入度ArcNode * firstarc; //指向第一条边}VNode; //邻接表表头类型typedef struct{VNode adjlist[MAXV]; //邻接表表头数组int n,e; //图的顶点数和边数}AdjGraph; //图的邻接表类型//-------------------------邻接矩阵的基本操作------------------------------------------------void CreateMatGraph(MatGraph &g,int A[MAXV][MAXV],int n,int e){ //创建邻接矩阵g.n=n;g.e=e;for(int i=0;i<g.n;i++){for(int j=0;j<g.n;j++){g.edges[i][j]=A[i][j];}}}void DispMatGraph(MatGraph g) //输出邻接矩阵{for(int i=0;i<g.n;i++){for(int j=0;j<g.n;j++){if(g.edges[i][j]!=INF)printf("%4d",g.edges[i][j]);elseprintf("%4s"," ∞");}printf("\n");}}//-------------------------邻接表的基本操作--------------------------------------------------void CreateAdjGraph(AdjGraph *&G,int A[MAXV][MAXV],int n,int e) //创建图的邻接表{ArcNode *p;G=(AdjGraph*)malloc(sizeof(AdjGraph));for(int i=0;i<n;i++){G->adjlist[i].firstarc=NULL; //给邻接表中所有头结点的额指针域设置初值}for(int i=0;i<n;i++){for(int j=n-1;j>=0;j--){ //存在一条有向图边<i,j>,从i->j做一遍,如果是无向图的边(i,j),必须从j->i再做一边if(A[i][j]!=0&&A[i][j]!=INF){p=(ArcNode*)malloc(sizeof(ArcNode)); //创建一个节点Pp->adjvex=j;p->weight=A[i][j];p->nextarc=G->adjlist[i].firstarc; //采用头插法插入节点P,插到i结点后面G->adjlist[i].firstarc=p;}}}G->n=n;G->e=n;}void DispAdjGraph(AdjGraph *G) //输出邻接表{ArcNode *p;for(int i=0;i<G->n;i++){p=G->adjlist[i].firstarc;printf("%3d",i);while(p!=NULL){printf("%3d[%d]->",p->adjvex,p->weight);p=p->nextarc;}printf("^\n");}}void DestroyAdjGraph(AdjGraph *&G){ //销毁图的邻接表ArcNode * pre,*p;for(int i=0;i<G->n;i++){ //扫描所有的单链表pre=G->adjlist[i].firstarc; //p指向第i个单链表的首结点if(pre!=NULL){p=pre->nextarc;while(p!=NULL){free(pre); //释放第i个单链表的所有边结点pre=p;p=p->nextarc;}free(pre);}}free(G); //释放头结点数组}
操作:
#include"graph.cpp"
int main(){
MatGraph g;
AdjGraph * G;
int A[MAXV][MAXV]={
{0,5,INF,7,INF,INF},
{INF,0,4,INF,INF,INF},
{8,INF,0,INF,INF,9},
{INF,INF,5,0,INF,6},
{INF,INF,INF,5,0,INF},
{3,INF,INF,INF,1,0}
};
int n=6,e=10;
CreateMatGraph(g,A,n,e);
printf("(1)图G的邻接矩阵:\n");
DispMatGraph(g);
CreateAdjGraph(G,A,n,e);
printf("(2)图G的邻接表:\n");
DispAdjGraph(G);
printf("(3)销毁图G的邻接表\n");
DestroyAdjGraph(G);
return 1;
}
运行结果:
