邻接表C实现简简单单

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、无向邻接表结构?

邻接表(Adjency List):数组和链表相结合的存储方式即为邻接表,就像下右图的结构。
在这里插入图片描述

二、C语言实现

#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100
//邻接表的结构定义
typedef struct EdgeNode{ //边表结点 
	int adjvex;
	struct EdgeNode * next;
}EdgeNode;

typedef struct VertexNode{//顶点表结点 
	char data;
	EdgeNode * firstedge;
}VertexNode, AdjList[MAXVEX];

typedef struct {          //邻接表 
	AdjList adjlist;
	int numVertexs;
	int numEdges;
}GraphAdjList;

//邻接表的创建
void CreateGraphAdj(GraphAdjList *G){//用头插法来创建 
	EdgeNode * e; 
	int i, j, k;
	printf("请输入邻接表的顶点数和边数:\n");
	scanf("%d %d",&G->numVertexs, &G->numEdges);

	//建立顶点表 	
	for (i=0; i<G->numVertexs; i++){
		getchar();                         //获取缓冲区的回车符来避免下面的scanf函数读取到上一个scanf
										   //留下的回车符
		printf("请输入第%d个顶点:\n", i+1);
		scanf("%c",&G->adjlist[i].data);   //输入顶点信息 
		G->adjlist[i].firstedge = NULL; //将边表置为空表 
	} 
	//建立边表 
	for (k=0; k<G->numEdges; k++){
		printf("输入(Vi,Vj)的边序号:\n"); //输入边上(Vi,Vj)的顶点序号 
		scanf("%d %d", &i, &j);
		//对于i顶点
		e = (EdgeNode *)malloc(sizeof(EdgeNode)); //向内存申请空间,生成边表结点 
		e->adjvex = j;                            //序号j 
		e->next = G->adjlist[i].firstedge;        //把e的next指针指向i顶点指向的结点 
		G->adjlist[i].firstedge = e;		      //把当前顶点的指针指向e 
		//对于j顶点 
		e = (EdgeNode *)malloc(sizeof(EdgeNode));
		e->adjvex = i;
		e->next = G->adjlist[j].firstedge;
		G->adjlist[j].firstedge = e;
	} 
} 
//打印邻接表方法 
void DisPlayGraph(GraphAdjList *G){
	int i;
	EdgeNode *e;
	for (i=0; i<G->numVertexs; i++){
//		printf("%c ", G->adjlist[i].data);
		e = G->adjlist[i].firstedge;
		while (e != NULL){
			printf("%c-%c ", G->adjlist[i].data,G->adjlist[e->adjvex].data);
			e = e->next;
		}
		printf("\n");				
	}
}

int main(void){
	GraphAdjList * G = (GraphAdjList *)malloc(sizeof(GraphAdjList));
	CreateGraphAdj(G);
	DisPlayGraph(G); 
	return 0;
} 

三、运行测试

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你抱着的是只熊

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值