邻接表的构建,打印

关于邻接表,我们不妨构建一个思路

首先定义头节点结构体将头节点存入一个列表;并且初始化头节点的列表结构体

如此构建函数并且输入邻接点储存然后打印

将边表也设置一个结构体,再构建一个头节点的结构体

再用结构体封装头节点结构体的数组,并且存入边数和顶点数;

下面是有关邻接表的构建和打印的代码

#include<stdio.h>
#include<iostream>
#include<malloc.h>
using namespace std;
#define MVNUM 100
typedef int edgetype;
typedef char vextype;
typedef struct Edgenode
{
	edgetype adjvex;//邻接域下标
	struct Edgenode *next;
	//edgetype weight;//若有权值加上该条

}Edgnode;//邻接域
typedef struct Headvex
{
	Edgnode * firstnode;
	vextype data;

}Hedavex, ahead[MVNUM];//头节点
typedef struct
{
	ahead head;//储存头节点的数组
	int vexnum, arcnum;
}Headlist;
void creatlist(Headlist*G)
{
	int i,j,k,v,a;

	Edgnode *e;
	
	cout << "输入顶点数和边数:";
	cin >> G->vexnum >> G->arcnum;
	cout << "存入顶点:";
	for (v = 0; v < G->vexnum; v++)
	{
		cin >> G->head[v].data;
		G->head[v].firstnode = NULL;
	}//初始化邻接表
	for (k = 0; k < G->arcnum; k++)
	{
		int listnum1, listnum2;//输入顶点表序号位置i,listnum2代表邻接的下标
		cout << "输入顶点表位置和下标:";
		cin >> listnum1 >> listnum2;
		//cin>>w;
		e = (Edgenode*)malloc(sizeof(Edgenode));
		e->adjvex = listnum2 ;
		//e->weight = w;
		e->next = G->head[listnum1].firstnode;
		G->head[listnum1].firstnode = e;
		e = (Edgenode*)malloc(sizeof(Edgenode));//无向网没有出入度,故在listnum2连接listnum1
		e->adjvex = listnum1;
		e->next = G->head[listnum2].firstnode;
		G->head[listnum2].firstnode = e;

	}

}

void printlist(Headlist*G)
{
	int i, j;
	for (i = 0; i < G->vexnum; i++)
	{
		printf("%d->", i);
		if(G->head[i].firstnode!=NULL)
		{
			while (G->head[i].firstnode != NULL)
			{
				printf("%d->", G->head[i].firstnode->adjvex);
				G->head[i].firstnode = G->head[i].firstnode->next;
				if (G->head[i].firstnode == NULL)
				{
					printf( "^");
				}
			}
		
			printf("\n");
			
		}
	}



}
int main(void)
{
	Headlist* TEST=(Headlist*)malloc(sizeof(Headlist));// 初始化结构体内存
	creatlist(TEST);
	printlist(TEST);
	return 0;
}

例如下面是一个无向图,我们要让它在C语言中用邻接表打印,这边借用王卓老师上课的图为例子

这边运行邻接表的代码结果,结果可能会与之前的有所差别,但是运行结果的顺序不影响正确值

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值