閱讀783 返回首頁    go 小米 go 小米6


圖的鄰接表存儲 c實現


圖的鄰接表存儲 c實2011-10-07 10:34 4047人閱讀 評論(2) 收藏 舉報

存儲cstruct數據結構null編程

 

用到的數據結構是

一個是頂點表,包括頂點和指向下一個鄰接點的指針

一個是邊表, 數據結構跟頂點不同,存儲的是頂點的序號,和指向下一個的指針

剛開始的時候把頂點表初始化,指針指向null。然後邊表插入進來,是插入到前一個,也就是直接插入到firstedge指向的下一個,而後麵的後移

 

  1. #define  MaxVertexNum 100  
  2.   
  3. typedef char VertexType;  
  4. typedef struct node   //邊表節點  
  5. {  
  6.    int adjvex;  
  7.    node* next;  
  8. }EdgeNode;  
  9.   
  10. typedef struct     //頂點表節點  
  11. {  
  12.    VertexType vertex;  
  13.    EdgeNode* firstedge;  
  14. }VertexNode;  
  15.   
  16. typedef VertexNode AdjList[MaxVertexNum];  
  17.   
  18. typedef struct   
  19. {   
  20.     AdjList adjlist;  
  21.     int n,e;  
  22.   
  23. }ALGraph;  


以下建立的是無向圖的鄰接表,有向圖的更簡單了

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. #define  MaxVertexNum 100  
  5.   
  6. typedef char VertexType;  
  7. typedef struct node   //邊表節點  
  8. {  
  9.    int adjvex;  
  10.    node* next;  
  11. }EdgeNode;  
  12.   
  13. typedef struct     //頂點表節點  
  14. {  
  15.    VertexType vertex;  
  16.    EdgeNode* firstedge;  
  17. }VertexNode;  
  18.   
  19. typedef VertexNode AdjList[MaxVertexNum];  
  20.   
  21. typedef struct   
  22. {   
  23.     AdjList adjlist;  
  24.     int n,e;  
  25.   
  26. }ALGraph;  
  27.   
  28. void create(ALGraph*);  
  29.   
  30. void main()  
  31. {  
  32.    ALGraph* G= (ALGraph*)malloc(sizeof(ALGraph));  
  33.    create(G);  
  34.    for (int i=0;i< G->n;i++)  
  35.    {  
  36.        printf("%d->",i);  
  37.        while(G->adjlist[i].firstedge!=NULL)  
  38.        {  
  39.             printf("%d->",G->adjlist[i].firstedge->adjvex);  
  40.             G->adjlist[i].firstedge=G->adjlist[i].firstedge->next;  
  41.   
  42.        }  
  43.        printf("\n");  
  44.    }  
  45. }  
  46. void create(ALGraph* G)  
  47. {  
  48.     int i,j,k,w,v;  
  49.     EdgeNode *s;  
  50.     printf("讀入頂點數和邊數");  
  51.     scanf("%d,%d",&G->n,&G->e);  
  52.   
  53.     
  54.    for (i=0;i<G->n;i++)  
  55.    {  
  56.        fflush(stdin);  
  57.        printf("建立頂點表");  
  58.        G->adjlist[i].vertex=getchar();  
  59.        G->adjlist[i].firstedge=NULL;  
  60.    }  
  61.    printf("建立邊表\n");  
  62.    for (k=0;k<G->e;k++)  
  63.    {  
  64.        printf("讀入(vi-vj)的頂點對序號");  
  65.        scanf("%d,%d",&i,&j);  
  66.        s=(EdgeNode*)malloc(sizeof(EdgeNode));  
  67.        s->adjvex=j;  
  68.        s->next=G->adjlist[i].firstedge;  //插入表頭  
  69.        G->adjlist[i].firstedge=s;  
  70.        s=(EdgeNode*)malloc(sizeof(EdgeNode));  
  71.        s->adjvex=i;  
  72.        s->next=G->adjlist[j].firstedge;  
  73.        G->adjlist[j].firstedge=s;  
  74.   
  75.    }  
  76. }  


結果

自己也編程試試吧!

接下來圖的遍曆,深度優先遍曆和廣度優先遍曆

最後更新:2017-04-03 12:54:00

  上一篇:go viewgroup實現item拖動效果
  下一篇:go PHP算法 參數組合,多個分類不同組合列表