struct ll *lldel(struct ll *curll, void *object,
int (*objectcmp) (const void *object1, const void *object2))
{
- struct ll *cur;
+ struct ll *cur = NULL;
+ struct ll *old = NULL;
assert(objectcmp != NULL);
if (cur == NULL) {
return NULL;
} else if (!(*objectcmp)(cur->object, object)) {
- return cur->next;
+ old = cur;
+ cur = cur->next;
+ free(old);
+ return cur;
}
while (cur->next != NULL) {
if (!(*objectcmp)(cur->next->object, object)) {
+ old = cur->next;
cur->next = cur->next->next;
+ free(old);
break;
}
}
{
struct ll *cur;
+ assert(objectcmp != NULL);
+
cur = curll;
while (cur != NULL && (*objectcmp)(cur->object, object)) {
cur = cur->next;
return count;
}
+
+/**
+ * llfree - Frees a linked list.
+ * @curll: The list to free.
+ * @objectfree: A pointer to a free function for the object.
+ *
+ * Walks through a list and free it. If a function is provided for
+ * objectfree then it's called for each element to free them, if it's NULL
+ * just the list is freed.
+ */
+struct ll *llfree(struct ll *curll,
+ void (*objectfree) (void *object))
+{
+ struct ll *nextll;
+
+ while (curll != NULL) {
+ nextll = curll->next;
+ if (curll->object != NULL && objectfree != NULL) {
+ objectfree(curll->object);
+ curll->object = NULL;
+ }
+ free(curll);
+ curll = nextll;
+ }
+ return NULL;
+}