邻接图的优点就是,现用现申请,空间存储很灵活,并且需要的空间也很小。我们在做复杂网络时,通常也是用这种方法。缺点是不适合并行化,因为cuda只支持连续地址空间的拷贝。
数据结构
主要包括,边节点和顶点节点
typedef struct edgeNode{
int num;
int weight;
struct edgeNode * next;
}edgeNode;
typedef struct vertexNode{
char data;
edgeNode * firstNode;
}vertexNode,List[NUM];
typedef struct Graph{
List list;
int numver,numedges;
}Graph;
深度优先遍历
与矩阵图类似
void DFS(Graph *g,int i){
edgeNode *p = (edgeNode *)malloc(sizeof(edgeNode));
visited[i] = 1;
printf("%c ",g->list[i].data);
p = g->list[i].firstNode;
while(p){
if(!visited[p->num])
DFS(g,p->num);
p = p->next;
}
}
void DFSTraverse(Graph *g){
int i;
for(i=0;i<g->numver;i++)
visited[i] = 0;
for(i=0;i<g->numver;i++)
if(!visited[i])
DFS(g,i);
}
广度优先遍历
void BFSTraverse(Graph *g){
int i;
edgeNode *p;
Queue *q = (Queue *)malloc(sizeof(Queue));
for(i=0;i<g->numver;i++)
visited[i] = 0;
initQueue(q,0);
for(i=0;i<g->numver;i++){
if(!visited[i]){
visited[i] = 1;
printf("%c ",g->list[i].data);
inQueue(q,i);
while(getLength(q)){
int *tar = (int *)malloc(sizeof(int));
outQueue(q,tar);
p = g->list[*tar].firstNode;
while(p){
if(!visited[p->num]){
visited[p->num] = 1;
printf("%c ",g->list[p->num].data);
inQueue(q,p->num);
}
p = p->next;
}
}
}
}
}
示例图
示例代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define NUM 5
4 #define MAXSIZE NUM
5
6 typedef struct edgeNode{
7 int num;
8 int weight;
9 struct edgeNode * next;
10 }edgeNode;
11
12 typedef struct vertexNode{
13 char data;
14 edgeNode * firstNode;
15 }vertexNode,List[NUM];
16
17 typedef struct Graph{
18 List list;
19 int numver,numedges;
20 }Graph;
21
22 typedef struct Queue{
23 int data[NUM];
24 int front;
25 int rear;
26 }Queue;
27
28 void initQueue(Queue *q,int n);
29 void showQueue(Queue *q);
30 int getLength(Queue *q);
31 int inQueue(Queue *q,int num);
32 int outQueue(Queue *q,int *tar);
33
34 void createGraph(Graph *g);
35 void showGraph(Graph *g);
36 void add(Graph *g,int a,int b,int c);
37 void DFS(Graph *g,int i);
38 void DFSTraverse(Graph *g);
39 void BFSTraverse(Graph *g);
40
41 int visited[NUM];
42
43 int main()
44 {
45 Graph * g = (Graph *)malloc(sizeof(Graph));
46 createGraph(g);
47 showGraph(g);
48 printf("\n");
49 DFSTraverse(g);
50 printf("\n");
51 BFSTraverse(g);
52 return 0;
53 }
54 void add(Graph *g,int a,int b,int c){
55 edgeNode *e;
56
57 e = (edgeNode *)malloc(sizeof(edgeNode));
58 e->next = g->list[a].firstNode;
59 g->list[a].firstNode = e;
60 e->num = b;
61 e->weight = c;
62
63 e = (edgeNode *)malloc(sizeof(edgeNode));
64 e->next = g->list[b].firstNode;
65 g->list[b].firstNode = e;
66 e->num = a;
67 e->weight = c;
68
69 g->numedges++;
70
71
72 }
73
74 void createGraph(Graph *g){
75 int i;
76 for(i=0;i<NUM;i++){
77 g->list[i].data = 65+i;
78 g->list[i].firstNode = NULL;
79 }
80 g->numver = NUM;
81 g->numedges = 0;
82 //添加顶点0的边
83 add(g,0,1,0);
84 add(g,0,2,0);
85 add(g,0,3,0);
86 add(g,0,4,0);
87
88 add(g,1,3,0);
89 add(g,1,4,0);
90
91 add(g,2,4,0);
92
93 add(g,3,4,0);
94 }
95 void showGraph(Graph *g){
96 int i;
97 for(i=0;i<g->numver;i++){
98 printf("g[%d] ",i);
99 edgeNode *p = (edgeNode *)malloc(sizeof(edgeNode));
100 p = g->list[i].firstNode;
101 while(p){
102 printf("->%d(%d)",p->num,p->weight);
103 p = p->next;
104 }
105 printf("->null\n");
106 }
107 }
108
109 void DFS(Graph *g,int i){
110 edgeNode *p = (edgeNode *)malloc(sizeof(edgeNode));
111 visited[i] = 1;
112 printf("%c ",g->list[i].data);
113 p = g->list[i].firstNode;
114 while(p){
115 if(!visited[p->num])
116 DFS(g,p->num);
117 p = p->next;
118 }
119 }
120 void DFSTraverse(Graph *g){
121 int i;
122 for(i=0;i<g->numver;i++)
123 visited[i] = 0;
124 for(i=0;i<g->numver;i++)
125 if(!visited[i])
126 DFS(g,i);
127 }
128 void BFSTraverse(Graph *g){
129 int i;
130 edgeNode *p;
131 Queue *q = (Queue *)malloc(sizeof(Queue));
132
133 for(i=0;i<g->numver;i++)
134 visited[i] = 0;
135 initQueue(q,0);
136 for(i=0;i<g->numver;i++){
137 if(!visited[i]){
138 visited[i] = 1;
139 printf("%c ",g->list[i].data);
140 inQueue(q,i);
141 while(getLength(q)){
142 int *tar = (int *)malloc(sizeof(int));
143 outQueue(q,tar);
144 p = g->list[*tar].firstNode;
145 while(p){
146 if(!visited[p->num]){
147 visited[p->num] = 1;
148 printf("%c ",g->list[p->num].data);
149 inQueue(q,p->num);
150 }
151 p = p->next;
152 }
153
154 }
155 }
156 }
157
158 }
159
160 void initQueue(Queue *q,int n){
161 int i;
162 q->front=0;
163 q->rear =0;
164 for(i=0;i<n;i++){
165 q->data[q->rear]=2*i+1;
166 q->rear++;
167 }
168 }
169 void showQueue(Queue *q){
170 int i;
171 int len=getLength(q);
172 printf("front-");
173 for(i=0;i<len;i++){
174 if(q->front+i<MAXSIZE)
175 printf("%d-",q->data[q->front+i]);
176 else
177 printf("%d-",q->data[q->front+i-MAXSIZE]);
178 }
179 printf("rear\n");
180 }
181 int getLength(Queue *q){
182 return (q->rear-q->front+MAXSIZE)%MAXSIZE;
183 }
184 int inQueue(Queue *q,int num){
185 if((q->rear+1)%MAXSIZE == q->front)
186 return 0;
187 q->data[q->rear] = num;
188 q->rear = (q->rear+1)%MAXSIZE;
189 return 1;
190 }
191 int outQueue(Queue *q,int *tar){
192 if(q->front == q->rear)
193 return 0;
194 *tar = q->data[q->front];
195 q->front = (q->front+1)%MAXSIZE;
196 return 1;
197 }