parent
4f867b29cb
commit
8db61cec44
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
Loading…
Reference in New Issue