2015-06-12 16:01:26 -04:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
|
|
|
|
static void enqueue_tail(int d);
|
|
|
|
static void enqueue_head(int d);
|
|
|
|
static int dequeue_tail(void);
|
|
|
|
static int dequeue_head(void);
|
|
|
|
|
|
|
|
struct Node {
|
|
|
|
struct Node *next;
|
|
|
|
struct Node *prev;
|
|
|
|
int data;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Node *head = NULL;
|
|
|
|
struct Node *tail = NULL;
|
|
|
|
|
|
|
|
void enqueue_tail(int d) {
|
2015-06-13 10:41:41 -04:00
|
|
|
struct Node *new_node = malloc(sizeof(*new_node));
|
2015-06-12 16:01:26 -04:00
|
|
|
|
|
|
|
new_node->data = d;
|
|
|
|
new_node->next = tail;
|
|
|
|
new_node->prev = NULL;
|
|
|
|
if (tail != NULL)
|
|
|
|
tail->prev = new_node;
|
|
|
|
tail = new_node;
|
|
|
|
if (head == NULL)
|
|
|
|
head = tail;
|
|
|
|
|
|
|
|
// printf("enqueue_tail new node data: %d\n", new_node->data);
|
|
|
|
// printf("enqueue_tail new node: %p\n", (void*)new_node);
|
|
|
|
// printf("enqueue_tail next node: %p\n", (void*)new_node->next);
|
|
|
|
// printf("enqueue_tail prev node: %p\n", (void*)new_node->prev);
|
|
|
|
}
|
|
|
|
|
|
|
|
void enqueue_head(int d) {
|
2015-06-13 10:41:41 -04:00
|
|
|
struct Node *new_node = malloc(sizeof(*new_node));
|
2015-06-12 16:01:26 -04:00
|
|
|
|
|
|
|
new_node->data = d;
|
|
|
|
new_node->next = NULL;
|
|
|
|
new_node->prev = head;
|
|
|
|
if (head != NULL)
|
|
|
|
head->next = new_node;
|
|
|
|
head = new_node;
|
|
|
|
if (tail == NULL)
|
|
|
|
tail = head;
|
|
|
|
|
|
|
|
// printf("enqueue_head new node data: %d\n", new_node->data);
|
|
|
|
// printf("enqueue_head new node: %p\n", (void*)new_node);
|
|
|
|
// printf("enqueue_head next node: %p\n", (void*)new_node->next);
|
|
|
|
// printf("enqueue_head prev node: %p\n", (void*)new_node->prev);
|
|
|
|
}
|
|
|
|
|
|
|
|
int dequeue_tail(void) {
|
|
|
|
if (tail == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
// printf("dequeue_tail tail: %p\n", (void*)tail);
|
|
|
|
// printf("dequeue_tail tail next: %p\n", (void*)tail->next);
|
|
|
|
// printf("dequeue_tail tail prev: %p\n", (void*)tail->prev);
|
|
|
|
|
|
|
|
struct Node *t = tail;
|
|
|
|
int d = tail->data;
|
|
|
|
if (tail->next != NULL)
|
|
|
|
tail->next->prev = NULL;
|
|
|
|
tail = tail->next;
|
|
|
|
free(t);
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
int dequeue_head(void) {
|
|
|
|
if (head == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
// printf("A. dequeue_head head: %p\n", (void*)head);
|
|
|
|
// printf("A. dequeue_head head next: %p\n", (void*)head->next);
|
|
|
|
// printf("A. dequeue_head head prev: %p\n", (void*)head->prev);
|
|
|
|
|
|
|
|
struct Node *t = head;
|
|
|
|
int d = head->data;
|
|
|
|
if (head->prev != NULL) {
|
|
|
|
head->prev->next = NULL;
|
|
|
|
}
|
|
|
|
head = head->prev;
|
|
|
|
|
|
|
|
// printf("B. dequeue_head head: %p\n", (void*)head);
|
|
|
|
// printf("B. dequeue_head head next: %p\n", (void*)((head == NULL) ? NULL : head->next));
|
|
|
|
// printf("B. dequeue_head head prev: %p\n", (void*)((head == NULL) ? NULL : head->prev));
|
|
|
|
|
|
|
|
free(t);
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
2015-06-12 16:36:10 -04:00
|
|
|
void reverse_list(void) {
|
|
|
|
struct Node *tmp1;
|
|
|
|
struct Node *tmp2;
|
|
|
|
|
2015-06-12 16:42:53 -04:00
|
|
|
tmp1 = tail;
|
|
|
|
tail = head;
|
|
|
|
head = tmp1;
|
2015-06-12 16:36:10 -04:00
|
|
|
while (tmp1 != NULL) {
|
|
|
|
tmp2 = tmp1->next;
|
|
|
|
tmp1->next = tmp1->prev;
|
|
|
|
tmp1->prev = tmp2;
|
|
|
|
tmp1 = tmp2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#define COUNT (20)
|
2015-06-12 16:01:26 -04:00
|
|
|
int main(int argc, char **argv) {
|
|
|
|
int i;
|
2015-06-12 16:42:53 -04:00
|
|
|
for (i = 0; i < COUNT; i++) {
|
2015-06-12 16:01:26 -04:00
|
|
|
printf("enqueue tail: %d\n", i);
|
|
|
|
enqueue_tail(i);
|
|
|
|
}
|
2015-06-12 16:36:10 -04:00
|
|
|
for (i = 0; i < COUNT; i++) {
|
2015-06-12 16:01:26 -04:00
|
|
|
printf("dequeue tail: %d\n", dequeue_tail());
|
|
|
|
}
|
|
|
|
|
2015-06-12 16:42:53 -04:00
|
|
|
for (i = 0; i < COUNT; i++) {
|
2015-06-12 16:01:26 -04:00
|
|
|
printf("enqueue head: %d\n", i);
|
|
|
|
enqueue_head(i);
|
|
|
|
}
|
2015-06-12 16:36:10 -04:00
|
|
|
for (i = 0; i < COUNT; i++) {
|
2015-06-12 16:01:26 -04:00
|
|
|
printf("dequeue head: %d\n", dequeue_head());
|
|
|
|
}
|
|
|
|
|
2015-06-12 16:42:53 -04:00
|
|
|
for (i = 0; i < 10; i++) {
|
2015-06-12 16:01:26 -04:00
|
|
|
printf("enqueue head: %d\n", i);
|
|
|
|
enqueue_head(i);
|
|
|
|
}
|
2015-06-12 16:42:53 -04:00
|
|
|
for (i = 10; i < COUNT; i++) {
|
2015-06-12 16:36:10 -04:00
|
|
|
printf("enqueue tail: %d\n", i);
|
|
|
|
enqueue_tail(i);
|
|
|
|
}
|
|
|
|
for (i = 0; i < COUNT; i++) {
|
|
|
|
printf("dequeue tail: %d\n", dequeue_tail());
|
|
|
|
}
|
2015-06-12 16:42:53 -04:00
|
|
|
for (i = 0; i < COUNT; i++) {
|
2015-06-12 16:01:26 -04:00
|
|
|
printf("enqueue tail: %d\n", i);
|
|
|
|
enqueue_head(i);
|
|
|
|
}
|
2015-06-12 16:36:10 -04:00
|
|
|
reverse_list();
|
|
|
|
for (i = 0; i < COUNT; i++) {
|
2015-06-12 16:01:26 -04:00
|
|
|
printf("dequeue tail: %d\n", dequeue_tail());
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|