ECE 2036 Project
Dependencies: mbed wave_player 4DGL-uLCD-SE
doublely_linked_list.cpp
- Committer:
- abraha2d
- Date:
- 2019-11-21
- Revision:
- 2:2042f29de6b7
- Parent:
- 0:cf4396614a79
File content as of revision 2:2042f29de6b7:
#include <stdlib.h> #include <stdio.h> #include "doublely_linked_list.h" DLinkedList* create_dlinkedlist(void) { // printf("create_dlinkedlist\n"); DLinkedList* newList = (DLinkedList*) malloc(sizeof(DLinkedList)); newList->size = 0; newList->head = NULL; newList->current = NULL; newList->tail = NULL; return newList; } LLNode* create_llnode(void* data) { // printf("create_llnode\n"); LLNode* newNode = (LLNode*) malloc(sizeof(LLNode)); newNode->previous = NULL; newNode->next = NULL; newNode->data = data; return newNode; } void insertHead(DLinkedList* dLinkedList, void* data) { // printf("insertHead\n"); LLNode* newNode = create_llnode(data); if (dLinkedList->head == NULL) { dLinkedList->size++; dLinkedList->head = newNode; dLinkedList->tail = newNode; } else { dLinkedList->size++; newNode->next = dLinkedList->head; (dLinkedList->head)->previous = newNode; dLinkedList->head = newNode; } } void insertTail(DLinkedList* dLinkedList, void* data) { // printf("insertTail\n"); LLNode* newNode = create_llnode(data); if (dLinkedList->tail == NULL) { dLinkedList->size++; dLinkedList->tail = newNode; dLinkedList->head = newNode; } else { dLinkedList->size++; newNode->previous = dLinkedList->tail; (dLinkedList->tail)->next = newNode; dLinkedList->tail = newNode; } } int insertAfter(DLinkedList* dLinkedList, void* newData) { // printf("insertAfter\n"); if (dLinkedList->current == NULL) { return 0; } LLNode* newNode = create_llnode(newData); dLinkedList->size++; newNode->next = (dLinkedList->current)->next; newNode->previous = dLinkedList->current; if (newNode->next == NULL) { dLinkedList->tail = newNode; } else { (newNode->next)->previous = newNode; } (newNode->previous)->next = newNode; return 1; } int insertBefore(DLinkedList* dLinkedList, void* newData) { // printf("insertBefore\n"); if (dLinkedList->current == NULL) { return 0; } LLNode* newNode = create_llnode(newData); dLinkedList->size++; newNode->next = dLinkedList->current; newNode->previous = (dLinkedList->current)->previous; (newNode->next)->previous = newNode; if (newNode->previous == NULL) { dLinkedList->head = newNode; } else { (newNode->previous)->next = newNode; } return 1; } void* deleteBackward(DLinkedList* dLinkedList) { // printf("deleteBackward\n"); if (dLinkedList->current == NULL) { return NULL; } dLinkedList->size--; free((dLinkedList->current)->data); if ((dLinkedList->current)->previous == NULL) { dLinkedList->head = (dLinkedList->current)->next; } else { ((dLinkedList->current)->previous)->next = (dLinkedList->current)->next; } if ((dLinkedList->current)->next == NULL) { dLinkedList->tail = (dLinkedList->current)->previous; } else { ((dLinkedList->current)->next)->previous = (dLinkedList->current)->previous; } LLNode* newCurrent = (dLinkedList->current)->previous; free(dLinkedList->current); dLinkedList->current = newCurrent; if (dLinkedList->current == NULL) { return NULL; } return (dLinkedList->current)->data; } void* deleteForward(DLinkedList* dLinkedList) { // printf("deleteForward\n"); if (dLinkedList->current == NULL) { return NULL; } dLinkedList->size--; free((dLinkedList->current)->data); if ((dLinkedList->current)->previous == NULL) { dLinkedList->head = (dLinkedList->current)->next; } else { ((dLinkedList->current)->previous)->next = (dLinkedList->current)->next; } if ((dLinkedList->current)->next == NULL) { dLinkedList->tail = (dLinkedList->current)->previous; } else { ((dLinkedList->current)->next)->previous = (dLinkedList->current)->previous; } LLNode* newCurrent = (dLinkedList->current)->next; free(dLinkedList->current); dLinkedList->current = newCurrent; if (dLinkedList->current == NULL) { return NULL; } return (dLinkedList->current)->data; } void* removeBackward(DLinkedList* dLinkedList) { // printf("removeBackward\n"); if (dLinkedList->current == NULL) { return NULL; } dLinkedList->size--; if ((dLinkedList->current)->previous == NULL) { dLinkedList->head = (dLinkedList->current)->next; } else { ((dLinkedList->current)->previous)->next = (dLinkedList->current)->next; } if ((dLinkedList->current)->next == NULL) { dLinkedList->tail = (dLinkedList->current)->previous; } else { ((dLinkedList->current)->next)->previous = (dLinkedList->current)->previous; } void* oldData = (dLinkedList->current)->data; LLNode* newCurrent = (dLinkedList->current)->previous; free(dLinkedList->current); dLinkedList->current = newCurrent; return oldData; } void* removeForward(DLinkedList* dLinkedList) { // printf("removeForward\n"); if (dLinkedList->current == NULL) { return NULL; } dLinkedList->size--; if ((dLinkedList->current)->previous == NULL) { dLinkedList->head = (dLinkedList->current)->next; } else { ((dLinkedList->current)->previous)->next = (dLinkedList->current)->next; } if ((dLinkedList->current)->next == NULL) { dLinkedList->tail = (dLinkedList->current)->previous; } else { ((dLinkedList->current)->next)->previous = (dLinkedList->current)->previous; } void* oldData = (dLinkedList->current)->data; LLNode* newCurrent = (dLinkedList->current)->next; free(dLinkedList->current); dLinkedList->current = newCurrent; return oldData; } void destroyList(DLinkedList* dLinkedList) { // printf("destroyList\n"); if (dLinkedList->head != NULL) { getHead(dLinkedList); while(deleteForward(dLinkedList)) {}; } free(dLinkedList); } void* getHead(DLinkedList* dLinkedList) { // printf("getHead\n"); dLinkedList->current = dLinkedList->head; if (dLinkedList->head == NULL) { return NULL; } return (dLinkedList->head)->data; } void* getTail(DLinkedList* dLinkedList) { // printf("getTail\n"); dLinkedList->current = dLinkedList->tail; if (dLinkedList->tail == NULL) { return NULL; } return (dLinkedList->tail)->data; } void* getCurrent(DLinkedList* dLinkedList) { // printf("getCurrent\n"); if (dLinkedList->current == NULL) { return NULL; } return (dLinkedList->current)->data; } void* getNext(DLinkedList* dLinkedList) { // printf("getNext\n"); if (dLinkedList->current == NULL) { return NULL; } dLinkedList->current = (dLinkedList->current)->next; if (dLinkedList->current == NULL) { return NULL; } return (dLinkedList->current)->data; } void* getPrevious(DLinkedList* dLinkedList) { // printf("getPrevious\n"); if (dLinkedList->current == NULL) { return NULL; } dLinkedList->current = (dLinkedList->current)->previous; if (dLinkedList->current == NULL) { return NULL; } return (dLinkedList->current)->data; } int getSize(DLinkedList* dLinkedList) { // printf("getSize\n"); return dLinkedList->size; }