f

Dependencies:   mbed 4DGL-uLCD-SE MMA8452

Committer:
dfrausto3
Date:
Tue Apr 12 01:39:20 2022 +0000
Revision:
6:453dc852ac0f
Parent:
0:8e3b9bb1084a
f

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dfrausto3 6:453dc852ac0f 1 //=================================================================
dfrausto3 6:453dc852ac0f 2 // Implementation for DLL module.
dfrausto3 6:453dc852ac0f 3 //
dfrausto3 6:453dc852ac0f 4 // Copyright 2022 Georgia Tech. All rights reserved.
dfrausto3 6:453dc852ac0f 5 // The materials provided by the instructor in this course are for
dfrausto3 6:453dc852ac0f 6 // the use of the students currently enrolled in the course.
dfrausto3 6:453dc852ac0f 7 // Copyrighted course materials may not be further disseminated.
dfrausto3 6:453dc852ac0f 8 // This file must not be made publicly available anywhere.
dfrausto3 6:453dc852ac0f 9 //=================================================================
dfrausto3 6:453dc852ac0f 10 #include <stdlib.h>
dfrausto3 6:453dc852ac0f 11 #include <stdio.h>
dfrausto3 6:453dc852ac0f 12 #include "doubly_linked_list.h"
dfrausto3 6:453dc852ac0f 13
dfrausto3 6:453dc852ac0f 14 //===========================
dfrausto3 6:453dc852ac0f 15 /* Creating nodes and lists */
dfrausto3 6:453dc852ac0f 16 //===========================
dfrausto3 6:453dc852ac0f 17
dfrausto3 6:453dc852ac0f 18 LLNode* create_llnode(void* data) {
dfrausto3 6:453dc852ac0f 19 LLNode* newNode = (LLNode*)malloc(sizeof(LLNode));
dfrausto3 6:453dc852ac0f 20 newNode->data = data;
dfrausto3 6:453dc852ac0f 21 newNode->next = NULL;
dfrausto3 6:453dc852ac0f 22 newNode->prev = NULL;
dfrausto3 6:453dc852ac0f 23 return newNode;
dfrausto3 6:453dc852ac0f 24 }
dfrausto3 6:453dc852ac0f 25
dfrausto3 6:453dc852ac0f 26 DLinkedList* create_dlinkedlist(CompareFunction compare) {
dfrausto3 6:453dc852ac0f 27 DLinkedList* newList = (DLinkedList*)malloc(sizeof(DLinkedList));
dfrausto3 6:453dc852ac0f 28 newList->head = NULL;
dfrausto3 6:453dc852ac0f 29 newList->tail = NULL;
dfrausto3 6:453dc852ac0f 30 newList->size = 0;
dfrausto3 6:453dc852ac0f 31 newList->compare = compare;
dfrausto3 6:453dc852ac0f 32 return newList;
dfrausto3 6:453dc852ac0f 33 }
dfrausto3 6:453dc852ac0f 34
dfrausto3 6:453dc852ac0f 35 //============================
dfrausto3 6:453dc852ac0f 36 /* Accessing nodes and lists */
dfrausto3 6:453dc852ac0f 37 //============================
dfrausto3 6:453dc852ac0f 38
dfrausto3 6:453dc852ac0f 39 int getSize(DLinkedList* dLinkedList){
dfrausto3 6:453dc852ac0f 40 int s = dLinkedList->size;
dfrausto3 6:453dc852ac0f 41 return s;
dfrausto3 6:453dc852ac0f 42
dfrausto3 6:453dc852ac0f 43 }
dfrausto3 6:453dc852ac0f 44
dfrausto3 6:453dc852ac0f 45 LLNode* getHead(DLinkedList* dLinkedList){
dfrausto3 6:453dc852ac0f 46 return dLinkedList->head;
dfrausto3 6:453dc852ac0f 47 }
dfrausto3 6:453dc852ac0f 48
dfrausto3 6:453dc852ac0f 49 LLNode* getTail(DLinkedList* dLinkedList){
dfrausto3 6:453dc852ac0f 50 return dLinkedList->tail;
dfrausto3 6:453dc852ac0f 51 }
dfrausto3 6:453dc852ac0f 52
dfrausto3 6:453dc852ac0f 53 LLNode* getNext(LLNode* node){
dfrausto3 6:453dc852ac0f 54 return node->next;
dfrausto3 6:453dc852ac0f 55 }
dfrausto3 6:453dc852ac0f 56
dfrausto3 6:453dc852ac0f 57 LLNode* getPrev(LLNode* node){
dfrausto3 6:453dc852ac0f 58 return node->prev;
dfrausto3 6:453dc852ac0f 59 }
dfrausto3 6:453dc852ac0f 60
dfrausto3 6:453dc852ac0f 61 void* getData(LLNode* node){
dfrausto3 6:453dc852ac0f 62 return node->data;
dfrausto3 6:453dc852ac0f 63 }
dfrausto3 6:453dc852ac0f 64
dfrausto3 6:453dc852ac0f 65 //============================
dfrausto3 6:453dc852ac0f 66 /* Inserting nodes into lists */
dfrausto3 6:453dc852ac0f 67 //============================
dfrausto3 6:453dc852ac0f 68
dfrausto3 6:453dc852ac0f 69 void insertAfter(DLinkedList* dLinkedList, LLNode* prev_node, void* data){
dfrausto3 6:453dc852ac0f 70 LLNode* newNode = create_llnode(data); //Creates new Node
dfrausto3 6:453dc852ac0f 71 LLNode* nextNode = getNext(prev_node); //gets a pointer for the next node
dfrausto3 6:453dc852ac0f 72 if (prev_node != NULL) {
dfrausto3 6:453dc852ac0f 73 if (nextNode == NULL) { //if the node passed through is the tail then inserts the new node as the new tail
dfrausto3 6:453dc852ac0f 74 prev_node->next = newNode;
dfrausto3 6:453dc852ac0f 75 newNode->prev = prev_node;
dfrausto3 6:453dc852ac0f 76 dLinkedList->tail = newNode;
dfrausto3 6:453dc852ac0f 77 dLinkedList->size = dLinkedList->size + 1;
dfrausto3 6:453dc852ac0f 78 }
dfrausto3 6:453dc852ac0f 79 else { //if the node passed through is not the tail then inserts the new node after and updates surrounding nodes
dfrausto3 6:453dc852ac0f 80 newNode->next = nextNode;
dfrausto3 6:453dc852ac0f 81 nextNode->prev = newNode;
dfrausto3 6:453dc852ac0f 82 prev_node->next = newNode;
dfrausto3 6:453dc852ac0f 83 newNode->prev = prev_node;
dfrausto3 6:453dc852ac0f 84 dLinkedList->size = dLinkedList->size + 1;
dfrausto3 6:453dc852ac0f 85 }
dfrausto3 6:453dc852ac0f 86 }
dfrausto3 6:453dc852ac0f 87 else {
dfrausto3 6:453dc852ac0f 88 printf("ERROR: Node is Null\n");
dfrausto3 6:453dc852ac0f 89 }
dfrausto3 6:453dc852ac0f 90 }
dfrausto3 6:453dc852ac0f 91
dfrausto3 6:453dc852ac0f 92
dfrausto3 6:453dc852ac0f 93 void insertBefore(DLinkedList* dLinkedList, LLNode* prev_node, void* data){
dfrausto3 6:453dc852ac0f 94 LLNode* newNode = create_llnode(data); //Creates new node
dfrausto3 6:453dc852ac0f 95 LLNode* prevNode = getPrev(prev_node); //gets a pointer for the prev node
dfrausto3 6:453dc852ac0f 96 if (prev_node != NULL) {
dfrausto3 6:453dc852ac0f 97 if (prevNode == NULL) { // if the node passed through is the head then inserts the node as the new head
dfrausto3 6:453dc852ac0f 98 prev_node->prev = newNode;
dfrausto3 6:453dc852ac0f 99 newNode->next = prev_node;
dfrausto3 6:453dc852ac0f 100 dLinkedList->head = newNode;
dfrausto3 6:453dc852ac0f 101 dLinkedList->size = dLinkedList->size + 1;
dfrausto3 6:453dc852ac0f 102 }
dfrausto3 6:453dc852ac0f 103 else { //if the node passed through is not the head then inserts the new node before and updates surrounding nodes
dfrausto3 6:453dc852ac0f 104 newNode->prev = getPrev(prev_node);
dfrausto3 6:453dc852ac0f 105 prevNode->next = newNode;
dfrausto3 6:453dc852ac0f 106 prev_node->prev = newNode;
dfrausto3 6:453dc852ac0f 107 newNode->next = prev_node;
dfrausto3 6:453dc852ac0f 108 dLinkedList->size = dLinkedList->size + 1;
dfrausto3 6:453dc852ac0f 109 }
dfrausto3 6:453dc852ac0f 110 }
dfrausto3 6:453dc852ac0f 111 else {
dfrausto3 6:453dc852ac0f 112 printf("ERROR: Node is Null\n");
dfrausto3 6:453dc852ac0f 113 }
dfrausto3 6:453dc852ac0f 114 }
dfrausto3 6:453dc852ac0f 115
dfrausto3 6:453dc852ac0f 116
dfrausto3 6:453dc852ac0f 117 void insertHead(DLinkedList* dLinkedList, void* data){ //inserts data at the head
dfrausto3 6:453dc852ac0f 118 LLNode* newHead = create_llnode(data);
dfrausto3 6:453dc852ac0f 119 if (dLinkedList == NULL) { //if dLinkedList does not exist throws an error message
dfrausto3 6:453dc852ac0f 120 printf("Cant' do that");
dfrausto3 6:453dc852ac0f 121 return;
dfrausto3 6:453dc852ac0f 122 }
dfrausto3 6:453dc852ac0f 123 else if (dLinkedList->head == NULL) {
dfrausto3 6:453dc852ac0f 124 dLinkedList->head = newHead;
dfrausto3 6:453dc852ac0f 125 dLinkedList->tail = newHead;
dfrausto3 6:453dc852ac0f 126 dLinkedList->size = dLinkedList->size + 1;
dfrausto3 6:453dc852ac0f 127 }
dfrausto3 6:453dc852ac0f 128 else {
dfrausto3 6:453dc852ac0f 129 LLNode* oldHead = dLinkedList->head;
dfrausto3 6:453dc852ac0f 130 dLinkedList->head = newHead;
dfrausto3 6:453dc852ac0f 131 newHead->next = oldHead;
dfrausto3 6:453dc852ac0f 132 oldHead->prev = newHead;
dfrausto3 6:453dc852ac0f 133 dLinkedList->size = dLinkedList->size + 1;
dfrausto3 6:453dc852ac0f 134 }
dfrausto3 6:453dc852ac0f 135 }
dfrausto3 6:453dc852ac0f 136
dfrausto3 6:453dc852ac0f 137 void insertTail(DLinkedList* dLinkedList, void* data) { //if dLinkedList does not exist throws an error message
dfrausto3 6:453dc852ac0f 138 LLNode* newTail = create_llnode(data);
dfrausto3 6:453dc852ac0f 139 if (dLinkedList == NULL) {
dfrausto3 6:453dc852ac0f 140 printf("Cant' do that");
dfrausto3 6:453dc852ac0f 141 return;
dfrausto3 6:453dc852ac0f 142 }
dfrausto3 6:453dc852ac0f 143 else if (dLinkedList->head == NULL) {
dfrausto3 6:453dc852ac0f 144 dLinkedList->head = newTail;
dfrausto3 6:453dc852ac0f 145 dLinkedList->tail = newTail;
dfrausto3 6:453dc852ac0f 146 dLinkedList->size = dLinkedList->size + 1;
dfrausto3 6:453dc852ac0f 147 }
dfrausto3 6:453dc852ac0f 148 else {
dfrausto3 6:453dc852ac0f 149 LLNode* oldTail = dLinkedList->tail;
dfrausto3 6:453dc852ac0f 150 dLinkedList->tail = newTail;
dfrausto3 6:453dc852ac0f 151 newTail->prev = oldTail;
dfrausto3 6:453dc852ac0f 152 oldTail->next = newTail;
dfrausto3 6:453dc852ac0f 153 dLinkedList->size = dLinkedList->size + 1;
dfrausto3 6:453dc852ac0f 154 }
dfrausto3 6:453dc852ac0f 155
dfrausto3 6:453dc852ac0f 156 }
dfrausto3 6:453dc852ac0f 157
dfrausto3 6:453dc852ac0f 158 //============================
dfrausto3 6:453dc852ac0f 159 /* Looking up nodes in lists */
dfrausto3 6:453dc852ac0f 160 //============================
dfrausto3 6:453dc852ac0f 161
dfrausto3 6:453dc852ac0f 162 LLNode* findNode(DLinkedList* dLinkedList, void* data){
dfrausto3 6:453dc852ac0f 163 //LLNode* findNode = create_llnode(data);
dfrausto3 6:453dc852ac0f 164
dfrausto3 6:453dc852ac0f 165 LLNode* compNode = dLinkedList->head;
dfrausto3 6:453dc852ac0f 166 if (compNode == NULL) {
dfrausto3 6:453dc852ac0f 167 return NULL;
dfrausto3 6:453dc852ac0f 168 }
dfrausto3 6:453dc852ac0f 169 //runs through dLinkedList looking for data
dfrausto3 6:453dc852ac0f 170 int i;
dfrausto3 6:453dc852ac0f 171 for (i = 0; i < dLinkedList->size; i++) {
dfrausto3 6:453dc852ac0f 172 int j = dLinkedList->compare(compNode->data, data);
dfrausto3 6:453dc852ac0f 173 if (j == 1) {
dfrausto3 6:453dc852ac0f 174 return compNode;
dfrausto3 6:453dc852ac0f 175 }
dfrausto3 6:453dc852ac0f 176 else {
dfrausto3 6:453dc852ac0f 177 compNode = compNode->next;
dfrausto3 6:453dc852ac0f 178 }
dfrausto3 6:453dc852ac0f 179 }
dfrausto3 6:453dc852ac0f 180 return NULL;
dfrausto3 6:453dc852ac0f 181 }
dfrausto3 6:453dc852ac0f 182
dfrausto3 6:453dc852ac0f 183 //===========================
dfrausto3 6:453dc852ac0f 184 /* Deleting nodes and lists */
dfrausto3 6:453dc852ac0f 185 //===========================
dfrausto3 6:453dc852ac0f 186
dfrausto3 6:453dc852ac0f 187 void deleteNode(DLinkedList* dLinkedList, LLNode* Node){
dfrausto3 6:453dc852ac0f 188 if (Node != NULL){
dfrausto3 6:453dc852ac0f 189 LLNode* PrevNode = getPrev(Node);
dfrausto3 6:453dc852ac0f 190 LLNode* NextNode = getNext(Node);
dfrausto3 6:453dc852ac0f 191 if (PrevNode == NULL && NextNode != NULL) { //if head delets noed and updates the head of the list
dfrausto3 6:453dc852ac0f 192 dLinkedList->head = NextNode;
dfrausto3 6:453dc852ac0f 193 dLinkedList->size = dLinkedList->size - 1;
dfrausto3 6:453dc852ac0f 194 NextNode->prev = NULL;
dfrausto3 6:453dc852ac0f 195 }
dfrausto3 6:453dc852ac0f 196 else if (NextNode == NULL && PrevNode != NULL) { //if tail delets the node and updates the tail of the list
dfrausto3 6:453dc852ac0f 197 dLinkedList->tail = PrevNode;
dfrausto3 6:453dc852ac0f 198 dLinkedList->size = dLinkedList->size - 1;
dfrausto3 6:453dc852ac0f 199 PrevNode->next = NULL;
dfrausto3 6:453dc852ac0f 200 }
dfrausto3 6:453dc852ac0f 201 else if (PrevNode == NULL && NextNode == NULL) {
dfrausto3 6:453dc852ac0f 202 dLinkedList->tail = NULL;
dfrausto3 6:453dc852ac0f 203 dLinkedList->head = NULL;
dfrausto3 6:453dc852ac0f 204 dLinkedList->size = dLinkedList->size - 1;
dfrausto3 6:453dc852ac0f 205 }
dfrausto3 6:453dc852ac0f 206 else {
dfrausto3 6:453dc852ac0f 207 dLinkedList->size = dLinkedList->size - 1;
dfrausto3 6:453dc852ac0f 208 (Node->prev)->next = NextNode;
dfrausto3 6:453dc852ac0f 209 (Node->next)->prev = PrevNode;
dfrausto3 6:453dc852ac0f 210 }
dfrausto3 6:453dc852ac0f 211 }
dfrausto3 6:453dc852ac0f 212 //free(Node->data);
dfrausto3 6:453dc852ac0f 213 free(Node);
dfrausto3 6:453dc852ac0f 214 }
dfrausto3 6:453dc852ac0f 215
dfrausto3 6:453dc852ac0f 216
dfrausto3 6:453dc852ac0f 217 void destroyList(DLinkedList* dLinkedList){
dfrausto3 6:453dc852ac0f 218 LLNode* startNode = dLinkedList->head;
dfrausto3 6:453dc852ac0f 219 LLNode* nextNode;
dfrausto3 6:453dc852ac0f 220 if (startNode != NULL) {
dfrausto3 6:453dc852ac0f 221 nextNode = startNode->next;
dfrausto3 6:453dc852ac0f 222 }
dfrausto3 6:453dc852ac0f 223 int i;
dfrausto3 6:453dc852ac0f 224 for (i = 0; i < getSize(dLinkedList); i++) {
dfrausto3 6:453dc852ac0f 225 free(startNode->data);
dfrausto3 6:453dc852ac0f 226 free(startNode);
dfrausto3 6:453dc852ac0f 227 startNode = nextNode;
dfrausto3 6:453dc852ac0f 228 if (startNode != NULL) {
dfrausto3 6:453dc852ac0f 229 nextNode = startNode->next;
dfrausto3 6:453dc852ac0f 230 }
dfrausto3 6:453dc852ac0f 231 }
dfrausto3 6:453dc852ac0f 232 free(dLinkedList);
dfrausto3 6:453dc852ac0f 233 }
dfrausto3 6:453dc852ac0f 234
dfrausto3 6:453dc852ac0f 235 //==================
dfrausto3 6:453dc852ac0f 236 /* Reversing lists */
dfrausto3 6:453dc852ac0f 237 //==================
dfrausto3 6:453dc852ac0f 238 void reverse(DLinkedList* dLinkedList) {
dfrausto3 6:453dc852ac0f 239 if (dLinkedList->size > 1) {
dfrausto3 6:453dc852ac0f 240 LLNode* headNode = dLinkedList->head;
dfrausto3 6:453dc852ac0f 241 LLNode* tailNode = dLinkedList->tail;
dfrausto3 6:453dc852ac0f 242 LLNode* tempNode = dLinkedList->head;
dfrausto3 6:453dc852ac0f 243 int i = 0;
dfrausto3 6:453dc852ac0f 244 dLinkedList->head = tailNode;
dfrausto3 6:453dc852ac0f 245 dLinkedList->tail = headNode;
dfrausto3 6:453dc852ac0f 246 while (i < dLinkedList->size) {
dfrausto3 6:453dc852ac0f 247 headNode->prev = headNode->next;
dfrausto3 6:453dc852ac0f 248 tempNode = headNode->prev;
dfrausto3 6:453dc852ac0f 249 headNode = tempNode;
dfrausto3 6:453dc852ac0f 250 i++;
dfrausto3 6:453dc852ac0f 251 }
dfrausto3 6:453dc852ac0f 252
dfrausto3 6:453dc852ac0f 253
dfrausto3 6:453dc852ac0f 254 }
dfrausto3 6:453dc852ac0f 255 }