C语言 邻接表表示无向图

运行结果正确用邻接表来表示图要创造的结构体太多了,我感觉其实有更简单的结构体来表示图。#include<stdio.h>#include <stdlib.h>#include <string.h>#include<malloc.h>//创建邻接表//这个边的数据结构是用来给我们输入使用的typedef struct se_node *se_point;struct se_node{ int v1,v2; int weight;} ;
摘要由CSDN通过智能技术生成

运行结果正确
用邻接表来表示图要创造的结构体太多了,我感觉其实有更简单的结构体来表示图。
在这里插入图片描述

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include<malloc.h>
//创建邻接表
//这个边的数据结构是用来给我们输入使用的
typedef struct se_node *se_point;
struct se_node{
   
	int v1,v2;
	int weight;
} ;
//创建邻接表的边 
typedef struct e_node *e_point;
struct e_node{
   
	int indx;
	int weight;
	e_point next;
};
//创建邻接表的顶点
typedef struct v_node *v_point;
struct v_node{
   
	e_point first_edge;
	int date;
};
//创建邻接表的图
typedef struct g_node *g_point;
struct g_node{
   
	int v_num;
	int e_num;
	struct v_node list[100];
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是C语言代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 // 最大顶点数 // 邻接矩阵结构体 typedef struct { int vertex[MAX_VERTEX_NUM]; // 顶点数组 int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int vertex_num; // 顶点数 int edge_num; // 边数 } MGraph; // 邻接表结构体 typedef struct ArcNode { int adj_vex; // 邻接点下标 struct ArcNode *nextarc; // 指向下一个邻接点的指针 } ArcNode; typedef struct VNode { int data; // 顶点信息 ArcNode *firstarc; // 指向第一个邻接点的指针 } VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; // 邻接表 int vertex_num; // 顶点数 int edge_num; // 边数 } ALGraph; // 邻接矩阵转邻接表 void MGraphToALGraph(MGraph mg, ALGraph *ag) { ag->vertex_num = mg.vertex_num; // 顶点数 ag->edge_num = mg.edge_num; // 边数 for (int i = 0; i < mg.vertex_num; i++) { ag->vertices[i].data = mg.vertex[i]; // 存储顶点信息 ag->vertices[i].firstarc = NULL; // 初始化邻接表的第一个邻接点指针 } for (int i = 0; i < mg.vertex_num; i++) { for (int j = 0; j < mg.vertex_num; j++) { if (mg.edge[i][j] != 0) { // 创建一个新的邻接点 ArcNode *newArcNode = (ArcNode *) malloc(sizeof(ArcNode)); newArcNode->adj_vex = j; newArcNode->nextarc = NULL; // 将新的邻接点插入到对应的邻接表中 if (ag->vertices[i].firstarc == NULL) { ag->vertices[i].firstarc = newArcNode; } else { ArcNode *p = ag->vertices[i].firstarc; while (p->nextarc != NULL) { p = p->nextarc; } p->nextarc = newArcNode; } } } } } int main(void) { // 构建邻接矩阵 MGraph mg; mg.vertex_num = 5; mg.edge_num = 7; mg.vertex[0] = 0; mg.vertex[1] = 1; mg.vertex[2] = 2; mg.vertex[3] = 3; mg.vertex[4] = 4; mg.edge[0][1] = 1; mg.edge[0][2] = 1; mg.edge[1][3] = 1; mg.edge[1][4] = 1; mg.edge[2][3] = 1; mg.edge[2][4] = 1; mg.edge[3][4] = 1; // 转换成邻接表 ALGraph ag; MGraphToALGraph(mg, &ag); // 输出邻接表 printf("邻接表:\n"); for (int i = 0; i < ag.vertex_num; i++) { printf("%d -> ", ag.vertices[i].data); ArcNode *p = ag.vertices[i].firstarc; while (p != NULL) { printf("%d ", ag.vertices[p->adj_vex].data); p = p->nextarc; } printf("\n"); } return 0; } ``` 以上代码将邻接矩阵转换成邻接表并输出,可以根据需要进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值