ECE 2036 Project

Dependencies:   mbed wave_player 4DGL-uLCD-SE

Revision:
2:2042f29de6b7
Parent:
0:cf4396614a79
--- a/doublely_linked_list.cpp	Wed Nov 08 21:01:43 2017 +0000
+++ b/doublely_linked_list.cpp	Thu Nov 21 16:10:57 2019 +0000
@@ -2,147 +2,396 @@
 #include <stdio.h>
 #include "doublely_linked_list.h"
 
-DLinkedList* create_dlinkedlist(void) {
-    DLinkedList* newList = (DLinkedList*)malloc(sizeof(DLinkedList));
+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;
-    newList->current = NULL;
-    newList->size = 0;
+
     return newList;
+
 }
 
-LLNode* create_llnode(void* data) {
+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)
+{
 
-    // Your code here
-    return NULL;
+//    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 insertHead(DLinkedList* dLinkedList, void* data){
-  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;
 
-void insertTail(DLinkedList* dLinkedList, void* data){
+    } else {
 
-    // Your code here
+        dLinkedList->size++;
+        newNode->previous = dLinkedList->tail;
+        (dLinkedList->tail)->next = newNode;
+        dLinkedList->tail = newNode;
+
+    }
 
 }
 
-int insertAfter(DLinkedList* dLinkedList, void* newData){
+int insertAfter(DLinkedList* dLinkedList, void* newData)
+{
+
+//    printf("insertAfter\n");
+
+    if (dLinkedList->current == NULL) {
+        return 0;
+    }
+
+    LLNode* newNode = create_llnode(newData);
 
-    // Your code here
-    return 0;
+    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){
+int insertBefore(DLinkedList* dLinkedList, void* newData)
+{
+
+//    printf("insertBefore\n");
+
+    if (dLinkedList->current == NULL) {
+        return 0;
+    }
+
+    LLNode* newNode = create_llnode(newData);
 
-    // Your code here
-    return 0;
+    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){
+void* deleteBackward(DLinkedList* dLinkedList)
+{
+
+//    printf("deleteBackward\n");
+
+    if (dLinkedList->current == NULL) {
+        return NULL;
+    }
+
+    dLinkedList->size--;
+
+    free((dLinkedList->current)->data);
 
-    //Your code here.
-    return NULL;
+    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){
+void* deleteForward(DLinkedList* dLinkedList)
+{
+
+//    printf("deleteForward\n");
+
+    if (dLinkedList->current == NULL) {
+        return NULL;
+    }
+
+    dLinkedList->size--;
+
+    free((dLinkedList->current)->data);
 
-    //Your code here.
-    return NULL;
+    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){
+void* removeBackward(DLinkedList* dLinkedList)
+{
+
+//    printf("removeBackward\n");
+
+    if (dLinkedList->current == NULL) {
+        return NULL;
+    }
+
+    dLinkedList->size--;
 
-    //Your code here.
-    return NULL;
+    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){
+void* removeForward(DLinkedList* dLinkedList)
+{
+
+//    printf("removeForward\n");
+
+    if (dLinkedList->current == NULL) {
+        return NULL;
+    }
+
+    dLinkedList->size--;
 
-    //Your code here.
-    return NULL;
+    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){
-  if(dLinkedList->head != NULL){
-    getHead(dLinkedList);
-    while(deleteForward(dLinkedList)){};
-  }
-  free(dLinkedList);
+void destroyList(DLinkedList* dLinkedList)
+{
+
+//    printf("destroyList\n");
+
+    if (dLinkedList->head != NULL) {
+        getHead(dLinkedList);
+        while(deleteForward(dLinkedList)) {};
+    }
+
+    free(dLinkedList);
+
 }
 
 
-void* getHead(DLinkedList* dLinkedList){
+void* getHead(DLinkedList* dLinkedList)
+{
+
+//    printf("getHead\n");
 
-    //Your code here.
-    return NULL;
+    dLinkedList->current = dLinkedList->head;
+
+    if (dLinkedList->head == NULL) {
+        return NULL;
+    }
+
+    return (dLinkedList->head)->data;
 
 }
 
 
 
-void* getTail(DLinkedList* dLinkedList){
+void* getTail(DLinkedList* dLinkedList)
+{
+
+//    printf("getTail\n");
+
+    dLinkedList->current = dLinkedList->tail;
 
-    //Your code here.
+    if (dLinkedList->tail == NULL) {
+        return NULL;
+    }
 
-    return NULL;
+    return (dLinkedList->tail)->data;
+
 }
 
 
 
-void* getCurrent(DLinkedList* dLinkedList){
+void* getCurrent(DLinkedList* dLinkedList)
+{
+
+//    printf("getCurrent\n");
 
-    //Your code here.
-    return NULL;
+    if (dLinkedList->current == NULL) {
+        return NULL;
+    }
+
+    return (dLinkedList->current)->data;
 
 }
 
 
 
-void* getNext(DLinkedList* dLinkedList){
+void* getNext(DLinkedList* dLinkedList)
+{
+
+//    printf("getNext\n");
+
+    if (dLinkedList->current == NULL) {
+        return NULL;
+    }
 
-    //Your code here.
+    dLinkedList->current = (dLinkedList->current)->next;
 
-    return NULL;
+    if (dLinkedList->current == NULL) {
+        return NULL;
+    }
+
+    return (dLinkedList->current)->data;
+
 }
 
 
 
-void* getPrevious(DLinkedList* dLinkedList){
+void* getPrevious(DLinkedList* dLinkedList)
+{
+
+//    printf("getPrevious\n");
+
+    if (dLinkedList->current == NULL) {
+        return NULL;
+    }
 
-    //Your code here.
+    dLinkedList->current = (dLinkedList->current)->previous;
 
-    return NULL;
+    if (dLinkedList->current == NULL) {
+        return NULL;
+    }
+
+    return (dLinkedList->current)->data;
+
 }
 
 
-int getSize(DLinkedList* dLinkedList){
+int getSize(DLinkedList* dLinkedList)
+{
 
-    //Your code here.
-    return 0;
+//    printf("getSize\n");
+
+    return dLinkedList->size;
 
 }
\ No newline at end of file