深度优先遍历非递归实现,图采用邻接表表示

1 #include
2 #define MAXSIZE 100
3 #define MAXVERTEX 100
4 struct Node {
5 int vertex;
6 struct Node *next;
7 };
8 struct stack {
9 struct Node *listarray[MAXSIZE];
10 int top;
11 };
12 struct stack s;
13 struct Node *adjlist[MAXVERTEX];
14 int visited[MAXVERTEX];
15
16 void init()
17 {
18 s.top = 0;
19 }
20
21 void push(struct Node *p)
22 {
23 s.listarray[s.top++] = p;
24 }
25
26 struct Node *pop()
27 {
28 return s.listarray[--s.top];
29 }
30
31 int isEmpty()
32 {
33 return s.top == 0;
34 }
35
36 void setup(int n)
37 {
38 int u,v,i;
39 struct Node *p;
40 for (i=0;i41 adjlist[i] = NULL;
42 scanf("%d%d",&u,&v);
43 while (u>=0) {
44 p = (struct Node *)malloc(sizeof(struct Node));
45 p->vertex = v;
46 p->next = adjlist[u];
47 adjlist[u] = p;
48 scanf("%d%d",&u,&v);
49 }
50 }
51
52 void DFS(int u)
53 {
54 struct Node *p;
55 int v;
56 printf("%d ",u);
57 visited[u] = 1;
58 p = adjlist[u];
59 do {
60 while (p != NULL) {
61 if(visited[p->vertex] == 0) {
62 v = p->vertex;
63 visited[v] = 1;
64 printf("%d ",v);
66 push(p);
67 p = adjlist[v];
68 }
69 else {
70 p = p->next;
71 }
72 }
73 if(!isEmpty()) {
74 p = pop();
75 p = p->next;
76 }
77 }while(!(p == NULL && isEmpty()));
78 }
79
80 void main()
81 {
82 int n,i;
83 init();
84 printf("Please input vertex number of graph: ");
85 scanf("%d",&n);
86 for (i=0;i87 setup(n);
88 printf("Order in travers by dfs : ");
89 DFS(0);
90 }

相关文档
最新文档