• 邻接表


      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 */
  • 相关阅读:
    MSF 内网渗透笔记
    weblogic 安装部署详解
    获取指定ip段的所有存活主机的主机名和操作系统
    中间件安全加固之Jboss
    window下JBoss7 安装部署
    Window日志分析
    Apache安全配置基线指导
    dedeCMS解码
    日志分析技巧
    利用开源软件打造一个团队贡献平台
  • 原文地址:https://www.cnblogs.com/Asurudo/p/9427515.html
Copyright © 2020-2023  润新知