无向图的邻接多重边实现;

如题;这是一套完整的可运行的代码;需要读者有一定的基础去阅读;

语言是用C语言实现;在C++环境中编写;在C++中可直接运行;在C语言中需要改部分头文件和输出语句;

头文件;这要是代码的声明部分;

# ifndef _AMLGRAPH_
# define _AMLGRAPH_

# include <iostream>
using namespace std;

# define MaxVertexNum 256

typedef enum
{
	unvisited, visited
}VisiteIf;

typedef int InfoType;
typedef char VertexType;

typedef struct EdgeNode
{
	VisiteIf mark;
	int ivertex;
	struct EdgeNode * ilink;
	int jvertex;
	struct EdgeNode * jlink;
	InfoType info;
}EdgeNode;

typedef struct VertexNode
{
	VertexType vertex;
	EdgeNode * firstedge;
}VertexNode;

typedef struct
{
	VertexNode adjmulist[MaxVertexNum];
	int vertexNum;
	int edgeNum;
}AMLGraph, * PAMLGraph;

PAMLGraph CreateGraph(void);

# endif

实现文件;主要是代码的实现;

# include "AMLGraph.h"

PAMLGraph CreateGraph(void)
{
	PAMLGraph g = (PAMLGraph)malloc(sizeof(AMLGraph));

	if (NULL != g)
	{
		memset(g, 0, sizeof(AMLGraph));
		g->vertexNum = 0;
		g->edgeNum = 0;

		//输入定点数和边数;
		cout << "Please input VertexNum and EdgeNum: " << endl;
		cin >> g->vertexNum >> g->edgeNum;

		//初始化顶点表;
		for (int i = 0; i < g->vertexNum; i++)
		{
			cout << "Please input element value: " << endl;
			cin >> g->adjmulist[i].vertex;
			g->adjmulist[i].firstedge = NULL;
		}

		//初始化边表;
		int i = 0;
		int j = 0;
		EdgeNode * p = NULL;
		for (int k = 0; k < g->edgeNum; k++)//乘2是为了保证相同的边起始端点不容可以输入;
		{
			//输入边的两个端点;
			cout << "Please input edge two index; " << endl;
			cin >> i >> j;

			//连接边节点;
			p = (EdgeNode *)malloc(sizeof(EdgeNode));
			p->mark = unvisited;

			p->ivertex = i;
			p->ilink = g->adjmulist[i].firstedge;
			g->adjmulist[i].firstedge = p;

			p->jvertex = j;
			p->jlink = g->adjmulist[j].firstedge;
			g->adjmulist[j].firstedge = p;

			p->info = 0;
		}

		return g;
	}
	else
	{
		cout << "Memory allocate error! " << endl;
		system("pause");
		exit(0);
	}
}

Main函数;

# include "AMLGraph.h"

int main(int argc, char ** argv)
{
	PAMLGraph g = CreateGraph();

	cout << g->adjmulist[0].firstedge->ivertex << endl;
	cout << g->adjmulist[0].firstedge->jvertex << endl;

	cout << g->adjmulist[0].firstedge->ilink->ivertex << endl;
	cout << g->adjmulist[0].firstedge->ilink->jvertex << endl;

	if (NULL != g->adjmulist[1].firstedge->jlink)
	{
		cout << g->adjmulist[1].firstedge->ivertex << endl;
		cout << g->adjmulist[1].firstedge->jlink->jvertex << endl;
	}

	if (NULL != g->adjmulist[2].firstedge->jlink)
	{
		cout << g->adjmulist[2].firstedge->jlink->jvertex << endl;
		cout << g->adjmulist[2].firstedge->jlink->ivertex << endl;
	}

	cout << g->adjmulist[2].firstedge->ivertex << endl;
	cout << g->adjmulist[2].firstedge->jvertex << endl;

	cout << g->adjmulist[2].firstedge->ilink->ivertex << endl;
	cout << g->adjmulist[2].firstedge->ilink->jvertex << endl;

	cout << g->adjmulist[2].firstedge->ilink->ilink->ivertex << endl;
	cout << g->adjmulist[2].firstedge->ilink->ilink->jvertex << endl;

	cout << g->adjmulist[4].firstedge->ivertex << endl;
	cout << g->adjmulist[4].firstedge->jvertex << endl;

	system("pause");
	return 0;
}
对任意给定的图(顶点数不小于20,数不少于30,图的类型可以是有向图、无向图、有向网、无向网),能够输入图的顶点和(或弧)的信息,并存储到相应存储结构(邻接矩阵邻接表、十字链表、邻接多重表,任选其中两种类型),对自己所创建的图完成以下操作: 对无向图求每个顶点的度,或对有向图求每个顶点的入度和出度(5分) 完成插入顶点和(或弧)的功能(5分) 完成删除顶点和(或弧)的功能(5分) 两种存储结构的转换(5分),如果其中一种存储结构为十字链表或邻接多重表则增加5分。 输出图的深度优先遍历序列或广度优先遍历序列(5分) 求图的深度优先或广度优先的生成树(或生成森林)(存储结构为孩子-兄弟链表),并对生成树进行遍历(15分) 判断图的连通性,输出连通分量的个数(5分) 判断图中是否存在无向图5分,有向图10分 给出顶点u和v,判断u到v是否存在路径(5分) 10、求顶点u到v的一条简单路径(10分) 11、求顶点u到v的所有简单路径(15分) 12、求顶点u到v的最短路径(10分) 13、求顶点u到其余各顶点的最短路径(15分) 14、求任两个顶点之间的最短路径(15分) 15、求最小生成树(15分) 16、对于有一个源点和一个汇点的有向网,求关键路径(20分) 编程境可以是C、VC++、JAVA,每位同学从上述题目中选择100分的题目,注意,必须选择第1-6题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值