1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #define MaxVertexNodeNumSize 1000
6 #define MaxVertexNodeNameSize 100
7
8 struct VertexBodyNode
9 {
10 char VertexName[MaxVertexNodeNameSize];
11 int ArcWeight;
12 int VertexIndex;
13 struct VertexBodyNode *Next;
14 };
15
16 struct VertexHeadNode
17 {
18 char VertexName[MaxVertexNodeNameSize];
19 int VertexWeight;
20 struct VertexBodyNode *Next;
21 };
22
23 struct _Graph
24 {
25 struct VertexHeadNode VertexHeadNodeList[MaxVertexNodeNumSize];
26 int ArcNum,VertexNum;
27 };
28
29 int VertexName2Index(struct _Graph *UnsignedGraph,char *VName)
30 {
31 int i;
32 for(i = 0; i < UnsignedGraph -> VertexNum; i ++)
33 {
34 if(strcmp(UnsignedGraph -> VertexHeadNodeList[i].VertexName,VName)==0)
35 {
36 return i;
37 }
38 }
39 return -1;
40 }
41
42 void AddOneArc(struct _Graph *UnsignedGraph,int ArcIndex_1,int ArcIndex_2,int AWeight)
43 {
44 struct VertexBodyNode *BNode_1 = malloc(sizeof(struct VertexBodyNode));
45 struct VertexBodyNode *BNode_2 = malloc(sizeof(struct VertexBodyNode));
46
47 strcpy(BNode_1 -> VertexName,UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].VertexName);
48 strcpy(BNode_2 -> VertexName,UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].VertexName);
49 BNode_1 -> ArcWeight = AWeight;
50 BNode_2 -> ArcWeight = AWeight;
51 BNode_1 -> VertexIndex = ArcIndex_1;
52 BNode_2 -> VertexIndex = ArcIndex_2;
53 BNode_1 -> Next = BNode_2 -> Next = NULL;
54
55 struct VertexBodyNode *TmpPointer;
56 TmpPointer = UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next;
57 while(TmpPointer != NULL && TmpPointer -> Next != NULL)
58 {
59 TmpPointer = TmpPointer -> Next;
60 }
61 if(TmpPointer==NULL)
62 {
63 UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next = BNode_2;
64 }
65 else
66 {
67 TmpPointer -> Next = BNode_2;
68 }
69
70 TmpPointer = UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next;
71 while(TmpPointer != NULL && TmpPointer -> Next != NULL)
72 {
73 TmpPointer = TmpPointer -> Next;
74 }
75 if(TmpPointer==NULL)
76 {
77 UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next = BNode_1;
78 }
79 else
80 {
81 TmpPointer -> Next = BNode_1;
82 }
83 }
84
85 void DeleteOneArc(struct _Graph *UnsignedGraph,int ArcIndex_1,int ArcIndex_2)
86 {
87 struct VertexBodyNode *TmpPointer_1,*TmpPointer_2;
88
89 TmpPointer_1 = UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next;
90 TmpPointer_2 = UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next;
91
92 while(TmpPointer_2!=NULL && TmpPointer_2->VertexIndex!=ArcIndex_2)
93 {
94 TmpPointer_1 = TmpPointer_2;
95 TmpPointer_2 = TmpPointer_2 -> Next;
96 }
97
98 if(TmpPointer_2==NULL)
99 {
100 return ;
101 }
102 else if(TmpPointer_1 == TmpPointer_2)
103 {
104 UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next = NULL;
105 free(TmpPointer_2);
106 }
107 else
108 {
109 TmpPointer_1 -> Next = TmpPointer_2 -> Next;
110 free(TmpPointer_2);
111 }
112
113 TmpPointer_1 = UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next;
114 TmpPointer_2 = UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next;
115
116 while(TmpPointer_2!=NULL && TmpPointer_2->VertexIndex!=ArcIndex_1)
117 {
118 TmpPointer_1 = TmpPointer_2;
119 TmpPointer_2 = TmpPointer_2 -> Next;
120 }
121
122 if(TmpPointer_2==NULL)
123 {
124 return ;
125 }
126 else if(TmpPointer_1 == TmpPointer_2)
127 {
128 UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next = NULL;
129 free(TmpPointer_2);
130 }
131 else
132 {
133 TmpPointer_1 -> Next = TmpPointer_2 -> Next;
134 free(TmpPointer_2);
135 }
136 }
137
138 struct _Graph *UGCreat(int ArcSum,int VertexSum)
139 {
140 int i,j;
141 struct _Graph *UnsignedGraph = malloc(sizeof(struct _Graph));
142 UnsignedGraph -> ArcNum = ArcSum;
143 UnsignedGraph -> VertexNum = VertexSum;
144
145 for(i = 0; i < VertexSum; i ++)
146 {
147 scanf("%s %d",UnsignedGraph -> VertexHeadNodeList[i].VertexName,&UnsignedGraph -> VertexHeadNodeList[i].VertexWeight);
148 }
149
150 for(i = 0; i < VertexSum; i ++)
151 {
152 UnsignedGraph -> VertexHeadNodeList[i].Next = NULL;
153 }
154
155 for(i = 0; i < ArcSum; i ++)
156 {
157 char Arc_1[MaxVertexNodeNameSize];
158 char Arc_2[MaxVertexNodeNameSize];
159 int ArcIndex_1;
160 int ArcIndex_2;
161 int ArcWeight;
162
163 scanf("%s %s %d",Arc_1,Arc_2,&ArcWeight);
164
165 ArcIndex_1 = VertexName2Index(UnsignedGraph,Arc_1);
166 ArcIndex_2 = VertexName2Index(UnsignedGraph,Arc_2);
167
168 AddOneArc(UnsignedGraph,ArcIndex_1,ArcIndex_2,ArcWeight);
169 }
170 return UnsignedGraph;
171 }
172
173 void Travel(struct _Graph *UnsignedGraph)
174 {
175 char StartingPoint[MaxVertexNodeNameSize];
176 char OverPoint[MaxVertexNodeNameSize];
177
178 printf("Input start and over\n");
179 scanf("%s %s",StartingPoint,OverPoint);
180
181 int StartIndex = VertexName2Index(UnsignedGraph,StartingPoint);
182 int OverIndex = VertexName2Index(UnsignedGraph,OverPoint);
183
184 struct VertexBodyNode *TmpPointer;
185 TmpPointer = UnsignedGraph -> VertexHeadNodeList[StartIndex].Next;
186 while(TmpPointer != NULL && TmpPointer -> Next != NULL)
187 {
188 if(OverIndex==TmpPointer -> VertexIndex)
189 {
190 printf("Distance:%d GetVertexPointSum:%d",TmpPointer->ArcWeight
191 ,UnsignedGraph -> VertexHeadNodeList[StartIndex].VertexWeight+UnsignedGraph -> VertexHeadNodeList[OverIndex].VertexWeight);
192 break;
193 }
194 else
195 {
196 TmpPointer = TmpPointer -> Next;
197 }
198 }
199 }
200
201 int main()
202 {
203 struct _Graph *G = UGCreat(8,5);
204
205 // char s1[MaxVertexNodeNameSize],s2[MaxVertexNodeNameSize];
206 // scanf("%s %s",s1,s2);
207 // DeleteOneArc(G,VertexName2Index(G,s1),VertexName2Index(G,s2));
208 printf("\n");
209 Travel(G);
210 return 0;
211 }
212
213 /*
214 beijing 18
215 zhengzhou 10
216 hefei 9
217 nanjing 12
218 guangzhou 14
219 beijing zhengzhou 7
220 beijing hefei 9
221 beijing nanjing 8
222 zhengzhou hefei 5
223 hefei nanjing 3
224 zhengzhou guangzhou 7
225 hefei guangzhou 8
226 nanjing guangzhou 6
227
228 */