数据结构之邻接表的实现

本代码实现了无向网的邻接表,但是没有实现无向网的遍历

本代码在Arch linux EndevrousOS 中经过测试

对于有向网,需要增加权重;对于无向图,只需要删除权重即可。对于有向图,需要修改邻接表中元素的域。

代码小白,如有疏漏,错误,请指出,感激不尽!

#include "stdio.h"
#include "stdlib.h"
#define MAXVERTEX 10
typedef struct  __EdgeNode// Edge Node 边节点
{
	int adjvertex;
	struct __EdgeNode* next;
	int weight;
	} EdgeNode;

typedef struct __ALNode// Adjacency List Node 邻接表节点
{
		char name;//顶点标识
		EdgeNode* first;//第一个邻接点
	}ALNode;
	
typedef struct __ALGraph// Adjacency List Graph 邻接表构成的图
{
	ALNode Vertex[MAXVERTEX];//邻接表
	int Edges,Vertices;// 总的边数和顶点数
	}ALGraph;
	
int Locate_vertex(ALGraph * G, char v);
void  scanf_remove_newline_Char(ALGraph * G,  char *arg);
//void scanf_remove_newline_Int(ALGraph* G, int* arg);
void  Create_unALGraph_unweighted(ALGraph* G)// 创建无向无权图
	{
		printf("Please input the number of vertices:");// 输入顶点数
		//scanf_remove_newline_Int(G,&G->Vertices);
		scanf("%d",&G->Vertices);
		printf("Please input the number of edges:");// 输入边数
		//scanf_remove_newline_Int(G,&G->Edges);
		scanf("%d",&G->Edges);
		printf("输入各顶点的名字:\n");
		for(int i = 0; i < G->Vertices; i++)// 初始化节点名字
		{	
			printf("%d",G->Vertices);
			scanf_remove_newline_Char(G,&G->Vertex[i].name);
			G->Vertex[i].first = NULL;// 邻接点初始化为NULL
		}
		
		char v1,v2;// 一条边的两个顶点
		int index_v1, index_v2; // v1,v2 的下标
		
		for(int i = 0; i< G->Edges; i++)
		{
			printf("边%d的顶点是哪两个?", i + 1);
			scanf_remove_newline_Char(G, &v1);
			printf("继续输入:\n");
			scanf_remove_newline_Char(G,&v2);
			index_v1 = Locate_vertex(G, v1);
			index_v2 = Locate_vertex(G, v2);//  在邻接表中查询顶点对应的下标。
			
			EdgeNode* pnew1 = (EdgeNode*)malloc(sizeof(EdgeNode));
			pnew1->adjvertex = index_v2;// 顶点v1紧邻顶点v2。
			pnew1->next = G->Vertex[index_v1].first;//pnew1(边节点)把原来的节点往后推。
			G->Vertex[index_v1].first = pnew1;//pnew1称为该顶点的第一个邻接点。
			
			EdgeNode* pnew2 = (EdgeNode*)malloc(sizeof(EdgeNode));
			pnew2->adjvertex =  index_v1;// 顶点v2紧邻顶点v1。
			pnew2->next = G->Vertex[index_v2].first;//pnew2把原来的节点往后推。
			G->Vertex[index_v2].first = pnew2;//pnew2成为该顶点的第一个邻接点。
		}
		
		}

void  scanf_remove_newline_Char(ALGraph * G,  char*arg)// 去除换行符,接收整数输入,但是必须小于255
{	
	(*arg) == getchar();
	while(getchar() != '\n')
		continue;
}
int Locate_vertex(ALGraph *G, char  v)
	{
		// 找到顶点在结构体数组中的下标
		int index;
		for(int i = 0; i < MAXVERTEX; i++)
		{
			if(G->Vertex[i].name ==  v)
					return index = v;
		}
	}
	int main()
	{
		ALGraph G;
		Create_unALGraph_unweighted(&G);
		
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

山河锦绣放眼好风光

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

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

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

打赏作者

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

抵扣说明:

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

余额充值