#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int val;
struct Node *prev;
struct Node *next;
}Node;
typedef struct LinkedList {
Node *head;
Node *tail;
int size;
}LinkedList;
LinkedList* list;
Node* make_node(int val) {
Node* node = (Node*)malloc(sizeof(Node));
node->val = val;
node->prev = node->next = NULL;
return node;
}
void initList() {
list->head = make_node(0x7fffffff);
list->tail = make_node(0x7fffffff);
list->head->prev = list->head->next = list->tail;
list->tail->prev = list->tail->next = list->head;
list->size = 0;
}
void push_back(int val) {
Node* new_node = make_node(val);
Node* last_node = list->tail->prev;
last_node->next = new_node;
new_node->prev = last_node;
new_node->next = list->tail;
list->tail->prev = new_node;
++list->size;
}
int back() {
if (list->size == 0) {
printf("empty list\n");
return -1;
}
return list->tail->prev->val;
}
void pop_back() {
if (list->size == 0) {
printf("empty list\n");
return;
}
Node* pop_node = list->tail->prev;
pop_node->prev->next = list->tail;
list->tail->prev = pop_node->prev;
free(pop_node);
--list->size;
}
void push_front(int val) {
Node* new_node = make_node(val);
Node* first_node = list->head->next;
list->head->next = new_node;
new_node->prev = list->head;
new_node->next = first_node;
first_node->prev = new_node;
++list->size;
}
int front() {
if (list->size == 0) {
printf("empty list\n");
return -1;
}
return list->head->next->val;
}
void pop_front() {
if (list->size == 0) {
printf("empty list\n");
return;
}
Node* pop_node = list->head->next;
list->head->next = pop_node->next;
pop_node->next->prev = list->head;
free(pop_node);
--list->size;
}
int size() {
return list->size;
}
void print() {
if (list->size == 0) {
printf("empty list\n");
return;
}
Node* curr = list->head->next;
while(curr != list->tail){
printf("%d ", curr->val);
curr = curr->next;
}
printf("\n");
}
void delete_memory() {
Node* curr = list->head;
Node* next;
while(curr != list->tail) {
next = curr->next;
free(curr);
curr = next;
}
free(curr);
free(list);
}
int main(int argc, char** argv) {
list = (LinkedList*)malloc(sizeof(LinkedList));
initList();
push_back(1);
push_back(2);
push_back(3);
push_back(4);
pop_back();
push_back(5);
push_front(1);
push_front(2);
push_front(3);
push_front(4);
pop_front();
push_front(5);
print();
delete_memory();
return 0;
}