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 "); 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(" "); 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 */