67 lines
835 B
C
67 lines
835 B
C
|
|
#include <assert.h>
|
|
|
|
#include <debug.h>
|
|
|
|
#include "struct.h"
|
|
#include "remove.h"
|
|
|
|
void linked_list_remove(
|
|
struct linked_list* list,
|
|
struct value* element,
|
|
size_t link_offset)
|
|
{
|
|
ENTER;
|
|
|
|
assert(list->head);
|
|
|
|
struct link* link = (void*) element + link_offset;
|
|
|
|
assert(link->in_set);
|
|
|
|
if (link->prev)
|
|
{
|
|
struct link* prev_link = (void*) link->prev + link_offset;
|
|
|
|
prev_link->next = link->next;
|
|
}
|
|
else
|
|
{
|
|
list->head = link->next;
|
|
}
|
|
|
|
if (link->next)
|
|
{
|
|
struct link* next_link = (void*) link->next + link_offset;
|
|
|
|
next_link->prev = link->prev;
|
|
}
|
|
else
|
|
{
|
|
list->tail = link->prev;
|
|
}
|
|
|
|
link->prev = link->next = NULL;
|
|
link->in_set = false;
|
|
|
|
EXIT;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|