鄰接表構建圖


 

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

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

剛開始的時候把頂點表初始化,指針指向null。然后邊表插入進來,是插入到前一個,也就是直接插入到firstedge指向的下一個,而后面的后移
 1 #include <stdio.h>  
 2 #include <stdlib.h>  
 3 //定義最大的定點的個數為100
 4 #define  MaxVertexNum 100  
 5   
 6 typedef char VertexType;
 7 /*邊表節點*/
 8 typedef struct node   
 9 {  
10    int adjvex;//指示具體頂點的存儲位置index
11    node* next;//下一個邊表節點的位置
12 }EdgeNode;
13 /*頂點表節點*/
14 typedef struct 
15 {  
16    VertexType vertex;//頂點名
17    EdgeNode* firstedge;//指示后繼的邊表節點
18 }VertexNode;  
19 //頂點表節點重命名 AdjList一維數組,依次從上向下存儲,index 0 1 2 3...
20 typedef VertexNode AdjList[MaxVertexNum];  
21 
22 typedef struct   
23 {   
24     AdjList adjlist; //頂點表數組
25     int n,e;         //定義了圖的頂點數和邊數
26 }ALGraph;  
27 /*創建無向圖的方法*/
28 void create(ALGraph*);  
29   
30 void main()  
31 {  
32     //為圖分配堆空間
33    ALGraph* G= (ALGraph*)malloc(sizeof(ALGraph));
34    //創建無向圖
35    create(G);
36    //循環圖的頂點數
37    for (int i=0;i< G->n;i++)  
38    {  
39        printf("%d->",i);
40        while(G->adjlist[i].firstedge!=NULL)  
41        {  
42             printf("%d->",G->adjlist[i].firstedge->adjvex);  
43             G->adjlist[i].firstedge=G->adjlist[i].firstedge->next;
44        }  
45        printf("\n");  
46    }  
47 }
48 /*創建無向圖的方法*/
49 void create(ALGraph* G)  
50 {  
51     int i,j,k,w,v;
52     //申明邊表節點
53     EdgeNode *s;
54     //確定一個圖的頂點數目和邊的數目
55     printf("讀入頂點數和邊數:\n");  
56     scanf("%d,%d",&G->n,&G->e);
57     //通過頂點的數目,建立頂點表
58     for (i=0;i<G->n;i++)  
59    {  
60        fflush(stdin);  
61        printf("建立頂點表");
62        //讀入頂點名
63        G->adjlist[i].vertex=getchar();
64        //每個頂點的指向為Null
65        G->adjlist[i].firstedge=NULL;  
66    }
67     //開始建立邊表
68    printf("建立邊表\n"); 
69    //通過邊數控制循環
70    for (k=0;k<G->e;k++)  
71    {  
72        //代表vi和vj之間存在邊
73        printf("讀入(vi-vj)的頂點對序號");  
74        scanf("%d,%d",&i,&j);
75        //為邊表分配空間
76        s=(EdgeNode*)malloc(sizeof(EdgeNode));  
77        s->adjvex=j;
78        s->next=G->adjlist[i].firstedge;  //插入表頭  
79        G->adjlist[i].firstedge=s;
80 
81        s=(EdgeNode*)malloc(sizeof(EdgeNode));  
82        s->adjvex=i;  
83        s->next=G->adjlist[j].firstedge;  
84        G->adjlist[j].firstedge=s;
85    }  
86 }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM