Пример реализации двусвязного списка
#include <stdio.h>
#define DTYPE int
struct li {
struct li* next, *prev;
DTYPE data;
};
struct list {
struct li* first, *last;
};
typedef struct li li_t;
typedef struct list list_t;
int push(list_t* l, DTYPE x);
int pop(list_t* l, DTYPE *x);
int unshift(list_t* l, DTYPE x);
int shift(list_t* l, DTYPE *x);
int push(list_t *l, DTYPE x) {
li_t *a = (li_t*)malloc(sizeof(li_t));
if(a == NULL)
return 0;
a->data = x;
a->next = l->first;
a->prev = NULL;
if(l->first) {
l->first->prev = a;
}
l->first = a;
return 1;
}
int pop(list_t *l, DTYPE *x) {
if(l && l->first != NULL ) {
li_t *new_first = l->first->next;
*x = l->first->data;
free (l->first);
l->first = new_first;
if(new_first != NULL) {
new_first->prev = 0;
}
return 1;
} else {
fprintf(stderr, "List is empty\n");
return 0;
}
}
int unshift(list_t* l, DTYPE x) {
....
}
int shift(list_t* l, DTYPE *x) {
...
}