邻接表

  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 */

 

转载于:https://www.cnblogs.com/Asurudo/p/9427515.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值