图2——利用邻接表创建有向图

图2——利用邻接表创建有向图

假设以邻接表作为图的存储结构,编写算法,创建有向图并输出邻接表。


主要考查对邻接表的理解。图的邻接表分为两个部分:表头结点和边表结点,因此创建有向图也分成两部分:一是创建表头结点,二是创建边表结点构成的边表。

创建表头结点就是根据输入的结点信息,将结点信息直接存入对应的数据域中,并且将该结点的指针域置为NULL。

for(int i=0;i<G->vexnum;i++)
{
    cin>>G->vertex[i].data;
    G->vertex[i].firstarc=NULL;
}
创建边表就是根据输入的弧信息,创建新结点,将该结点插入到对应的链表中。
for(int k=0;k<G->arcnum;k++)
{
    cin>>v1>>v2;
    i=LocateVertex(*G,v1);
    j=LocateVertex(*G,v2);
    p=(ArcNode*)malloc(sizeof(ArcNode));
    p->adjvex=j;
    p->nextarc=G->vertex[i].firstarc;
    G->vertex[i].firstarc=p;
}

/*
6 9

a b c d  e f

a b
a c
a f
f c
b c
b f
c d
d a
e d

*/

code:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <iostream>
using namespace std;
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define  MAXSIZE 100
typedef enum {DG,DN,UG,UN}GraphKind;
typedef struct ArcNode
{
	int adjvex;
	InfoPtr *info;
	struct ArcNode *nextarc;

}ArcNode;
typedef struct VNode 
{
	VertexType data;
	ArcNode *firstarc;
}VNode,AdjList[MAXSIZE];
typedef struct 
{
	AdjList vertex;
	int vexnum, arcnum;
	GraphKind kind;

}AdjGraph;
int LocateVertex(AdjGraph G, VertexType v);
void CreateGraph(AdjGraph *G);
void DisplayGraph(AdjGraph G);
void DestoryGraph(AdjGraph *G);
int LocateVertex(AdjGraph G, VertexType v)
{
	int i;
	for (i = 0; i < G.vexnum; ++i)
	{
		if (strcmp(G.vertex[i].data, v) == 0)
		{
			return i;
		}

	}
	return -1;
}
void CreateGraph(AdjGraph *G)
{
	int i, j, k;
	VertexType v1, v2;
	ArcNode *p;
	cout << "请输入图的顶点数和边数 ";
	cin >> (*G).vexnum >> (*G).arcnum;
	cout << "请输入" <<G->vexnum<< "个顶点的值:" << endl;
	for (i = 0; i < G->vexnum;i++)
	{
		cin >> G->vertex[i].data;
		G->vertex[i].firstarc = NULL;
	}
	cout << "请输入弧尾  弧头" << endl;
	for (k = 0; k < G->arcnum;k++)
	{
		cin >> v1 >> v2;
		i = LocateVertex(*G, v1);
		j = LocateVertex(*G, v2);
		p = (ArcNode*)malloc(sizeof(ArcNode));
		p->adjvex = j;
		p->info = NULL;
		p->nextarc = G->vertex[i].firstarc;
		G->vertex[i].firstarc = p;

	}
	(*G).kind = DG;
}

void DestoryGraph(AdjGraph *G)
{
	int i;
	ArcNode *p, *q;
	for (i = 0; i < (*G).vexnum;i++)
	{
		p = G->vertex[i].firstarc;
		if (p!=NULL)
		{
			q = p->nextarc;
			free(p);
			p = q;

		}
	}
	(*G).vexnum = 0;
	(*G).arcnum = 0;
}

void DisplayGraph(AdjGraph G)
{
	int i;
	ArcNode *p;
	cout << G.vexnum << "个顶点:" << endl;
	for (i = 0; i < G.vexnum;i++)
	{
		cout << G.vertex[i].data << " ";
	}
	cout << endl << G.arcnum << "条边:"<<endl;
	for (i = 0; i < G.vexnum;i++)
	{
		p = G.vertex[i].firstarc;
		while (p)
		{
			cout << G.vertex[i].data << "→" << G.vertex[p->adjvex].data << " ";
			p = p->nextarc;
		}
		cout << endl;
	}
}

void main()
{
	AdjGraph G;
	cout << "采用邻接矩阵创建有向图G:" << endl;
	CreateGraph(&G);
	cout << "输入有向图G的邻接表:" << endl;
	DisplayGraph(G);
	DestoryGraph(&G);
	system("pause");
}

结果:


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值