c语言邻接表构造无向图,,无向图邻接表的构造

本文介绍了如何使用C语言实现无向图的邻接表存储结构,包括初始化、插入边、打印图、判断边存在性和计算顶点度数等功能。通过键盘输入图的顶点数和边数,动态构建并显示邻接表。
摘要由CSDN通过智能技术生成

一、目的和要求(需求分析):

1、掌握邻接表的存储结构以及邻接表的建立和操作。

2、 构造一个无向图的邻接表,要求从键盘输入图的顶点数和图的边数,并显示所构造的邻接表)

实验拓展:1.  构建有向图的邻接表

2.  判断边是否存在

3.  求顶点的度数

以下是代码:

#include

#include

#include

#define vnum 20

using namespace std;

typedef struct arcnode

{

int adjvex;                         //边所对应的顶点编号

struct arcnode * next;           //指向下一条边的指针

}ArcNode;

typedef struct vexnode

{

int vertex;                         //顶点编号

ArcNode *first;                  //指向第一条依附该顶点的边的指针

}AdjList[vnum];

typedef struct

{

AdjList adjlist;

int vexnum,arcnum;                  //顶点和边的个数

}Graph;

void Init(Graph *GA,int a,int b)          //初始化

{

int i;

GA->vexnum=a;</

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值