欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计算法,将已有用邻接矩阵存储的带权图转换成邻接表表示。

程序员文章站 2024-03-17 09:22:58
...

Question:
设计算法,将已有用邻接矩阵存储的带权图转换成邻接表表示。
给出邻接矩阵和邻接表存储结构如下:


#define INFINITY 2000    //无穷大
#define MAX_VERTEX_NUM 20    //最多顶点个数

//邻接矩阵结构定义
Typedef struct ArcCell {
                    int adj;
                    int weight; //权值
} ArcCell, AdjMatrix [MAX_VERTEX_NUM] [MAX_VERTEX_NUM];

Typedef struct {
              char vex [MAX_VERTEX_NUM];  //顶点
              AdjMatrix arcs;
              int vexnum, arcnum;   //顶点和边的个数
} Mgraph;

//邻接表结构定义
Typedef struct ArcNode {
                     int adjvex;
                     struct ArcNode *nextarc;  //下一个邻接点
int weight;   //权值
} ArcNode;

Typedef struct Vnode {
                   char data;   //顶点
                   ArcNode *firstarc;  //第一个邻接点
} Vnode, AdjList [MAX_VERTEX_NUM];

Typedef struct {
              AdjList vertices;
              int vexnum, arcnum;   //顶点和边的个数
} ALGraph;

Solution

void GraphtoList(ALGraph *G,Mgraph M) 
{
                  
    ArcNode *p;             			//存储相邻接点结构体信息
    G->vexnum=M.vexnum;    		 //设置邻接表顶点数
    G->arcnum=M.arcnum;     		//设置邻接表边数
    int i,j,k;

    for(k=0;k<G->vexnum;k++)
    {   	//初始化邻接表起始顶点
        strcpy(G->vertices[k].data,M.vex[k]);
        G->vertices[k].firstarc=NULL;
    }

    for(i=0;i<M.arcnum;i++)
    {   	//遍历矩阵
        for(j=0;j<M.arcnum;j++)
        {
            if(M.arcs[i][j].adj==1)
            {   	//找到i邻接点,插入回原表i开头
                p=(ArcNode*)malloc(sizeof(ArcNode));
                p->adjvex=j;                           		//记录i邻接点序号
                p->nextarc=G->vertices[i].firstarc;     //头插法建立i的链表
                p->weight=M.arcs[i][j].weight;          	//记录权
                G->vertices[i].firstarc=p;        
            }
        }
    }
}

相关标签: 个人成长