邻接矩阵变换到邻接表

题目描述:请你用代码实现邻接矩阵到邻接表的转换。

邻接矩阵的结构体

typedef int vertexType; //邻接矩阵的结构体
typedef struct _tag_GraphMatrix_
{
	int vertexNumber; //顶点数
	int edgeNumber; //边数
	vertexType *vertex; //顶点集合,用动态数组存储
	int** edg; //边集合,用二维数组存储
}GraphMatrix;

邻接表的结构体

//--------邻接表的结构体
typedef int HeadData;
#define MAX_SIZE 100
typedef struct _tag_EdgeNode_
{
    int adjver; //该边指向顶点的位置
    struct _tag_EdgeNode_ *next; //指向下一条边的指针
}EdgeNode;

typedef struct _tag_head_
{
    HeadData data; //顶点存的数据
    EdgeNode *firstnext; // 顶点指向下一条边的指针
}HeadNode;

typedef struct _tag_GraphList_
{
    int ver_num,edg_num; //图的顶点数和边数
    HeadNode head[MAX_SIZE]; //顶点数组
}GraphList;

 

核心代码

void Convert(GraphList *gL,GraphMatrix *gM)
{
    gL->ver_num = gM->vertexNumber;
    gL->edg_num = gM->edgeNumber;

    for(int i=0; ivertexNumber;i++ ) //双重循环遍历邻接矩阵,---->可优化
    {
        gL->head[i].data = gM->vertex[i]; //将邻接矩阵顶点存储的数据,copy到邻接表对应的内存中
        gL->head[i].firstnext = NULL;
        for(int j=0;jvertexNumber;j++ )
        {
            if(gM->edg[i][j] != 0)
            {
                EdgeNode *enode = new EdgeNode;
                enode->adjver = j;
                enode->next = gL->head[i].firstnext;
                gL->head[i].firstnext = enode;
            }
        }
    }
}

完整代码

#include 

typedef int vertexType; //邻接矩阵的结构体
typedef struct _tag_GraphMatrix_
{
	int vertexNumber; //顶点数
	int edgeNumber; //边数
	vertexType *vertex; //顶点集合,用动态数组存储
	int** edg; //边集合,用二维数组存储
}GraphMatrix;

void Create_GraphMatrix(GraphMatrix *g)
{
	g->vertex = new vertexType[g->vertexNumber+1]; //分配内存空间,存储顶点信息

	g->edg = new int*[g->vertexNumber+1]; //二维指针的第一次分配空间
	for (int i = 0; i < g->vertexNumber; i++) //边集合,是二维动态数组
	{
		g->edg[i] = new int[g->edgeNumber+1];
	}


	//初始化邻接矩阵的所有元素
	for (int i = 0; i < g->vertexNumber; i++)
	{
		for (int j = 0; j < g->vertexNumber; j++)
		{
			g->edg[i][j] = 0;
		}
	}


	//输入图的信息
	//1.输入顶点
	for (int i = 0; i < g->vertexNumber; i++)
		std::cin >> g->vertex[i];

	//有g->edgeNumber条边,就有g->edgeNumber对顶点,但要注意无向图是对称的,因此(i,j)=(j,i)
	for (int e = 0; e < g->edgeNumber; e++)
	{
		int row, col;
		//row代表行,col代表列
		std::cin >> row >> col;
		g->edg[row][col] = 1;
		g->edg[col][row] = 1;
	}


	//输出图的邻接矩阵
	for (int i = 0; i < g->vertexNumber; i++)
	{
		for (int j = 0; j < g->vertexNumber; j++)
		{
			std::cout << g->edg[i][j] << " ";
		}
		std::cout<vertex != NULL)
	{
		delete[]g->vertex;
		g->vertex = NULL;
	}


	for (int i = 0; i < g->vertexNumber; i++) //边集合,是二维动态数组
	{
		if (g->edg[i] != NULL)
		{
			delete[]g->edg[i];
			g->edg[i] = NULL;
		}
	}
	if (g->edg != NULL)
	{
		delete[]g->edg;
		g->edg = NULL;
	}

}

//--------邻接表的结构体
typedef int HeadData;
#define MAX_SIZE 100
typedef struct _tag_EdgeNode_
{
    int adjver; //该边指向顶点的位置
    struct _tag_EdgeNode_ *next; //指向下一条边的指针
}EdgeNode;

typedef struct _tag_head_
{
    HeadData data; //顶点存的数据
    EdgeNode *firstnext; // 顶点指向下一条边的指针
}HeadNode;

typedef struct _tag_GraphList_
{
    int ver_num,edg_num; //图的顶点数和边数
    HeadNode head[MAX_SIZE]; //顶点数组
}GraphList;

void Convert(GraphList *gL,GraphMatrix *gM)
{
    gL->ver_num = gM->vertexNumber;
    gL->edg_num = gM->edgeNumber;

    for(int i=0; ivertexNumber;i++ ) //双重循环遍历邻接矩阵,---->可优化
    {
        gL->head[i].data = gM->vertex[i]; //将邻接矩阵顶点存储的数据,copy到邻接表对应的内存中
        gL->head[i].firstnext = NULL;
        for(int j=0;jvertexNumber;j++ )
        {
            if(gM->edg[i][j] != 0)
            {
                EdgeNode *enode = new EdgeNode;
                enode->adjver = j;
                enode->next = gL->head[i].firstnext;
                gL->head[i].firstnext = enode;
            }
        }
    }
}

void printGraphList(GraphList *gL) //输出邻接表
{

    //输出图的信息
	EdgeNode *current = NULL;
	for (int i = 0; i < gL->ver_num; i++)
	{
		if(gL->head[i].firstnext != NULL)
			current = gL->head[i].firstnext;
		while (current != NULL)
		{
			std::cout << i << "-->" << current->adjver<<"  ";
			current = current->next;
		}
		std::cout << std::endl;
	}
}

int main()
{
    //邻接矩阵
	GraphMatrix *gM;
	gM = new GraphMatrix;
    std::cout << "请分别输入图的顶点和边的数量" << std::endl;
	std::cin >> gM->vertexNumber >> gM->edgeNumber;
	Create_GraphMatrix(gM);

	GraphList *gL = new GraphList;
	Convert(gL,gM);
	printGraphList(gL);
	deleteMemory(gM);
    return 0;
}

 

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