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

示例输入:

a b c d e//节点名称

(ctrl+z)

6//边的数目

0 1//每条边连接的两个顶点编号下同

0 3

2 4

4 1

2 3

2 1

示例输出:

数据结构_图_邻接多重表做存储结构遍历无向图_C++实现_第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");
}




你可能感兴趣的:(数据结构_图_邻接多重表做存储结构遍历无向图_C++实现)