数据结构_图_邻接多重表做存储结构遍历无向图_C++实现

数据结构_图_邻接多重表做存储结构遍历无向图_C++实现

示例输入:

a b c d e //节点名称
(ctrl+z)
6 //边的数目
0 1 //每条边连接的两个顶点编号下同
0 3
2 4
4 1
2 3
2 1

示例输出:

head.h

#include<iostream>
#define MAX_VERTAX_NUM 20
using namespace std;

typedef enum
{
	unvisited, visited
} Visitif;
class EBox
{
public:
	EBox();
	Visitif mark;
	int ivex, jvex;
	EBox *ilink, *jlink;
};

EBox::EBox()
{
	mark = unvisited;
	ivex = jvex = 0;
	ilink = jlink = NULL;
}

class VexBox
{
public:
	VexBox();
	char data;
	EBox *firstedge;
};

VexBox::VexBox()
{
	firstedge = NULL;
}

class GraphInfo
{
public:
	GraphInfo();
	VexBox adjmulist[MAX_VERTAX_NUM];
	int vexnum, edgenum;
};

GraphInfo::GraphInfo()
{
	vexnum = edgenum = 0;
}

class AMLGraph
{
public:
	void ShowAMLGraph(); //接口函数
private:
	void GetVexNode(); //得到顶点信息
	void GetEdgeNum(); //得到边的数目
	void CreatAMLGraph(); //建图
	void PrintAMLGraph(); //打印节点相关信息
	GraphInfo AML;
};

void AMLGraph::ShowAMLGraph()
{
	GetVexNode(); //得到顶点信息
	GetEdgeNum(); //得到边的数目
	CreatAMLGraph(); //建图
	PrintAMLGraph(); //打印节点相关信息
}

void AMLGraph::GetVexNode() //得到顶点信息
{
	cout << "GetVexNode Called !" << endl << endl;
	char data;
	while (cin >> data)
	{
		AML.adjmulist[AML.vexnum++].data = data;
	}
	cin.clear();
}

void AMLGraph::GetEdgeNum() //得到边的数目
{
	cout << "GetEdgeNum Called !" << endl << endl;
	cin >> AML.edgenum;
}

void AMLGraph::CreatAMLGraph() //建图
{
	cout << "CreatAMLGraph Called !" << endl << endl;
	int recycle = AML.edgenum, t[2]; //设置循环次数并用t[2]存放两个节点
	EBox *newedge, *p;
	while (recycle--) //循环体
	{
		cin >> t[0] >> t[1]; //输入边连接的两个顶点
		newedge = new EBox; //开辟新节点
		newedge->ivex = t[0];
		newedge->jvex = t[1];
		for (int i = 0; i < 2; i++) //分别对两个点进行处理
		{
			p = AML.adjmulist[t[i]].firstedge;
			if (p == NULL)
			{
				AML.adjmulist[t[i]].firstedge = newedge;
			}
			else
			{
				while ((p->ilink != NULL && p->ivex == t[i])
						|| (p->jlink != NULL && p->jvex == t[i])) //注意这个循环条件,老出错就是错到了这里
				{
					if (t[i] == p->ivex)
						p = p->ilink;
					else
						p = p->jlink;
				}
				if (p->ivex == t[i])
					p->ilink = newedge;
				else
					p->jlink = newedge;
			}
		}
	}
}

void AMLGraph::PrintAMLGraph() //打印节点相关信息
{
	cout << "PrintAMLGraph Called !" << endl << endl;
	EBox *p;
	for (int i = 0; i < AML.vexnum; i++)
	{
		cout << AML.adjmulist[i].data << " : " << endl;
		p = AML.adjmulist[i].firstedge;
		while (p != NULL)
		{
			if (p->ivex == i)
			{
				cout << AML.adjmulist[p->ivex].data << "--"
						<< AML.adjmulist[p->jvex].data << endl;
				p = p->ilink;
			}
			else
			{
				cout << AML.adjmulist[p->jvex].data << "--"
						<< AML.adjmulist[p->ivex].data << endl;
				p = p->jlink;
			}
		}
		cout << endl;
	}
}

main.cpp

#include"head.h"
 
int main()
{
	AMLGraph aml;
	aml.ShowAMLGraph();
	system("pause");
}

发表回复