2
|
1 #include <stdlib.h>
|
|
2 // TODO: malloc
|
|
3 #include "List.h"
|
|
4 #include "Queue.h"
|
0
|
5
|
2
|
6 typedef struct _Queue {
|
|
7 List *head;
|
|
8 List *tail;
|
0
|
9 int length;
|
2
|
10 } Queue;
|
0
|
11
|
2
|
12 Queue *
|
|
13 newQueue()
|
0
|
14 {
|
2
|
15 Queue *queue;
|
|
16 malloc(sizeof(struct _Queue));
|
0
|
17 queue->head = NULL;
|
|
18 queue->tail = NULL;
|
|
19 queue->length = 0;
|
|
20 return queue;
|
|
21 }
|
|
22
|
|
23 void
|
2
|
24 _QaddFirst(Queue *queue, void *)
|
0
|
25 {
|
2
|
26 List *oldhead = queue->head;
|
|
27 List *newlist;
|
|
28 newlist = malloc(sizeof(struct _List));
|
0
|
29
|
|
30 if (oldhead) {
|
|
31 oldhead->prev = newlist;
|
|
32 }
|
|
33 newlist->next = oldhead;
|
|
34 newlist->prev = NULL;
|
|
35 queue->head = newlist;
|
|
36 queue->length++;
|
|
37 return ;
|
|
38 }
|
|
39
|
|
40 void
|
2
|
41 _QaddLast(Queue *queue, void *task)
|
0
|
42 {
|
2
|
43 List *oldtail = queue->tail;
|
|
44 List *newlist;
|
|
45 newlist = malloc(sizeof(struct _List));
|
0
|
46
|
|
47 if (oldtail) {
|
|
48 oldtail->next = newlist;
|
|
49 }
|
|
50 newlist->next = NULL;
|
|
51 newlist->prev = oldtail;
|
|
52 queue->tail = newlist;
|
|
53 queue->length++;
|
|
54 return ;
|
|
55 }
|
|
56
|
2
|
57 void *
|
|
58 _QpollFirst(Queue *queue)
|
0
|
59 {
|
2
|
60 List *first = queue->head;
|
|
61 List *second;
|
|
62 void *task;
|
0
|
63 if (!first) return NULL;
|
|
64
|
|
65 second = first->next;
|
|
66 task = first->task;
|
|
67 free(first);
|
|
68
|
|
69 second->prev = NULL;
|
|
70 queue->head = second;
|
|
71 queue->length--;
|
|
72 return task;
|
|
73 }
|
|
74
|
2
|
75 void *
|
|
76 _QpollLast(Queue *queue)
|
0
|
77 {
|
2
|
78 List *first = queue->tail;
|
|
79 List *second;
|
|
80 void *task;
|
0
|
81 if (!first) return NULL;
|
|
82
|
|
83 second = first->prev;
|
|
84 task = first->task;
|
|
85 free(first);
|
|
86
|
|
87 second->next = NULL;
|
|
88 queue->tail = second;
|
|
89 queue->length--;
|
|
90 return task;
|
|
91 }
|
|
92
|
|
93
|
|
94
|