ECE2035 Project 2

Dependencies:   mbed mbed-rtos SDFileSystem

doubly_linked_list.cpp

Committer:
kwengryn3
Date:
2021-04-20
Revision:
10:1994adcfc86f
Parent:
4:8e15742ebcc6

File content as of revision 10:1994adcfc86f:

//=================================================================
// Implementation for DLL module.
//
// Copyright 2021 Georgia Tech.  All rights reserved.
// The materials provided by the instructor in this course are for
// the use of the students currently enrolled in the course.
// Copyrighted course materials may not be further disseminated.
// This file must not be made publicly available anywhere.
//=================================================================
#include <stdlib.h>
#include <stdio.h>
#include "doubly_linked_list.h"
#include "globals.h"

LLNode* create_llnode(void* data) {

    // Your code here
    LLNode* newNode = (LLNode*)malloc(sizeof(LLNode));
    if (newNode == NULL) {
      pc.printf("Error: Insufficient Space");
      exit(1);
    }

    newNode->data = data;
    newNode->next = NULL;
    newNode->prev = NULL;
    return newNode; 
}

DLinkedList* create_dlinkedlist(void) {
    DLinkedList* newList = (DLinkedList*)malloc(sizeof(DLinkedList));
    newList->head = NULL;
    newList->tail = NULL;
    newList->size = 0;
    return newList;
}

int getSize(DLinkedList* dLinkedList){

  // Your code here
  return dLinkedList->size;
}

LLNode* getHead(DLinkedList* dLinkedList){

  // Your code here

  return dLinkedList->head;
}

LLNode* getTail(DLinkedList* dLinkedList){

  // Your code here

  return dLinkedList->tail;
}

LLNode* getNext(LLNode* node){

  // Your code here

  return node->next;
}

LLNode* getPrev(LLNode* node){

  // Your code here

  return node->prev;
}

void* getData(LLNode* node){

  // Your code here

  return node->data;
}

void insertAfter(DLinkedList* dLinkedList, LLNode* prev_node, void* data){
  if (prev_node == NULL) {
    printf("the given previous node cannot be NULL");
    return;
  }

  LLNode* newNode = create_llnode(data);

  if (prev_node->next == NULL) { //inserting new tail
    prev_node->next = newNode;
    newNode->prev = prev_node;
    dLinkedList->tail = newNode;
  } else {
    LLNode* temp = prev_node->next;
    prev_node->next = newNode;
    newNode->next = temp;
    newNode->prev = prev_node;
    temp->prev = newNode;
  }
  dLinkedList->size++;
  
}

void insertBefore(DLinkedList* dLinkedList, LLNode* next_node, void* data){
  if (next_node == NULL) {
    //printf("the given next node cannot be NULL");
    return;
  }

  LLNode* newNode = create_llnode(data);
  if (next_node->prev == NULL) { //inserting new head
    //pc.printf("debug1\n");
    newNode->next = dLinkedList->head;
    dLinkedList->head->prev = newNode;
    dLinkedList->head = newNode;
  } else {
    LLNode* temp = next_node->prev;
    next_node->prev = newNode;
    newNode->next = next_node;
    newNode->prev = temp;
    temp->next = newNode;
  }
  dLinkedList->tail->next = NULL;
  dLinkedList->head->prev = NULL;
  
  dLinkedList->size++;
  
  
}

void insertHead(DLinkedList* dLinkedList, void* data){
  //pc.printf("Adding new node: %d\n", data);
  if(dLinkedList->head == NULL){
    LLNode* newNode = create_llnode(data);
    dLinkedList->head = newNode;
    dLinkedList->tail = newNode;
    dLinkedList->size++; 
  }else{
    insertBefore(dLinkedList, dLinkedList->head, data);
  }
  //printLinkedList(dLinkedList);
}

void insertTail(DLinkedList* dLinkedList, void* data){
  if (dLinkedList->head == NULL) {
    LLNode* newNode = create_llnode(data);
    dLinkedList->head = newNode;
    dLinkedList->tail = newNode;
    dLinkedList->size++;
  } else {
    insertAfter(dLinkedList, dLinkedList->tail, data);
  }
  
}

void deleteNode(DLinkedList* dLinkedList, LLNode* Node){
    if (Node == NULL) {
      pc.printf("Error: Node is null");
      
      return;
    }
    if (dLinkedList->size == 1) { //list size 1
       //pc.printf("Deleting Single node: %d\n", Node->data);
       dLinkedList->head = NULL;
       dLinkedList->tail = NULL;
    
    } else if (Node->next == NULL) { //it is the tail
      //pc.printf("Deleting Tail node: %d\n", Node->data);
      dLinkedList->tail = Node->prev;
      dLinkedList->tail->next = NULL;
    } else if (Node->prev == NULL) { //it is the head
      //pc.printf("debug delete 1\n");
      //pc.printf("Deleting Head node: %d\n", Node->data);
      dLinkedList->head = Node->next;
      dLinkedList->head->prev = NULL;
      Node->prev = NULL;
    } else {
      //pc.printf("Deleting middle node: %d\n", Node->data);
      //pc.printf("debug delete 3\n");
      Node->next->prev = Node->prev;
      //pc.printf("debug delete 4\n");
      Node->prev->next = Node->next;
      //dLinkedList->tail->next = NULL;
      
    }
    dLinkedList->size--;
    free(Node);
    //printLinkedList(dLinkedList);
}

void destroyList(DLinkedList* dLinkedList){
  free(dLinkedList);

}

void printLinkedList(DLinkedList* dLinkedList) {
    LLNode* current = dLinkedList->head;
    if (dLinkedList->head == NULL) {
        pc.printf("Empty List\n");
        return;
    }
    pc.printf("head -> ");
    while (current->next != NULL) {
        pc.printf("Node: %d -> ", current->data);
        current = current->next;
    }
    pc.printf("Node: %d <- tail\n", current->data);
}

void reverse(DLinkedList* dLinkedList) {

  if (dLinkedList->size == 1 ) {
    return;
  }
  if (dLinkedList->size == 0) {
    printf("Error: Cannot reverse an empty list");
    return;
  }

  LLNode* current = dLinkedList->head;
  LLNode* temp = NULL;

  dLinkedList->tail = current;

  while(current != NULL) {
    temp = current->prev;
    current->prev = current->next;
    current->next = temp;
    current = current->prev;
  }

  dLinkedList->head = temp->prev;

}