83 lines
2 KiB
C
83 lines
2 KiB
C
/* list.c: List Structure */
|
|
|
|
#include "list.h"
|
|
|
|
/* List Functions */
|
|
|
|
/**
|
|
* Create a List structure.
|
|
*
|
|
* @return Pointer to new List structure (must be deleted later).
|
|
**/
|
|
List * list_create() {
|
|
List *newList = calloc(1, sizeof(List)); // Use calloc to set everything to 0
|
|
|
|
newList->sentinel.next = &newList->sentinel;
|
|
newList->sentinel.prev = &newList->sentinel;
|
|
|
|
return newList;
|
|
}
|
|
|
|
/**
|
|
* Delete List structure.
|
|
*
|
|
* @param l Pointer to List structure.
|
|
* @param release Whether or not to release the string values.
|
|
**/
|
|
void list_delete(List *l, bool release) {
|
|
Node *current = l->sentinel.next; // Start with first node after sentinel node
|
|
|
|
while (current != &l->sentinel) {
|
|
Node *next = current->next;
|
|
node_delete(current, release); // Call node_delete and pass in release variable
|
|
current = next;
|
|
}
|
|
|
|
free(l);
|
|
}
|
|
|
|
/**
|
|
* Add new Value to back of List structure.
|
|
*
|
|
* @param l Pointer to List structure.
|
|
* @param v Value to add to back of List structure.
|
|
**/
|
|
void list_append(List *l, Value v) {
|
|
Node *appNode = node_create(v, &l->sentinel, l->sentinel.prev);
|
|
|
|
l->sentinel.prev->next = appNode;
|
|
l->sentinel.prev = appNode;
|
|
l->size++;
|
|
}
|
|
|
|
/**
|
|
* Remove Value at specified index from List structure.
|
|
*
|
|
* @param l Pointer to List structure.
|
|
* @param index Index of Value to remove from List structure.
|
|
*
|
|
* @return Value at index in List structure (-1 if index is out of bounds).
|
|
**/
|
|
Value list_pop(List *l, size_t index) {
|
|
if (index >= l->size) {
|
|
return (Value)-1L;
|
|
}
|
|
|
|
// Find the node based on index
|
|
Node *current = l->sentinel.next;
|
|
for (size_t i = 0; i < index; i++) {
|
|
current = current->next;
|
|
}
|
|
|
|
// Unlink the node
|
|
current->prev->next = current->next;
|
|
current->next->prev = current->prev;
|
|
|
|
Value v = current->value;
|
|
node_delete(current, false);
|
|
l->size--;
|
|
|
|
return v;
|
|
}
|
|
|
|
/* vim: set sts=4 sw=4 ts=8 expandtab ft=c: */
|