邻接表转换为邻接矩阵

来源:互联网 发布:华中科技大学网络与远程教育 编辑:程序博客网 时间:2024/05/21 18:31

代码如下,分析详见注释 :

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;//------------邻接矩阵----------- #define MAX 20typedef char Dtype;typedef int mapmax[MAX][MAX];typedef struct{int dian,hu;Dtype d[MAX];mapmax map;}M;int locate(M G,Dtype a);void creat_map(M &G);//-----------邻接表--------------typedef char Diantype;//弧的结构体 typedef struct ArcNode{    int         adddain;//指向顶点位置的指针     struct  ArcNode   *nextarc;//指向下一条弧的指针 }ArcNode;//点的结构体 typedef struct VNode{    Diantypedata;//顶点信息     ArcNode*firstarc;//指向第一条依附该点的弧的指针 }VNode, AdjList[MAX];typedef  struct{      AdjListtoulist;//所有头节点的表       intdian,hu;//当前顶点数和弧数 }ALG;     int locate_dian(ALG H,Diantype a);void Creat_ALG(ALG &H);//-------------转换-------------void manage(ALG &H,M &mm){mm.dian=H.dian;mm.hu=H.hu;//弧数点数直接复制 for(int i=1;i<=H.dian;i++){mm.d[i]=H.toulist[i].data;//每个点赋值 ArcNode *p;p=H.toulist[i].firstarc;while(p)//第一个点指向的点依次给邻接矩阵赋值 {mm.map[i][p->adddain]=1;p=p->nextarc;}}}int main(){ALG A;Creat_ALG(A);M mm;memset(mm.map,0,sizeof(mm.map));manage(A,mm);/*for(int i=1;i<=4;i++)printf("%c ",mm.d[i]);*/for(int i=1;i<=A.dian;i++){for(int j=1;j<=A.dian;j++){printf("%d ",mm.map[i][j]);}printf("\n");}return 0;}//---------------邻接表---------------------- int locate_dian(ALG H,Diantype a){for(int i=1;i<=H.dian;i++){if(H.toulist[i].data==a)return i;}return 0;}void Creat_ALG(ALG &H){//根据输入的有向图G的顶点数及边数,建立图G的邻接表printf("请输入点数和弧数\n");cin>>H.dian>>H.hu;getchar();printf("请输入节点信息\n");for(int i=1;i<=H.dian;i++){cin>>H.toulist[i].data;H.toulist[i].firstarc=NULL;}getchar();printf("请输入%d条弧\n",H.hu); for(int k=1;k<=H.hu;k++){Diantype x,y;int i,j;ArcNode *p,*node;cin>>x>>y;getchar();//cout<<x<<y;i=locate_dian(H,x);j=locate_dian(H,y);//cout<<i<<j;//----i->j-------node=new ArcNode;node->adddain=j;p=H.toulist[i].firstarc;H.toulist[i].firstarc=node;node->nextarc=p;//----j->i--------node=new ArcNode;node->adddain=i;node->nextarc=NULL;p=H.toulist[j].firstarc;H.toulist[j].firstarc=node;node->nextarc=p;}}//---------------邻接矩阵------------------ int locate(M G,Dtype a){for(int i=1;i<=G.dian;i++){if(a==G.d[i])return i;}return 0;}void creat_map(M &G){//输入无向图的顶点数及弧数,建立G无向图 Dtype x,y;printf("请输入点数和弧数\n"); cin>>G.dian>>G.hu;getchar();printf("请输入%d个点\n",G.dian);for(int i=1;i<=G.dian;i++)cin>>G.d[i];memset(G.map,0,sizeof(G.map));printf("请输入%d条弧\n",G.hu);getchar();for(int k=0;k<G.hu;k++){int i,j;cin>>x>>y;//printf("x=%c y=%c ",x,y);getchar();i=locate(G,x);j=locate(G,y);G.map[i][j]=G.map[j][i]=1;}}

2 0