数据结构c代码7:图的邻接表表示及其存储

下面是用c语言实现的关于图的邻接表表示及其存储代码:

#include<iostream>
using namespace std;
/**
 * *用邻接表表示图的存储结构步骤如下:
 * 输入 总顶点数和总边数 
 * 依次输入点的信息存入顶点表中,使每个表头结点的指针域初始化为NULL
 * 创建邻接表。依次输入每条边依附的两个顶点,确定这两个顶点的序号i和j之后,将此边结点分别插入vi和vj对应的
 * 两个边链表的头部。 
 **/
#define MVNum 100         //最大顶点数 
typedef char VerTexType;   //假设顶点的数据类型为字符类型 

typedef struct ArcNode     //边结点 
{
	int adjvex;            //该边所指向的顶点的位置 
	struct ArcNode *nextarc;  //指向下一条边的指针 
	int info;                //和边相关的信息 
}ArcNode; 

typedef struct VNode      //顶点信息 
{
	VerTexType data;
	ArcNode *firstarc;   //指向第一条依附该顶点边的节点 
}VNode, AdjList[MVNum];  //AdjList表示邻接表类型 

typedef struct ALGraph   //邻接表 
{
	AdjList vertices; 
	int vexnum, arcnum;    //图当前的顶点数和边数 
}ALGraph;

int LocateVex(ALGraph G, char v)
{
	int index = 0;
	for(int i=0;i<G.vexnum;i++)
	{
		if(G.vertices[i].data == v)
		{
			index = i;
			break;
		}
	}
	return index;
} 

void Creat_UDG(ALGraph &G)
{
	char v1, v2; 
	cout<<"请输入顶点数和边数:";
	cin>>G.vexnum>>G.arcnum;    //输入总顶点数和边数 
	
	cout<<"请输入各点:\n";
	for(int i=0;i<G.vexnum;i++)   //输入各点,构造表头结点 
	{
		cin>>G.vertices[i].data;  //输入顶点值 
		G.vertices[i].firstarc = NULL;   //初始化表头结点的指针域为NULL 
	}
	
	for(int k=0;k<G.arcnum;k++)  //输入各边,构造邻接表 
	{
		cout<<"请输入第"<<k+1<<"条边相邻的两个顶点:\n"; 
		cin>>v1>>v2;   //输入一条边依附的两个顶点
		int i = LocateVex(G, v1);
		int j = LocateVex(G, v2);  
		
		//将新节点*p1插入顶点vi的边表头部 
		ArcNode * p1 = (ArcNode *)malloc(sizeof(ArcNode));
		p1->adjvex = j;
		p1->nextarc = G.vertices[i].firstarc;
		G.vertices[i].firstarc = p1;
		
		//将新节点*p2插入顶点vj的边表头部 
		ArcNode * p2 = (ArcNode *)malloc(sizeof(ArcNode));
		p2->adjvex = i;
		p2->nextarc = G.vertices[j].firstarc;
		G.vertices[j].firstarc = p2; 
	} 
}

void print_UDG(ALGraph G)
{
	cout<<"建立的邻接表如下:\n";
	for(int i=0;i<G.vexnum;i++)
	{
		cout<<i<<" "<<G.vertices[i].data<<"->";
		ArcNode *p = G.vertices[i].firstarc;
		while(p!=NULL)
		{
			cout<<p->adjvex;
			p = p->nextarc;
			if(p!=NULL)
			{
				cout<<"->";
			}
			else
			    cout<<"\n";
		}
	}
}
int main()
{
	ALGraph G;
	Creat_UDG(G);
	print_UDG(G);
	return 0;
}

运行结果如下:
在这里插入图片描述
有不懂的可以留言,如果这篇文章对你有帮助,请帮忙给个赞!!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值