ECE 2036 Project

Dependencies:   mbed wave_player 4DGL-uLCD-SE

doublely_linked_list.h

Committer:
rconnorlawson
Date:
2017-11-03
Revision:
0:cf4396614a79

File content as of revision 0:cf4396614a79:

/** @file doublely_linked_list.h */
#ifndef DOUBLELINKEDLIST_H
#define DOUBLELINKEDLIST_H


/********************************************
 * Doublely Linked List library functions *
 * For more details on their functionality, *
 * see the documentation in doublely_linked_list.c *
 ********************************************/


/**
 * This structure represents an entire linked list.
 */
typedef struct dlinkedlist_t {
    /** The head pointer for the list (points to the first node) */
    struct llnode_t* head;

    /** The tail pointer for the list (points to the last node) */
    struct llnode_t* tail;

    /** The current pointer for the list (points to the current node) */
    struct llnode_t* current;

    /** The number of nodes in the list */
    int size;
} DLinkedList;

/**
 * This structure represents a single list node.
 */
typedef struct llnode_t {
    /** The data associated with this node */
    void* data;

    /** A pointer to the previous node in the list. NULL if there is no previous node. */
    struct llnode_t* previous;

    /** A pointer to the next node in the list. NULL if there is no next node. */
    struct llnode_t* next;
} LLNode;


/**
 * create_dlinkedlist
 *
 * Creates a doublely liked list by allocating memory for it on the heap. Initialize the size to zero,
 * as well as head, current, and tail pointer to NULL
 *
 * @return A pointer to an empty dlinkedlist
 */
DLinkedList* create_dlinkedlist(void);

/**
 * create_llnode
 *
 * Helper function that creates a node by allocating memory for it on the heap,
 * and initializing its previous and next pointers to NULL and its data pointer to the input
 * data pointer
 *
 * @param data A void pointer to data the user is adding to the doublely linked list.
 * @return A pointer to the linked list node
 */
LLNode* create_llnode(void* data);


/**
 * InsertHead
 *
 * Insert the data to the head of the doublely linked list.
 * Do not update the current node.
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @param data A void pointer to data the user is adding to the doublely linked list.
 *
 */
void insertHead(DLinkedList* dLinkedList, void* data);


/**
 * insertTail
 *
 * Insert the data to the tail of the doublely linked list.
 * Do not update the current node.
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @param data A void pointer to data the user is adding to the doublely linked list.
 *
 */
void insertTail(DLinkedList* dLinkedList, void* data);


/**
 * insertAfter
 *
 * Insert a new node into the doublely linked list immediately after the current node.
 * If the current node is NULL, this method fails. Do not update the current node.
 *
 * @param dLinkedList A pointer to the doublely linked list.
 * @param newData A void pointer to the new data to insert.
 * @return 1 if inserted the new data successfully
 *         0 if the current pointer is NULL
 */
int insertAfter(DLinkedList* dLinkedList, void* newData);


/**
 * insertBefore
 *
 * Insert a new node into the doublely linked list immediately before the current node.
 * If the current node is NULL, this method fails. Do not update the current node.
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @param newData A void pointer to the new data to insert
 * @return 1 if insert the new data successfully
 *         0 if the current pointer is NULL
 */
int insertBefore(DLinkedList* dLinkedList, void* newData);


/**
 * deleteBackward
 *
 * Delete the node the current pointer is pointed at, and move the current pointer backward.
 * Be aware that deleteBackward will cause problems if the current node is the list head,
 * or if the current node is the only node in the list. In these cases, the current
 * pointer should be set to NULL after deleting the node, and the list head and tail
 * pointers should be updated appropriately.
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @return the data of the new current pointer and NULL if the current pointer is NULL
 */
void* deleteBackward(DLinkedList* dLinkedList);


/**
 * deleteForward
 *
 * Delete the node the current pointer is pointed at, and move the current pointer forward.
 * Be aware that deleteForward will cause problems if the current node is the list tail,
 * or if the current node is the only node in the list. In these cases, the current
 * pointer should be set to NULL after deleting the node, and the list head and tail
 * pointers should be updated appropriately.
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @return the data of the new current pointer and NULL if the current pointer is NULL
 */
void* deleteForward(DLinkedList* dLinkedList);

/**
 * removeBackward
 *
 * Remove the node the current pointer is pointed at from the list and return the data
 * associated with the current node. Move the current pointer backward.
 * Be aware that removeBackward will cause problems if the current node is the list head,
 * or if the current node is the only node in the list. In these cases, the current
 * pointer should be set to NULL after removing the node, and the list head and tail
 * pointers should be updated appropriately.
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @return the data of the removed node, or NULL if the current pointer is NULL
 */
void* removeBackward(DLinkedList* dLinkedList);


/**
 * removeForward
 *
 * Remove the node the current pointer is pointed at from the list and return the data
 * associated with the current node. Move the current pointer forward.
 * Be aware that removeForward will cause problems if the current node is the list tail,
 * or if the current node is the only node in the list. In these cases, the current
 * pointer should be set to NULL after removing the node, and the list head and tail
 * pointers should be updated appropriately.
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @return the data of the removed node, or NULL if the current pointer is NULL
 */
void* removeForward(DLinkedList* dLinkedList);


/**
 * destroyList
 *
 * Destroy the doublely linked list. Everything in the linked list including list structure,
 * nodes and data are all freed from the heap
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @param shouldFree Flag. 1 indicates if data should be freed upon deletion of node.
 *
 */
void destroyList(DLinkedList* dLinkedList);


/**
 * getHead
 *
 * Return the data contained in the head of the doublely linked list, and set the list current pointer
 * to head
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @return the head data or  NULL if head == NULL
 */
void* getHead(DLinkedList* dLinkedList);

/**
 * getTail
 *
 * Return the data contained in the tail of the doublely linked list, and set the current pointer
 * to tail
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @return the tail data or  NULL if tail == NULL
 */
void* getTail(DLinkedList* dLinkedList);


/**
 * getCurrent
 *
 * Return the data the current pointer is pointing at
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @return the current data or NULL if current == NULL
 */
void* getCurrent(DLinkedList* dLinkedList);


/**
 * getNext
 *
 * Return the next data the current pointer is pointing at, and move the current pointer to next node.
 * If the current pointer is at the tail, the next node is NULL.
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @return the next data or NULL if current == NULL
 */
void* getNext(DLinkedList* dLinkedList);


/**
 * getPrevious
 *
 * Return the previous data the current pointer is pointing at, and move the current pointer to
 * previous node.  If the current pointer is at the head, the previous node is NULL.
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @return the previous data or NULL if current == NULL
 */
void* getPrevious(DLinkedList* dLinkedList);


/**
 * getSize
 *
 * Return the size of the doublely linked list
 *
 * @param dLinkedList A pointer to the doublely linked list
 * @return  the size
 */
int getSize(DLinkedList* dLinkedList);
#endif