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