一個是頂點表,包括頂點和指向下一個鄰接點的指針
一個是邊表, 數據結構跟頂點不同,存儲的是頂點的序號,和指向下一個的指針
剛開始的時候把頂點表初始化,指針指向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 }