#include<iostream>
using namespace std;
#define Inf 65535
#define NotAVerter -1
int time = 0; //全局变量
/////////////////////邻接链表的相关定义//////////////////////
typedef struct EdgeNode *position;
typedef struct Led_table* Table;
struct EdgeNode //边表结点
{
int adjvex; // 邻接点域,存储该顶点对应的下标
int color; //此标志表示对应的节点是否已经搜索到,0为白色,1为灰色,2为黑色
int t_start;
int t_finish;
int precursor; //此数据记录该节点在广度优先树种的前驱节点
position next; // 链域,指向下一个邻接点
};
struct Led_table // 邻接表结构
{
int data; //邻接表的大小
position *firstedge; //边表头指针,可以理解为数组
};
//////////////////////////邻接链表相关函数定义///////////////
Table Creat_Lable(int MaxElements) //MaxElements参数为希望创建的节点数
{
Table table1 = static_cast<Table> (malloc(sizeof(struct Led_table)));
table1->data = MaxElements;
if (table1 == NULL)
{
cout << "out of space!!!";
}
table1->firstedge = static_cast<position*>(malloc(sizeof(position)*(table1->data)));
if (table1->firstedge == NULL)
{
cout << "out of space!!!";
}
//给每个表头赋值,从0开始
for (int i = 0; i <= table1->data - 1; ++i)
{
table1->firstedge[i] = static_cast<position>(malloc(sizeof(EdgeNode))); //申请一个节点
if (table1->firstedge[i] == NULL)
{
cout << "out of space!!!";
}
table1->firstedge[i]->adjvex = 0; //表头这个参数没有意义
table1->firstedge[i]->color = 0; //全部设置为白色
table1->firstedge[i]->t_start = 0;
table1->firstedge[i]->t_finish = 0;
table1->firstedge[i]->precursor = NotAVerter;
table1->firstedge[i]->next = NULL;
}
return table1;
}
void Insert(Table table1, int v, int w) //表示存在一条边为<v,w>
{
position p = static_cast<position>(malloc(sizeof(EdgeNode))); //申请一个节点
if (p == NULL)
{
cout << "out of space!!!";
}
p->adjvex = w;
p->color = 0; //对于普通节点来说无意义
p->t_finish = 0;
p->t_start = 0;
p->precursor = NotAVerter; //对于普通节点来说无意义
p->next = table1->firstedge[v]->next;
table1->firstedge[v]->next = p;
}
/////////////////////////////////深度优先搜索算法/////////////////////////////////
void Dfs_Visit(Table table1, int u)
{
time = time + 1;
table1->firstedge[u]->t_start = time;
table1->firstedge[u]->color = 1;
position p = table1->firstedge[u]->next;
while (p != NULL)
{
if (table1->firstedge[p->adjvex]->color == 0)
{
table1->firstedge[p->adjvex]->precursor = u;
Dfs_Visit(table1, p->adjvex);
}
p = p->next;
}
table1->firstedge[u]->color = 2;
time++;
table1->firstedge[u]->t_finish = time;
}
int main()
{
Table table_1 = Creat_Lable(6); //创建一个大小为8的邻接表
Insert(table_1, 0, 1); Insert(table_1, 0, 3);
Insert(table_1, 1, 4);
Insert(table_1, 2, 5);
Insert(table_1, 3, 1);
Insert(table_1, 4, 3); Insert(table_1, 4, 2);
Insert(table_1, 5, 5);
Dfs_Visit(table_1, 0);
for (int i = 0; i <= table_1->data - 1; ++i)
{
cout << "结点" << i << "的起始时间为" << table_1->firstedge[i]->t_start
<< "结束时间为" << table_1->firstedge[i]->t_finish << endl;
}
return 0;
}
夜深了。