Much much better

This commit is contained in:
2021-02-23 07:57:24 +11:00
parent adc7f5e208
commit 4f02128553
24 changed files with 371 additions and 360 deletions

View File

@ -1,111 +0,0 @@
/**
* Copyright (c) 2021 Dominic Msters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "list.h"
List * listCreate() {
List *list = malloc(sizeof(List));
if(list == NULL) return NULL;
list->start = NULL;
list->end = NULL;
list->size = 0;
return list;
}
ListEntry * listAdd(List *list, void *data) {
//Create the list entry
ListEntry *entry = malloc(sizeof(ListEntry));
if(entry == NULL) return NULL;
entry->data = data;
entry->next = NULL;
entry->prev = NULL;
//Add it to the list
listAddEntry(list, entry);
//Return the entry
return entry;
}
void listAddEntry(List *list, ListEntry *entry) {
//Is this the first / only thing in the list?
if(list->start == NULL) {
list->start = entry;
list->end = entry;
} else {
//Make the end's next be this entry, and this entry's prev the end, then
//make this the new end
entry->prev = list->end;
list->end->next = entry;
list->end = entry;
}
list->size++;
}
void listRemove(List *list, ListEntry *entry, bool freeData) {
//Update next and prev
if(entry->prev != NULL) entry->prev->next = entry->next;
if(entry->next != NULL) entry->next->prev = entry->prev;
//Was this at the end?
if(list->start == entry) list->start = entry->next;
if(list->end == entry) list->end = entry->prev;
if(freeData) free(entry->data);
free(entry);
list->size--;
}
ListEntry * listGetByIndex(List *list, int index) {
if(index >= list->size) return NULL;
//TODO: We can probably make this more efficient by deciding which way we
//should loop from based on the list size.
int i = 0;
ListEntry *previous = list->start;
while(previous != NULL) {
if(i == index) return previous;
i++;
previous = previous->next;
}
return NULL;
}
int listGetIndex(List *list, ListEntry *entry) {
int i = 0;
ListEntry *previous = list->start;
while(previous != NULL) {
if(previous == entry) return i;
i++;
previous = previous->next;
}
return -1;
}
void listDispose(List *list, bool freeData) {
//Free all of the entries
ListEntry *next = list->start;
ListEntry *current;
while(next != NULL) {
current = next;
next = current->next;
if(freeData) free(current->data);
free(current);
}
free(list);
}

View File

@ -1,86 +0,0 @@
// Copyright (c) 2021 Dominic Msters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#pragma once
#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
/**
* Entry within a given linked list.
* @param data* The pointer to the data that is within the entry.
* @param prev* Pointer to the previous entry in the list.
* @param next* Pointer to the next entry in the list.
*/
typedef struct ListEntry {
void *data;
struct ListEntry *prev;
struct ListEntry *next;
} ListEntry;
/**
* Linked List of elements, Doubly Linked.
* @param size The count of elements currently within the list
* @param start* First element within the list.
* @param end* Last element within the list.
*/
typedef struct {
int size;
ListEntry *start;
ListEntry *end;
} List;
//Method definitions
/**
* Creates a new linked list
* @return Pointer to a new linked list.
*/
List * listCreate();
/**
* Adds data to a linked list
*
* @param list* Pointer to a previously created linked list
* @param data* Pointer to your data
* @return A pointer to the new entry in the linked list that was created
*/
ListEntry * listAdd(List *list, void *data);
/**
* Internal function
*/
void listAddEntry(List *list, ListEntry *entry);
/**
* Remove a list entry from the linked list
* @param list* Pointer to a previously created linked list
* @param entry* Pointer to the entry within the linked list.
* @param freeData If true the data of the ListEntry will be free()'d
*/
void listRemove(List *list, ListEntry *entry, bool freeData);
/**
* Returns the entry at a given index. This method is costly.
* @param list* Pointer to a previously created linked list
* @param index Index of element within the linked list to remove
* @return The entry at the index or NULL if outside the bounds.
*/
ListEntry * listGetByIndex(List *list, int index);
/**
* Returns the index of an entry within the linked list. This method is costly.
* @param list* Pointer to a previously created linked list
* @param entry* Pointer to the entry within the linked list.
* @return The index within the list the entry is in, or -1 if not found.
*/
int listGetIndex(List *list, ListEntry *entry);
/**
* Dispose a previously created link list.
* @param list* Pointer to a previously created linked list
* @param freeData If true the data within each ListEntry will be free()'d
*/
void listDispose(List *list, bool freeData);