图的存储代码 四种逻辑的代码

目录

领接矩阵

邻接表

十字链表

邻接多重表


不清楚图的存储结构的朋友,请移步至此

http://t.csdn.cn/QEX5Eicon-default.png?t=N2N8http://t.csdn.cn/QEX5E

领接矩阵

//一个数组代表顶点集合
//一个二维数组来代表边集
#define MaxVertices 100
#define MaxWeight 32767 //带权图 点不邻接的时候 无穷大
typedef struct {
	int Vertices[MaxVertices];//顶点的数组信息
	int Edge[MaxVertices][MaxVertices];//边的信息
	int numV;//顶点的个数
	int numE;//边的个数
}AdjMatrix;

void CreateGraph(AdjMatrix* G)
{
	int n, e;
	int vi, vj, w;
	//先输入图的顶点的个数和边的个数
	scanf_s("%d,%d", &n, &e);
	G->numV = n; G->numE = e;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
		{
			if (i == j)
			{
				G->Edge[i][j] = 0;
			}
			else
			{
				G->Edge[i][j] = MaxWeight;
			}
		}
	}
	//把顶点放到数组当中
	for (int i = 0; i < G->numV; i++)
	{
		//开始输入顶点的信息
		scanf("%d", &G->Vertices[i]);
	}

	//输入边的信息
	for (int i = 0; i < G->numE; i++)
	{
		//输入边的信息 邻接点的两端 如果是带权图 输入边的权值
		scanf_s("%d%d%d", &vi, &vj, &w);
		//还要在查找 找到对应的下标
		G->Edge[vi][vj] = w;
		//如果是无向图 是个对称矩阵
		G->Edge[vj][vi] = w;
	}
		

}

邻接表

#include<stdio.h>

//邻接表
//边表结点
typedef struct EdgeNode
{
	int adjvex;//邻接的结点  这里是位置或者下标   也可以存数据,但比较麻烦,默认这里都存下标
	struct EdgeNode* next;
	int weight;//权值
}EdgeNode;
//顶点信息  存数据  同时还是 链表的头
typedef struct VertexNode
{
	char data;//数据    顶点信息
	struct EdgeNode* firstedge;

}VertexNode,AdjList[100];
//有了边和顶点集合   领接表的结构
typedef struct GraphadjList {
	AdjList adjlist;//顶点表的结点数组
	int numV, numE;//顶点个数和边的个数
};


//结构体套结构体

//建表
//无向图的邻接表的创建
void CreatALGraph(GraphadjList* G) {
	int vi, vj;
	//先输入定点信息和边的信息
	scanf("%d%d", G->numV, &G->numE);
	for (int i = 0; i < G->numV; i++) {
		scanf("%d", &G->adjlist[i].data);
		getchar();//清空回车符
		G->adjlist[i].firstedge = NULL;
	}
	//建立边表
	for (int i = 0; i < G->numE; i++) {
		//输入每条边邻接的两个顶点
		scanf("%d%d", &vi, &vj);
		//如果输入的是真实的数据,也可以,不过要找下标,很麻烦
		EdgeNode* e = (EdgeNode*)malloc(sizeof(EdgeNode));
		//头插
		e->adjvex = vj;
		e->next = G->adjlist[vi].firstedge;
		G->adjlist[vi].firstedge = e;
		//无向图  两次
		e->adjvex = vi;
		e->next = G->adjlist[vj].firstedge;
		G->adjlist[vj].firstedge = e;

	}

}

十字链表

#include<stdio.h>
#include<stdlib.h>
//边集的数据
typedef struct ArcBox {
	int tailvex, headvex;//
	struct ArcBox* hlink,* tlink;
	int weight;
};
//顶点的数据
typedef struct VexNode {
	int data;
	ArcBox* firstin, * firstout;

}VexNode;
typedef struct {
	VexNode xlist[20];
	int numV, numE;

}OLGraph;

void CreateDG(OLGraph* G) {
	//输入顶点数和边数
	scanf("%d%d", &(G->numV), &(G->numE));
	for (int i = 0; i < G->numV; i++) {
		scanf("%d", &G->xlist[i].data);
		G->xlist[i].firstin = NULL;
		G->xlist[i].firstout = NULL;
	}
	//构建十字链表
	for (int i = 0; i < G->numE; i++) {
		int v1, v2;
		scanf("%d%d", &v1, &v2);
		//输入的是数据的话,要查找相应下标
		ArcBox* p = (ArcBox*)malloc(sizeof(ArcBox));
		p->tailvex = v1;
		p->headvex = v2;
		//头插
		p->hlink = G->xlist[v2].firstin;
		p->tlink = G->xlist[v1].firstout;
		G->xlist[v2].firstin = p;
		G->xlist[v1].firstout = p;
	}

}

邻接多重表

#include<stdio.h>
#include<stdlib.h>
//邻接多重表   无向图没有弧头弧尾之分了
//边表集合
typedef struct node {
	int ivex, jvex;
	struct node* vi, * vj;

}ArcNode;
//结点  就是存储数据和头指针
typedef struct {
	char vertex;
	ArcNode* firstEdge;
}VNode;

typedef struct {
	VNode Dvex[50];
	int numV, numE;
}Graph;

void Creat(Graph*G) {
	//先输入顶点数和边数
	scanf("%d%d", &(G->numV), &(G->numE));
	for (int i = 0; i < G->numV; i++) {
		scanf("%d", &G->Dvex[i].vertex);
		G->Dvex[i].firstEdge = NULL;
	}
	for (int i = 0; i < G->numE; i++) {
		//输入边对应的下标
		int vi, vj;
		//建立边
		ArcNode* new_node = (ArcNode*)malloc(sizeof(ArcNode));
		new_node->ivex = vi;
		new_node->jvex = vj;
		new_node->vi = G->Dvex[vi].firstEdge;
		G->Dvex[vi].firstEdge = new_node;
		new_node->vj = G->Dvex[vj].firstEdge;
		G->Dvex[vj].firstEdge = new_node;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天写bug的屑闲鱼

请我杯饮料吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值