基于visual Studio2013解决算法导论之055拓扑排序




题目

拓扑排序


解决代码及点评

// 拓扑排序.cpp : 定义控制台应用程序的入口点。
//

// 深度优先.cpp : 定义控制台应用程序的入口点。
//
// 图的邻接表表示.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>
#include <stack>
#include <queue>
#include <array>
using namespace std;

template<class T>
class EdgeNode
{
public:
	T adjvex;
	EdgeNode *pnext;
};

template<class T>
class Graph
{
public:
	Graph();
	~Graph();
	void CreatALGraph();
	void BFSTraverse();
	void DFSTraverse();
	void AOV();
private:
	EdgeNode<T> *adjlist[100];   //数组
	int n;  //顶点数
	int e;   //边数
};

template<class T>
Graph<T>::Graph()
{
	//adjlist = new EdgeNode<T>;
}

template<class T>
Graph<T>::~Graph()
{

}

template<class T>
void Graph<T>::AOV()
{
	int a[100]= {0};
	//int i=1;
	//int flag=0;
	int flagall=0;
	while (flagall==0)
	{

		int unAOV = 0;  //判断有木有环
		for (int i=0;i<n;i++)
		{
			int flag=0;    //判断节点有没有在邻接矩阵中出现
			for (int j=0;j<n;j++)
			{
				EdgeNode<T> *node=adjlist[j]->pnext ;
				while(node!=NULL)
				{
					if (node->adjvex==adjlist[i]->adjvex&&a[j]==0)
					{
						flag = 1;
						a[j] = 1;
					}
					node=node->pnext;
				}
			}
			if (flag==0)
			{
				cout<<adjlist[i]->adjvex;
				unAOV = 1;
			}
		}
		flagall=1;
		for (int i=0;i<n;i++)
		{
			if (a[i]==0)
			{
				flagall=0;
			}
		}

		if (unAOV ==0)
		{
			cout<<"有环图";
			return;
		}
	}





}

template<class T>
void Graph<T>::DFSTraverse()
{
	stack <EdgeNode<T>> s;
	int a[100]= {0};
	s.push(*adjlist[0]);
	int i=1;
	int flag=0;
	while(!s.empty()&&flag==0)   //
	{
		EdgeNode<T> *node ;
		node = &s.top();
		cout<<"->"<<node->adjvex;

		if (!s.empty())
		{
			s.pop();
		}

		while(node!=NULL)
		{

			int flag = 0;
			for (int i=0;i<n;i++)
			{
				if (adjlist[i]->adjvex==node->adjvex&&a[i]==0)
				{
					//cout<<" "<<adjlist[i]->adjvex;
					s.push(*adjlist[i]);
					a[i]=1;
				}
			}
			node=node->pnext;
		}


	}

}

template<class T>
void Graph<T>::BFSTraverse()
{
	queue<EdgeNode<T>> q;
	int a[100]= {0};
	q.push(*adjlist[0]);
	int i=1;
	int flag=0;
	while(!q.empty()&&flag==0)   //该点出队,它的下一层,即邻接结点入队(未遍历过的邻接结点),直到所有点都被遍历到
	{

		EdgeNode<T> *node ;
		node = &q.front();    //为啥是&
		cout<<"->"<<node->adjvex;

		node = node->pnext;
		while(node!=NULL)
		{

			int flag = 0;
			for (int i=0;i<n;i++)
			{
				if (adjlist[i]->adjvex==node->adjvex&&a[i]==0)
				{
					//cout<<" "<<adjlist[i]->adjvex;
					q.push(*adjlist[i]);
					a[i]=1;
				}
			}
			node=node->pnext;
		}
		if (!q.empty())
		{
			q.pop();
		}


		//for ()
		//{
		//}
		///./q.push(adjlist[i]);
	}
	flag=1;
	for (int i=0;i<n;i++)
	{
		if (a[i]==0)
		{
			flag=0;
		}
	}






}
template<class T>
void Graph<T>::CreatALGraph()
{
	//EdgeNode<T> *adjlist2 = adjlist;
	int i;
	int j;
	cout<<"输入顶点数";
	cin>>i;
	cout<<endl;
	n=i;
	for (i = 0;i<n;i++)
	{
		T data;
		cout<<"输入顶点值";
		cin>>data;
		adjlist[i] = new EdgeNode<T>;
		adjlist[i]->adjvex = data;
		adjlist[i]->pnext = NULL;

		cout<<adjlist[i]->adjvex<<endl;
		//adjlist++;


	}

	cout<<"输入边数";
	cin>>e;
	for (int i=0;i<e;i++)
	{
		int from;
		int to;
		cout<<endl<<"输入起点(节点序号)";
		cin>>from;
		cout<<endl<<"输入终点(节点序号)";
		cin>>to;
		EdgeNode<T> *node = new EdgeNode<T>;
		EdgeNode<T> *temp =  adjlist[from];
		while(temp->pnext!=NULL)
			temp = temp->pnext;
		node->adjvex = adjlist[to]->adjvex;
		node->pnext = NULL;
		temp->pnext = node;

		//adjlist[from] = node;
	}



}


int main(int argc, char* argv[])
{
	Graph<int> g;
	g.CreatALGraph();
	//g.BFSTraverse();
	//g.DFSTraverse();
	g.AOV();
	system("pause");
	return 0;
}





代码下载及其运行

代码下载地址:http://download.csdn.net/detail/yincheng01/6858815

解压密码:c.itcast.cn


下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:

1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”


2)在下拉框中选择相应项目,项目名和博客编号一致

3)点击“本地Windows调试器”运行


程序运行结果









posted on 2014-01-17 22:02  三少爷的剑123  阅读(148)  评论(0编辑  收藏  举报

导航