邻接表DFS&&BFS
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 //Real capacity is CircularQueueMaxSize -1 30 #define CircularQueueMaxSize 1000 31 32 typedef int ElementType; 33 34 struct CircularQueue 35 { 36 ElementType QueueData[CircularQueueMaxSize]; 37 int Front; 38 int Rear; 39 }; 40 41 int CircularQueueIsEmpty(struct CircularQueue *Queue) 42 { 43 return (Queue -> Front == Queue -> Rear); 44 } 45 46 int CircularQueueIsFull(struct CircularQueue *Queue) 47 { 48 return ((Queue -> Rear + 1) % CircularQueueMaxSize == Queue -> Front); 49 } 50 51 struct CircularQueue *CircularQueueInit() 52 { 53 struct CircularQueue *Queue; 54 Queue = malloc(sizeof(struct CircularQueue)); 55 56 Queue -> Front = Queue -> Rear = 0; 57 58 return Queue; 59 } 60 61 //if Queue is full,return 1 62 int CircularQueueEnqueue(struct CircularQueue *Queue,ElementType ToBeEnqueue) 63 { 64 if(CircularQueueIsFull(Queue)) 65 { 66 return 1; 67 } 68 else 69 { 70 Queue -> Rear = (Queue -> Rear + 1) % CircularQueueMaxSize; 71 Queue -> QueueData[Queue -> Rear] = ToBeEnqueue; 72 } 73 return 0; 74 } 75 76 //if Queue is empty,return 1 77 ElementType CircularQueueTop(struct CircularQueue *Queue) 78 { 79 if(CircularQueueIsEmpty(Queue)) 80 { 81 return ; 82 } 83 else 84 { 85 return Queue -> QueueData[(Queue -> Front + 1) % CircularQueueMaxSize]; 86 } 87 return ; 88 } 89 90 //if Queue is empty,return 1 91 int CircularQueueDequeue(struct CircularQueue *Queue) 92 { 93 if(CircularQueueIsEmpty(Queue)) 94 { 95 return 1; 96 } 97 else 98 { 99 Queue -> Front = (Queue -> Front + 1) % CircularQueueMaxSize; 100 return 0; 101 } 102 } 103 104 int MakeCircularQueueEmpty(struct CircularQueue *Queue) 105 { 106 Queue -> Front = Queue -> Rear = 0; 107 108 return 0; 109 } 110 111 int CircularQueueDelete(struct CircularQueue *Queue) 112 { 113 free(Queue); 114 Queue = NULL; 115 return 0; 116 } 117 118 int VertexName2Index(struct _Graph *UnsignedGraph,char *VName) 119 { 120 int i; 121 for(i = 0; i < UnsignedGraph -> VertexNum; i ++) 122 { 123 if(strcmp(UnsignedGraph -> VertexHeadNodeList[i].VertexName,VName)==0) 124 { 125 return i; 126 } 127 } 128 return -1; 129 } 130 131 void AddOneArc(struct _Graph *UnsignedGraph,int ArcIndex_1,int ArcIndex_2,int AWeight) 132 { 133 struct VertexBodyNode *BNode_1 = malloc(sizeof(struct VertexBodyNode)); 134 struct VertexBodyNode *BNode_2 = malloc(sizeof(struct VertexBodyNode)); 135 136 strcpy(BNode_1 -> VertexName,UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].VertexName); 137 strcpy(BNode_2 -> VertexName,UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].VertexName); 138 BNode_1 -> ArcWeight = AWeight; 139 BNode_2 -> ArcWeight = AWeight; 140 BNode_1 -> VertexIndex = ArcIndex_1; 141 BNode_2 -> VertexIndex = ArcIndex_2; 142 BNode_1 -> Next = BNode_2 -> Next = NULL; 143 144 struct VertexBodyNode *TmpPointer; 145 TmpPointer = UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next; 146 while(TmpPointer != NULL && TmpPointer -> Next != NULL) 147 { 148 TmpPointer = TmpPointer -> Next; 149 } 150 if(TmpPointer==NULL) 151 { 152 UnsignedGraph -> VertexHeadNodeList[ArcIndex_1].Next = BNode_2; 153 } 154 else 155 { 156 TmpPointer -> Next = BNode_2; 157 } 158 159 TmpPointer = UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next; 160 while(TmpPointer != NULL && TmpPointer -> Next != NULL) 161 { 162 TmpPointer = TmpPointer -> Next; 163 } 164 if(TmpPointer==NULL) 165 { 166 UnsignedGraph -> VertexHeadNodeList[ArcIndex_2].Next = BNode_1; 167 } 168 else 169 { 170 TmpPointer -> Next = BNode_1; 171 } 172 } 173 174 struct _Graph *UGCreat(int ArcSum,int VertexSum) 175 { 176 int i,j; 177 struct _Graph *UnsignedGraph = malloc(sizeof(struct _Graph)); 178 UnsignedGraph -> ArcNum = ArcSum; 179 UnsignedGraph -> VertexNum = VertexSum; 180 181 for(i = 0; i < VertexSum; i ++) 182 { 183 scanf("%s %d",UnsignedGraph -> VertexHeadNodeList[i].VertexName,&UnsignedGraph -> VertexHeadNodeList[i].VertexWeight); 184 } 185 186 for(i = 0; i < VertexSum; i ++) 187 { 188 UnsignedGraph -> VertexHeadNodeList[i].Next = NULL; 189 } 190 191 for(i = 0; i < ArcSum; i ++) 192 { 193 char Arc_1[MaxVertexNodeNameSize]; 194 char Arc_2[MaxVertexNodeNameSize]; 195 int ArcIndex_1; 196 int ArcIndex_2; 197 int ArcWeight; 198 199 scanf("%s %s %d",Arc_1,Arc_2,&ArcWeight); 200 201 ArcIndex_1 = VertexName2Index(UnsignedGraph,Arc_1); 202 ArcIndex_2 = VertexName2Index(UnsignedGraph,Arc_2); 203 204 AddOneArc(UnsignedGraph,ArcIndex_1,ArcIndex_2,ArcWeight); 205 } 206 return UnsignedGraph; 207 } 208 209 void Travel(struct _Graph *UnsignedGraph) 210 { 211 char StartingPoint[MaxVertexNodeNameSize]; 212 char OverPoint[MaxVertexNodeNameSize]; 213 214 printf("Input start and over\n"); 215 scanf("%s %s",StartingPoint,OverPoint); 216 217 int StartIndex = VertexName2Index(UnsignedGraph,StartingPoint); 218 int OverIndex = VertexName2Index(UnsignedGraph,OverPoint); 219 220 struct VertexBodyNode *TmpPointer; 221 TmpPointer = UnsignedGraph -> VertexHeadNodeList[StartIndex].Next; 222 while(TmpPointer != NULL && TmpPointer -> Next != NULL) 223 { 224 if(OverIndex==TmpPointer -> VertexIndex) 225 { 226 printf("Distance:%d GetVertexPointSum:%d",TmpPointer->ArcWeight 227 ,UnsignedGraph -> VertexHeadNodeList[StartIndex].VertexWeight+UnsignedGraph -> VertexHeadNodeList[OverIndex].VertexWeight); 228 break; 229 } 230 else 231 { 232 TmpPointer = TmpPointer -> Next; 233 } 234 } 235 } 236 237 void _UGDFS(struct _Graph *UnsignedGraph,int *Visit,int Index) 238 { 239 Visit[Index] = 1; 240 // printf("%s %d ",UnsignedGraph -> VertexHeadNodeList[Index].VertexName,UnsignedGraph -> VertexHeadNodeList[Index].VertexWeight); 241 242 struct VertexBodyNode *TmpPointer = UnsignedGraph -> VertexHeadNodeList[Index].Next; 243 while(TmpPointer) 244 { 245 if(!Visit[TmpPointer->VertexIndex]) 246 { 247 printf("%s->%s\n",UnsignedGraph -> VertexHeadNodeList[Index].VertexName,UnsignedGraph -> VertexHeadNodeList[TmpPointer->VertexIndex].VertexName); 248 _UGDFS(UnsignedGraph,Visit,TmpPointer->VertexIndex); 249 } 250 TmpPointer = TmpPointer -> Next; 251 } 252 } 253 254 void UnsignedGraphDFS(struct _Graph *UnsignedGraph) 255 { 256 int Visit[UnsignedGraph->VertexNum]; 257 memset(Visit,0,sizeof(Visit)); 258 259 int i; 260 for(i = 0;i < UnsignedGraph->VertexNum;i ++) 261 { 262 if(!Visit[i]) 263 { 264 _UGDFS(UnsignedGraph,Visit,i); 265 } 266 } 267 } 268 269 void UnsignedGraphBFS(struct _Graph *UnsignedGraph) 270 { 271 int Visit[UnsignedGraph->VertexNum]; 272 memset(Visit,0,sizeof(Visit)); 273 274 struct CircularQueue *Queue; 275 Queue = CircularQueueInit(); 276 277 int i; 278 for(i = 0;i < UnsignedGraph->VertexNum;i ++) 279 { 280 if(!Visit[i]) 281 { 282 Visit[i] = 1; 283 //printf("%s %d ",UnsignedGraph -> VertexHeadNodeList[i].VertexName,UnsignedGraph -> VertexHeadNodeList[i].VertexWeight); 284 CircularQueueEnqueue(Queue,i); 285 286 while(!CircularQueueIsEmpty(Queue)) 287 { 288 int TmpIndex = CircularQueueTop(Queue); 289 CircularQueueDequeue(Queue); 290 struct VertexBodyNode *TmpPointer = UnsignedGraph -> VertexHeadNodeList[TmpIndex].Next; 291 292 while(TmpPointer) 293 { 294 if(!Visit[TmpPointer->VertexIndex]) 295 { 296 Visit[TmpPointer->VertexIndex] = 1; 297 // printf("%s %d ",UnsignedGraph -> VertexHeadNodeList[TmpPointer->VertexIndex].VertexName,UnsignedGraph -> VertexHeadNodeList[TmpPointer->VertexIndex].VertexWeight); 298 printf("%s->%s\n",UnsignedGraph -> VertexHeadNodeList[TmpIndex].VertexName,UnsignedGraph -> VertexHeadNodeList[TmpPointer->VertexIndex].VertexName); 299 CircularQueueEnqueue(Queue,TmpPointer->VertexIndex); 300 } 301 TmpPointer = TmpPointer -> Next; 302 } 303 } 304 } 305 } 306 } 307 308 int main() 309 { 310 struct _Graph *G = UGCreat(8,5); 311 312 //Travel(G); 313 printf("\nDFS:\n"); 314 UnsignedGraphDFS(G); 315 printf("\nBFS:\n"); 316 UnsignedGraphBFS(G); 317 return 0; 318 } 319 320 /* 321 beijing 18 322 zhengzhou 10 323 hefei 9 324 nanjing 12 325 guangzhou 14 326 beijing zhengzhou 7 327 beijing hefei 9 328 beijing nanjing 8 329 zhengzhou hefei 5 330 hefei nanjing 3 331 zhengzhou guangzhou 7 332 hefei guangzhou 8 333 nanjing guangzhou 6 334 */