new file: src/llist.c

new file:   src/llist.h
sql
simon 2024-12-11 03:10:11 +01:00
parent 4f867b29cb
commit 8db61cec44
2 changed files with 86 additions and 0 deletions

63
src/llist.c Normal file
View File

@ -0,0 +1,63 @@
#include "llist.h"
#include <stdlib.h>
/* create new linked list
* use llistFree after use
* retturns NULL on failure
*/
llist *llistNew(void *data, int (*cmpFN)(void *a, void *b)) {
llist *r = (llist *)malloc(sizeof(llist));
if (r != NULL) {
r->cmpFn = cmpFN;
r->data = data;
r->prev = NULL;
r->next = NULL;
}
return r;
}
/*return last node of linked list;
*/
llist *llistTail(llist *l) {
llist *tail = l;
while (tail->next != NULL) {
tail = tail->next;
}
return tail;
}
/* creates new node from data and appends it to head
*
*/
llist *llistAppend(llist *head, void *data) {
llist *new = llistNew(data, head->cmpFn);
if (new != NULL) {
llist *tail = llistTail(head);
new->data = data;
new->next = NULL;
new->prev = tail;
tail->next = new;
}
return new;
}
void *llistGet(llist *head, void *key) {
llist *c = head;
while (c != NULL) {
if (key == c) {
return c;
}
c = c->next;
}
return NULL;
}
bool llistContains(llist *head, void *key) {
return llistGet(head, key) != NULL;
}
void llistFree(llist *head) {
while (head != NULL) {
llist *tmp = head->next;
free(head);
head = tmp;
}
}

23
src/llist.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef LLIST
#define LLIST
#include <stdbool.h>
typedef struct llist {
void *data;
struct llist *next;
struct llist *prev;
int (*cmpFn)(void *a, void *b); // function that compares data
} llist;
// create new linked list with content(void* data) and cmpFN
llist *llistNew(void *data, int (*cmpFN)(void *a, void *b));
// create new node with data and append to tail of head
llist *llistAppend(llist *head, void *data);
// return llistNode that contains key or NULL
void *llistGet(llist *head, void *key);
// TURE if llist contains key
bool llistContains(llist *head, void *key);
// free llist node (Does Not free data it contains!!)
void llistFree(llist *head);
#endif