使用邻接表创建有向图or无向图

实现代码

// ConsoleApplication18.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdlib.h"
typedef struct arcNode
{
	int  data;
	struct arcNode * nextArc; //指向同一个依附弧尾顶点的边的指针
}ArcNode,*PArcNode;
typedef struct vertexNode{
	char data;
	int otherdata;
	ArcNode * firstArc;//指向第一条依附该顶点的边的指针
}VerTex;
typedef struct Graph //定义图的数据结构
{
	VerTex vTexList [20];//定一个顶点数组,每个单元存放该顶点的结构体
	int arcNums,VTexNums;
}Graph,*PGraph;
int Location(PGraph G,char data)
{
	for (int i = 0; i < G->VTexNums; i++)
	{

		if(G->vTexList[i].data==data)
		{
			return i;
		}
	}
	return 0;
}
void Create_Graph(PGraph G)
{
	printf("输入顶点数和边数\n");
	int arcnums,vertextnums;
	scanf_s("%d %d",&vertextnums,&arcnums);
	char temt = getchar();
	G->arcNums = arcnums;G->VTexNums = vertextnums;
	char info;
	for (int i = 0; i < G->VTexNums; i++)
	{
		printf("输入第 %d 个顶点的值\n",i+1);
		scanf_s("%c",&info);
		char temp = getchar();
		G->vTexList[i].data = info;
		G->vTexList[i].firstArc = NULL;
	}
	for (int i = 0; i < G->arcNums; i++) //对每个边的依附顶点输入并查找他们所在顶点表的位置
	{
		printf("输入两个顶点的的值");
		char v1,v2;
		scanf_s("%c",&v1);
		char temp1 = getchar();
		scanf_s("%c",&v2);
		char temp2 = getchar();
		//设置函数从顶点表中找到该顶点所在的索引值
		int v1Index = 0,v2Index=0;
		v1Index = Location(G,v1);
		v2Index = Location(G,v2);
		//find successfully 
		//create ArcNode
		PArcNode p1 = new ArcNode;
		p1->data = v2Index;
		p1->nextArc = G->vTexList[v1Index].firstArc; //前插法将p边节点插入到顶点v1后。
		G->vTexList[v1Index].firstArc = p1;
		
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	Graph G;
	Create_Graph(&G);
	for (int i = 0; i < G.VTexNums; i++)
	{
		printf("%c",G.vTexList[i].data);
		PArcNode p = G.vTexList[i].firstArc;
		while (p)
		{
			printf("->%d",p->data);
			p = p->nextArc;
		}
		
		printf("\n");
	}
}

因为无向图在邻接矩阵中呈对称矩阵关系,所以在邻接表中设置了依附v1节点所在的边节点后

需要对边节点也要设置同样依附该节点的边节点。

只需要在该部分进行改动即可

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值