Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdbool.h>
- typedef struct node {
- void* data;
- void* next;
- struct node* previous;
- } node;
- typedef struct double_linked_list {
- node* start;
- node* end;
- size_t size;
- size_t objsize;
- } double_linked_list;
- void create_list(double_linked_list* list, size_t objsize) {
- list->start = NULL;
- list->objsize = objsize;
- }
- bool get_next(node** node) {
- if(!(*node)->next) {
- *node = NULL;
- return false;
- }
- *node = (*node)->next;
- return true;
- }
- bool get_previous(node** node) {
- if(!(*node)->previous) {
- *node = NULL;
- return false;
- }
- *node = (*node)->previous;
- return true;
- }
- node* push_front(double_linked_list* list, void* obj) {
- node* prev = list->start;
- list->start = malloc(sizeof(node));
- list->start->data = malloc(list->objsize);
- memcpy(list->start->data, obj, list->objsize);
- list->start->next = prev;
- list->start->previous = NULL;
- if(prev != NULL) {
- prev->previous = list->start;
- } else {
- list->end = list->start;
- }
- return list->start;
- }
- node* push_back(double_linked_list* list, void* obj) {
- node* prev = list->end;
- list->end = malloc(sizeof(node));
- list->end->data = malloc(list->objsize);
- memcpy(list->end->data, obj, list->objsize);
- list->end->next = NULL;
- list->end->previous = prev;
- if(prev != NULL) {
- prev->next = list->end;
- } else {
- list->start = list->end;
- }
- return list->end;
- }
- void free_list(double_linked_list* list) {
- node* iterator = list->start;
- while(iterator) {
- node* cur = iterator;
- free(cur->data);
- get_next(&iterator);
- free(cur);
- }
- }
- int main() {
- double_linked_list list;
- create_list(&list, sizeof(int));
- int vals[] = { 1, 2, 3, 4, 5 };
- for(int i = sizeof(vals) / sizeof(int) - 1; i >= 0; i--) {
- push_back(&list, &vals[i]);
- }
- node* iterator = list.start;
- while(iterator) {
- printf("%d\n", *(int*)iterator->data);
- get_next(&iterator);
- }
- iterator = list.end;
- while(iterator) {
- printf("%d\n", *(int*)iterator->data);
- get_previous(&iterator);
- }
- free_list(&list);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement