-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlist-queue.c
92 lines (74 loc) · 1.67 KB
/
list-queue.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//list queue
//链表队列
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define QUEUE_SIZE 10
struct queue_node {
void *data;
struct queue_node *prev, *next;
};
struct queue {
struct queue_node head;
};
void queue_init(struct queue *q)
{
struct queue_node *head = &q->head;
head->prev = head;
head->next = head;
}
int queue_empty(struct queue *q)
{
struct queue_node *head = &q->head;
return (head->next == head);
}
int enqueue(struct queue *q, void *data)
{
struct queue_node *node;
struct queue_node *prev = &q->head;
struct queue_node *next = prev->next;
node = (struct queue_node *)malloc(sizeof(struct queue_node));
node->data = data;
node->next = next;
next->prev = node;
node->prev = prev;
prev->next = node;
return 0;
}
void *dequeue(struct queue *q)
{
struct queue_node *prev = &q->head;
struct queue_node *node = prev->next;
struct queue_node *next = node->next;
void *data;
if (queue_empty(q))
return NULL;
prev->next = next;
next->prev = prev;
node->next = NULL;
node->prev = NULL;
data = node->data;
free(node);
return data;
}
/**************test sample*******************/
int main(int argc, char *argv[])
{
struct queue queue;
int value1 = 1;
int value2 = 22;
int value3 = 333;
int value4 = 4444;
queue_init(&queue);
enqueue(&queue, &value1);
enqueue(&queue, &value2);
enqueue(&queue, &value3);
enqueue(&queue, &value4);
enqueue(&queue, &value1);
printf("dequeue:%d\n", *((int *)dequeue(&queue)));
printf("dequeue:%d\n", *((int *)dequeue(&queue)));
printf("dequeue:%d\n", *((int *)dequeue(&queue)));
printf("dequeue:%d\n", *((int *)dequeue(&queue)));
printf("dequeue:%d\n", *((int *)dequeue(&queue)));
return 0;
}