做个记录
//
// main.cpp
// graph
//
// Created by yiqiao on 16/4/21.
// Copyright 2016年 yiqiao. All rights reserved.
//
#include <iostream>
#include <stack>
class node;
typedef node* nodeptr;
class node{
public:
int V;
nodeptr next;
};
class graphNode
{
public:
int degree;//入度
nodeptr head;//头节点
};
#define MAXV 10
graphNode graph[MAXV];//graph[0]未用
int n = 7;
void newEdge(int i,int j)
{
node * pNode = new node;
pNode->V = j;
pNode->next = NULL;
nodeptr last = graph[i].head;
while (last){
if (last->next == NULL)
break;
last = last->next;
}
last->next = pNode;
graph[j].degree++;
}
void initGraph()
{
for (int i = 1; i <= n; i++){
graph[i].degree = 0;
graph[i].head = new node;
graph[i].head->V = i;
graph[i].head->next = NULL;
}
newEdge(1, 2);
newEdge(1, 4);
newEdge(1, 3);
newEdge(2, 5);
newEdge(2, 4);
newEdge(3, 6);
newEdge(4, 3);
newEdge(4, 6);
newEdge(4, 7);
newEdge(5, 4);
newEdge(5, 7);
newEdge(7, 6);
}
void topsort()
{
std::stack<graphNode*> s;
for (int i = 1; i <= n; i++){
if (graph[i].degree == 0)
s.push(&graph[i]);
}
while(!s.empty()){
graphNode* node = s.top();
s.pop();
std::cout << node->head->V << " ";
nodeptr link = node->head->next;
while (link){
if (--graph[link->V].degree <= 0){
s.push(&graph[link->V]);
}
link = link->next;
}
}
std::cout << std::endl;
}
void printGraph()
{
for (int i = 1; i <= n; i++){
std::cout << graph[i].degree << " edge:";
nodeptr node = graph[i].head;
while (node) {
nodeptr next = node->next;
if (next)
std::cout <<node->V<< "->";
else
std::cout <<node->V;
node = next;
}
std::cout << std::endl;
}
}
void freeGraph()
{
for (int i = 1; i <= n; i++){
nodeptr node = graph[i].head->next;
while (node) {
nodeptr next = node->next;
delete node;
node = next;
}
delete graph[i].head;
}
}
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
initGraph();
printGraph();
topsort();
freeGraph();
return 0;
}