1 #ifndef _DIJKSTRA_H_
2 #define _DIJKSTRA_H_
3
4 #include<sys/types.h>
5 #include<stdio.h>
6 #include<string.h>
7 #include<ctype.h>
8
9 #define bool unsigned char
10 #define TRUE (1)
11 #define FALSE (0)
12
13 #define VER_NUM 7
14 #define MAX_QUEUE_SIZE 100
15
16 typedef int ELEMENT_TYPE;
17
18 typedef struct
19 {
20 int front;
21 int rear;
22 int size;
23 ELEMENT_TYPE array[MAX_QUEUE_SIZE];
24 }QUEUE;
25
26 typedef struct ver_edge
27 {
28 int weight;
29 int to;
30 struct ver_edge* next;
31 }VER_EDGE;
32
33 typedef struct
34 {
35 VER_EDGE* ver_edge;
36 bool known;
37 int dis;
38 int pre_verx;
39 }VERTEX;
40
41 #endif
1 #include "dijkstra.h"
2
3 static QUEUE* ver_queue ;
4
5 static VERTEX* vertexs;/* garph is vertexs*/
6
7 void init_verQueue()
8 {
9 ver_queue = (QUEUE*)malloc(sizeof(QUEUE));
10 ver_queue->front = 0;
11 ver_queue->rear = 0;
12 ver_queue->array = 0;
13 ver_queue->size = 0;
14 }
15
16 bool is_queue_empty(QUEUE* queue)
17 {
18 return 0 == queue->size;
19 }
20
21 void en_queue(QUEUE* queue,ELEMENT_TYPE element)
22 {
23 if(queue->size = MAX_QUEUE_SIZE)
24 {
25 printf("enqueue fail!\n");
26 return ;
27 }
28 queue->array[queue->rear++] = element;
29 queue->size++;
30 }
31
32 ELEMENT_TYPE* queue_front(QUEUE* queue)
33 {
34 if( queue->size == 0)
35 {
36 printf("get front fail!\n");
37 return ;
38 }
39 return (queue->array + queue->front);
40 }
41
42 void de_queue(QUEUE* queue)
43 {
44 if(is_queue_empty(queue))
45 {
46 printf("dequeue fail!\n");
47 return ;
48 }
49 queue->front++;
50 }
51
52
53 void init_vertex()
54 {
55 int i = 0;
56 vertexs = (VERTEX*)malloc(VER_NUM*sizeof(VERTEX));
57 for( i = 0;i< VER_NUM;i++)
58 {
59 vertexs[i].ver_edge = NULL;
60 }
61 }
62 void insert_edge(int from,int to,int weight)
63 {
64 int i = from -1;
65 VER_EDGE* temp = (VER_EDGE*)malloc(sizeof(VER_EDGE));
66 temp->next = NULL;
67 temp->weight = weight;
68 temp->to = to;
69
70 temp->next = vertexs[i].ver_edge;
71 vertexs[i].ver_edge= temp;
72 }
73
74 /*for graph that has a circle:
75 how to choose the vertex is a problem,can use foreach or priority queue;
76 for acyclic graph:
77 use the topological order to get the vertex in loop;
78 */
79
80 /*算法: 选点、设为known、更新边*/
81 void dijkstra(int init_ver, VERTEX* vertexs)
82 {
83
84 }