邻接矩阵和邻接表

邻接矩阵

#include <stdio.h>
#include <stdlib.h>
#define inf 0//代表两个顶点之间没有边的情况
//图的结构体
typedef struct Graph{
	int vertices;//代表图的顶点数目
	int** edges;//二级指针/矩阵 动态申请内存
	
}Graph;
//创建邻接矩阵
void GraphCreate(Graph *g,int vertices){
	g->vertices = vertices;//赋值
	g->edges = (int **)malloc(sizeof(int*)*vertices);
	//为edges分配内存空间
	for(int i = 0 ; i < vertices; i ++){
		g->edges[i]=(int* )malloc(sizeof(int)*vertices);
		//矩阵内每一行再申请空间
		for(int j  = 0 ; j < vertices; j ++){
			g->edges[i][j] = inf;//初始化
		}
	}
}
//邻接矩阵的销毁
void GraphDestroy(Graph *g){
	for(int i = 0;i<g->vertices;i++){
		free(g->edges[i]);//先销毁每一行
	}
	free(g->edges);//再销毁edges本身
	g->edges = NULL;
}
//边的添加
void GraphAddEdge(Graph *g,int u,int v,int w){
	g->edges[u][v]=w;
}
//邻接矩阵的遍历
void GraphPrint(Graph *g){
	for(int i  =0;i<g->vertices;i++){
		for(int j = 0;j<g->vertices;j++){
			printf("%3d ",g->edges[i][j]);
		}
		printf("\n");
	}
}
int main(){
	Graph g;
	GraphCreate(&g,5);
	GraphAddEdge(&g,1,1,2);
	GraphAddEdge(&g,2,3,5);
	GraphAddEdge(&g,1,3,7);
	GraphAddEdge(&g,4,2,15);
	GraphAddEdge(&g,3,2,9);
	GraphAddEdge(&g,0,4,4);
	GraphAddEdge(&g,3,0,3);
	
	GraphPrint(&g);
	GraphDestroy(&g);
	
	return 0;
}

邻接表

#include <stdio.h>
#include <stdlib.h>
//用来表示图中的边
typedef struct EdgeNode{
	int vertex;//边的结尾顶点
	int weight;//边的权重
	struct EdgeNode* next;//指向下一个边节点
}EdgeNode;
//表示图中的顶点
typedef struct VertexNode{
	int vertex;//顶点索引代表边的起始顶点
	EdgeNode* firstEdge;//指向该顶点的第一个边节点
	
}VertexNode;
//图
typedef struct{
	int vertices;//顶点个数
	VertexNode * nodes;//图的顶点信息
}Graph;
//图的创建
void GraphCreate(Graph *g,int vertices){
	//顶点个数
	g->vertices = vertices;
	//与顶点邻接的链表
	g->nodes = (VertexNode *)malloc(sizeof(VertexNode)*vertices);
	//初始化
	for(int i  = 0;i<vertices;i++){
		g->nodes[i].vertex = i;//顶点的编号
		g->nodes[i].firstEdge = NULL;//初始的边 
	}
}
//邻接表的销毁
void GraphDestroy(Graph *g){
	for(int i=0;i<g->vertices;i++){
		//遍历链表做删除操作
		EdgeNode* curr = g->nodes[i].firstEdge;
		
		while(curr){
			EdgeNode* temp = curr;
			curr = curr->next;
			free(temp);
		}
	}
	free(g->nodes);
	g->nodes = NULL;
}
//邻接表元素的添加
//添加权重为w从u到v的有向边
//采用头插法
void GraphAddEdge(Graph* g,int u,int v,int w){
	//首先生成一个边节点
	EdgeNode * newNode = (EdgeNode *)malloc(sizeof(EdgeNode));
	//边界点的结尾节点赋值为v
	newNode->vertex = v;
	newNode->weight = w;//权重
	newNode->next = g->nodes[u].firstEdge;
	g->nodes[u].firstEdge = newNode;
	
}
//打印
void GraphPrint(Graph* g){
	for(int i = 0;i<g->vertices;i++){
		EdgeNode* curr = g->nodes[i].firstEdge;
		printf("Vertex %d:",i);
		while(curr){
			printf("%d(%d) ",curr->vertex,curr->weight);
			curr= curr->next;
		}
		printf("\n");
	}
}
int main(){
	Graph g;
	GraphCreate(&g,5);
	
	GraphAddEdge(&g,0,1,4);
	GraphAddEdge(&g,0,2,2);
	GraphAddEdge(&g,1,2,3);
	GraphAddEdge(&g,2,3,4);
	GraphAddEdge(&g,3,4,2);
	
	GraphPrint(&g);
	GraphDestroy(&g);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值