Here's something I wrote a long time ago in straight C. I annotated the code as I wrote it so I wouldn't have to remember how it worked ever again. You might find the reading instructional on how to fiddle with double linked lists:
Header File
#pragma once
typedef struct tag_queue_entry {
struct tag_queue_entry *qprev;
struct tag_queue_entry *qnext;
} queue_entry_t;
typedef struct tag_queue_header {
queue_entry_t *qfirst;
queue_entry_t *qlast;
} queue_header_t;
#ifdef _MSC_VER /* MicroSoft C++ compiles, declare externals as "C" calling standard */
#ifdef __cplusplus
extern "C" {
#endif
#endif
void queue_insert(queue_entry_t *e, queue_header_t *h, queue_entry_t *t);
void queue_remove(queue_entry_t *e, queue_header_t *h);
#ifdef _MSC_VER
#ifdef __cplusplus
}
#endif
#endif
Code Body
#include "StdAfx.h"
#include <stdlib.h>
#include "queueV2.h"
void queue_insert(queue_entry_t *e, queue_header_t *h, queue_entry_t *t)
{
queue_entry_t *n;
if (t == NULL)
{
n = h->qfirst;
h->qfirst = e;
}
else
{
n = t->qnext;
t->qnext = e;
}
e->qprev = t;
if ((e->qnext = n) == NULL)
h->qlast = e;
else n->qprev = e;
}
void queue_remove(queue_entry_t *e, queue_header_t *h)
{
queue_entry_t *p;
queue_entry_t *n;
n = e->qnext;
if ((p = e->qprev) == NULL)
h->qfirst = n;
else p->qnext = n;
if (n == NULL)
h->qlast = p;
else n->qprev = p;
}
</stdlib.h>