资源简介
拓扑排序,可以输出所有可能的拓扑排序~~!!!
代码片段和文件信息
#include
using namespace std;
//函数结果状态代码
# define ERROR 0
# define INFEASIBLE -1
# define OVERFLOW -2
# define MAX_VERTEX_NUM 40
int *temp; //用于储存VERTEX_NUM次回归后得到的序列
//用于拓扑排序的图的邻接表的定义
typedef int Status;
typedef struct ArcNode{ //弧结点
int adjvex;
bool deleteed; //标志是否被删除
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{ //顶结点
char data; //顶点名称
int indegree;
bool deleteed; //标志是否被删除
ArcNode *firstarc;
}VNodeAdjList[MAX_VERTEX_NUM];
typedef struct{ //图
AdjList vertices;
int vexnumarcnum;
}ALGraph;
//int型的队列
class linkQueue
{
private:
struct QNode
{
int date;
QNode *next;
};
QNode *front;
QNode *rear;
public:
linkQueue()
{
front=rear=(QNode*)malloc(sizeof(QNode));
if (!front) exit(OVERFLOW);
front->next=NULL;
}
void Destroy()
{
while(front)
{
rear=front->next;
free(front);
front=rear;
}
front=rear=(QNode*)malloc(sizeof(QNode));
if (!front) exit(OVERFLOW);
front->next=NULL;
}
void EnQueue(int e)
{
QNode *p=new QNode;
if (!p) exit(OVERFLOW);
p->date=e;p->next=NULL;
rear->next=p;
rear=p;
}
int Size()
{
int count=0;
if (front==rear) return count;
QNode *p=front->next;
while(p)
{
++count;
p=p->next;
}
return count;
}
int DeQueue() //输出单个元素
{
int a;
if (front==rear) {cout<<“队列空!“< QNode *p=front->next;
a=p->date;
front->next=p->next;
if (rear==p) rear=front;
free(p);
return a;
}
void PrintQueue(ALGraph G) //用于输出全部队列元素
{
QNode *p=front->next;
while(p)
{
cout<date].data;
p=p->next;
}
cout< }
};
//建立邻接表
//定位顶点的函数
int LocateVex(ALGraph Gchar u)
{
int i;
for (i=0;i if(G.vertices[i].data==u) return i;
if (i==G.vexnum) {cout<<“错误的顶点名!“;exit(1);}
return -1;
}
//建立有向图的邻接表的函数
void CreateALGraph_adjlist(ALGraph &G)
{
int ijk;
char v1v2;
ArcNode *p;
cout<<“请输入顶点数和弧数:“;
cin>>G.vexnum>>G.arcnum;
cout<<“开始构造邻接表:“< for (i=0;i {
cout<<“输入第“< cin>>G.vertices[i].data;
G.vertices[i].deleteed=false;
G.vertices[i].firstarc=NULL;
G.vertices[i].indegree=0;
}
for (k=0;k {
cout<<“请输入第“< cin>>v1>>v2;
i=LocateVex(Gv1);
j=LocateVex(Gv2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->deleteed=false;
p->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;
G.vertices[j].indegree++;
}
return;
}
int *InDegree(ALGraph Gint &numint n) //返回一个int型数组的指针,内含图中0度顶点的序号num返回其0度顶点数n是初始的顶点个数
{
int *a=(int *)malloc(sizeof(int));
a[0]=-1; //a[0]=-1时无0度顶点
num=0;
for(int i=0j=0;i {
if (G.vertices[i].deleteed==true) //如果已经删除
continue;
if (G.vertices[i].indegree==0)
{
if (a[0]==-1)
{
a[0]=i;
++j;
++num;
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4793 2009-07-02 13:43 拓扑排序\chuopu.cpp
文件 4284 2009-07-01 17:13 拓扑排序\ChuoPu.dsp
文件 537 2009-07-01 15:39 拓扑排序\ChuoPu.dsw
文件 41984 2009-07-02 14:44 拓扑排序\ChuoPu.ncb
文件 53760 2009-07-02 14:44 拓扑排序\ChuoPu.opt
文件 1267 2009-07-02 13:43 拓扑排序\ChuoPu.plg
文件 532534 2009-07-02 13:43 拓扑排序\Debug\ChuoPu.exe
文件 263005 2009-07-02 13:43 拓扑排序\Debug\chuopu.obj
文件 1090560 2009-07-02 13:43 拓扑排序\Debug\ChuoPu.pdb
文件 110592 2009-07-02 13:43 拓扑排序\Debug\vc60.pdb
文件 417792 2009-07-02 16:33 拓扑排序\数据结构课程设计-拓扑排序.doc
目录 0 2009-10-25 09:28 拓扑排序\Debug
目录 0 2009-11-11 17:23 拓扑排序
----------- --------- ---------- ----- ----
2521108 13
评论
共有 条评论