-
Notifications
You must be signed in to change notification settings - Fork 0
/
graphlist.cpp
98 lines (90 loc) · 2.63 KB
/
graphlist.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "graphlist.h"
template <class T>
GraphList<T> :: GraphList(int numVert):Graph(numVert) {
graList = new LList <listUnit,T>[numVertex];
}
template <class T>
Edge GraphList<T> :: FirstEdge(int oneVertex) {
Edge myEdge;
myEdge.from = oneVertex;
Link<listUnit,T> * temp = graList[oneVertex].head;
if(temp->next != NULL) {
myEdge.to = temp->next->element.vertex;
myEdge.weight = temp->next->element.weight;
}
return myEdge;
}
template <class T>
Edge GraphList<T> :: NextEdge(Edge preEdge) {
Edge myEdge;
myEdge.from = preEdge.from;
Link <listUnit,T> * temp = graList[preEdge.from].head;
while(temp->next != NULL && temp->next->element.vertex <= preEdge.to) {
temp = temp->next;
}
if(temp->next != NULL) {
myEdge.to = temp->next->element.vertex;
myEdge.weight = temp->next->element.weight;
}
return myEdge;
}
template <class T>
void GraphList<T> :: setEdge(int from, int to, int weight) {
Link<listUnit,T> * temp = graList[from].head;
while(temp->next != NULL && temp->next->element.vertex < to) {
temp = temp->next;
}
if(temp->next == NULL) {
temp->next = new Link<listUnit,T>;
temp->next->element.vertex = to;
temp->next->element.weight = weight;
numEdge++;
Indegree[to]++;
return;
}
if(temp->next->element.vertex == to) {
temp->next->element.weight = weight;
return;
}
if(temp->next->element.vertex > to) {
Link<listUnit,T> * other = temp->next;
temp->next = new Link<listUnit,T>;
temp->next->element.vertex = to;
temp->next->element.weight = weight;
temp->next->next = other;
numEdge++;
Indegree[to]++;
return;
}
}
template <class T>
void GraphList<T> :: delEdge(int from, int to) {
Link<listUnit,T> * temp = graList[from].head;
while(temp->next != NULL && temp->next->element.vertex < to) {
temp = temp->next;
}
if(temp->next == NULL) return;
if(temp->next->element.vertex > to) return;
if(temp->next->element.vertex == to) {
Link<listUnit,T> * other = temp->next->next;
delete temp->next;
temp->next = other;
numEdge--;
Indegree[to]--;
return;
}
}
template <class T>
void GraphList<T> :: SetNode(int i, T v, T n) {
graList[i].head->SetLinkValue(v, n);
}
template <class T>
bool GraphList<T> :: is_Station_Repeat(int n, T s) {
for (int i = 0; i < n; i++) {
graList[i].head->visit_Link_Value();
}
}
template <class T>
T GraphList<T> :: VisitNode(int i) {
return graList[i].head->VisitValue();
}