数据结构——邻接矩阵转邻接表(C语言)

  • 将无向图的邻接矩阵存储转换为对应的邻接表存储
  • 思路:遍历邻接矩阵,将有各个顶点关联的边所对应的顶点存储到邻接表所对应的顶点表的边表上,并连接起来。
#include
#include
#define MaxVertexNum 100
#define ElemType int
#define VertexType int
typedef struct{//邻接矩阵存储
    ElemType Vertices[MaxVertexNum];  //顶点信息的数组
    ElemType Edge[MaxVertexNum][MaxVertexNum]; //边信息的数组
    ElemType vexnum; //顶点数
    ElemType arcnum;//边数
}NMGraph;

typedef struct ArcNode{//边表结点
    int adjvex;
    struct ArcNode *next;
    //InfoType info; //网的边权值
}ArcNode;
typedef struct VNode{//顶点表结点
    VertexType data; //顶点信息
    ArcNode *first;
}VMode,AdjList[MaxVertexNum];
typedef struct{
    AdjList vertices; //邻接表
    int vexnum,arcnum;;  //顶点数和边数
}ALGraph;

void CreateGraph(NMGraph &graph,ALGraph &graph2){
    int vnum,anum;
    printf("输入顶点数和边数:");
    scanf("%d%d",&vnum,&anum);
    //邻接矩阵
    graph.vexnum=vnum;
    graph.arcnum=anum;
    //邻接表
    graph2.vexnum=vnum;
    graph2.arcnum=anum;
    printf("\n图的初始化\n");
    for(int i=0;i<vnum;i++){//图的初始化
        for(int j=0;j<vnum;j++){
            graph.Edge[i][j]=0;
        }
    }//for
    for(int i=0;i<vnum;i++){//存储顶点信息
        printf("输入第%d个顶点的信息:",(i+1));
        int value;
        scanf("%d",&value);
        //邻接矩阵
        graph.Vertices[i]=value;
        //邻接表
        graph2.vertices[i].data=value;
        graph2.vertices[i].first=NULL;
    }
    printf("\n");
    for(int i=0;i<anum;i++){//存储边表信息
        printf("输入边的信息,格式为(v1 v2 w):");
        int v1,v2,w;
        scanf("%d%d%d",&v1,&v2,&w);
        //无向图
        graph.Edge[v1-1][v2-1]=w;
        graph.Edge[v2-1][v1-1]=w;
    }
}
ALGraph ChangeToTable(NMGraph &graph,ALGraph &graph2){
     for(int i=0;i<graph2.vexnum;i++){//顶点
        ArcNode *head=(ArcNode*)malloc(sizeof(ArcNode));//边表结点头结点(方便后续处理)
        ArcNode *p=head;
        p->next=NULL;
        for(int j=0;j<graph.vexnum;j++){//边
            if(graph.Edge[i][j] !=0){//边表结点相连
                ArcNode *edgeNode=(ArcNode*)malloc(sizeof(ArcNode));
                edgeNode->adjvex=(j+1);
                edgeNode->next=NULL;
                p->next=edgeNode;
                p=p->next;
                //printf("\n%d %d",graph.Vertices[i],p->adjvex);
            }
        }//for
        //将边表所有结点与顶点结点相连
        graph2.vertices[i].first=head->next;
        head->next=NULL;//去掉头结点
    }//for
}
//打印相邻结点的方法
void display(ALGraph &graph){
    for(int i=0;i<(graph.vexnum);i++){//顶点
        ArcNode *p=graph.vertices[i].first;
        printf("与顶点%d相邻的顶点为:",graph.vertices[i]);
        while(p){
            printf("%d ",p->adjvex);
            p=p->next;
        }
        printf("\n");
    }
}
//打印邻接矩阵的方法
void display2(NMGraph &graph){
    printf("  ");
    for(int i=0;i<(graph.vexnum);i++){
        printf("%d ",graph.Vertices[i]);
    }
    printf("\n");
    for(int i=0;i<(graph.vexnum);i++){//顶点
       printf("%d ",graph.Vertices[i]);
        for(int j=0;j<(graph.vexnum);j++){//边
            printf("%d ",graph.Edge[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
int main(){
    NMGraph graph;
    ALGraph graph2;
    printf("邻接矩阵创建与邻接表初始化\n");
    CreateGraph(graph,graph2);
    printf("NMGraph邻接矩阵为\n");
    display2(graph);
    printf("\n邻接矩阵转邻接表\n");
    ChangeToTable(graph,graph2);
    printf("\n邻边表为\n");
    display(graph2);
    return 0;
}

数据结构——邻接矩阵转邻接表(C语言)_第1张图片

你可能感兴趣的:(数据结构)