【数据结构】邻接表创建_CreateALGraph

#include "stdio.h"    
#include "stdlib.h"   
#include "io.h"  
#include "math.h"  
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXVEX 100 /* 最大顶点数,应由用户定义 */

typedef int Status;	/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char VertexType; /* 顶点类型应由用户定义 */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */

typedef struct EdgeNode /* 边表结点  */
{
	int adjvex;    /* 邻接点域,存储该顶点对应的下标 */
	EdgeType info;		/* 用于存储权值,对于非网图可以不需要 */
	struct EdgeNode *next; /* 链域,指向下一个邻接点 */
}EdgeNode;

typedef struct VertexNode /* 顶点表结点 */
{
	VertexType data; /* 顶点域,存储顶点信息 */
	EdgeNode *firstedge;/* 边表头指针 */
}VertexNode, AdjList[MAXVEX];

typedef struct
{
	AdjList adjList; 
	int numNodes,numEdges; /* 图中当前顶点数和边数 */
}GraphAdjList;

/* 建立图的邻接表结构 */
void  CreateALGraph(GraphAdjList *G)
{
	int i,j,k;
	EdgeNode *e;
	printf("输入顶点数和边数:\n");
	scanf("%d,%d",&G->numNodes,&G->numEdges); /* 输
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当我们需要存储一个图时,邻接是一种常用的数据结构。在邻接中,每个节点代图中的一个顶点,每个节点包含一个指向该顶点的指针和一个指向与该顶点相邻的所有顶点的指针。邻接的实现方法有多种,其中头插法是比较常用的一种。下面是关于头插法的C语言代码及其详细注释: ```c #include <stdio.h> #include <stdlib.h> #define MAXVEX 100 // 定义图的最大顶点数 // 边节点结构体 typedef struct EdgeNode { int adjvex; // 邻接点域,存储该顶点对应的下标 int weight; // 权值 struct EdgeNode *next; // 链域,指向下一个邻接点 } EdgeNode; // 顶点结构体 typedef struct VertexNode { char data; // 顶点域,存储顶点信息 EdgeNode *firstedge; // 边头指针 } VertexNode, AdjList[MAXVEX]; // 图结构体 typedef struct { AdjList adjList; // 邻接 int numVertexes; // 图中当前顶点数 int numEdges; // 图中当前边数 } GraphAdjList; // 创建邻接,采用头插法 void CreateALGraph(GraphAdjList *G) { int i, j, k; EdgeNode *e; printf("请输入顶点数和边数:\n"); scanf("%d %d", &(G->numVertexes), &(G->numEdges)); // 读入顶点信息,建立顶点 for (i = 0; i < G->numVertexes; i++) { printf("请输入第%d个顶点的信息:", i+1); scanf(" %c", &(G->adjList[i].data)); G->adjList[i].firstedge = NULL; // 将边置为空 } // 建立边 for (k = 0; k < G->numEdges; k++) { printf("请输入边(vi, vj)的下标i, j和权值:\n"); scanf("%d %d %d", &i, &j, &(e->weight)); // 生成边节点e1和e2 e = (EdgeNode *) malloc(sizeof(EdgeNode)); e->adjvex = j; e->next = G->adjList[i].firstedge; G->adjList[i].firstedge = e; e = (EdgeNode *) malloc(sizeof(EdgeNode)); e->adjvex = i; e->next = G->adjList[j].firstedge; G->adjList[j].firstedge = e; } } int main() { GraphAdjList G; CreateALGraph(&G); return 0; } ``` 在上述代码中,我们定义了边节点结构体EdgeNode,顶点结构体VertexNode和邻接结构体GraphAdjList。CreateALGraph函数用于创建邻接。在该函数中,我们首先读入顶点信息,建立顶点;然后读入边的信息,依次生成边节点e1和e2,并采用头插法将它们插入到相应的邻接中。需要注意的是,由于头插法是将新节点插入到链的头部,因此在插入新节点之前需要先将该顶点原本的邻接点整体往后移一位。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值