Here's an example
Code:
typedef struct Node {
void* data;
struct Node* next;
struct Node* prev;
} Node;
int list_insert(Node** header_ptr, void* data);
void list_destroy(Node** header_ptr);
Code:
/* circle.h */
#include <stdlib.h>
#include <stdio.h>
#include "circle.h"
int list_insert(Node** header_ptr, void* data)
{
Node* header;
Node* n;
header = *header_ptr;
n = malloc(sizeof (Node));
if (n == NULL)
return 0;
n->data = data;
if (header == 0) {
/* insertion into a zero node circular list */
n->next = n;
n->prev = n;
*header_ptr = n;
} else if (header == header->next) {
/* insertion into a one node circular list */
n->next = header;
n->prev = header;
header->next = n;
header->prev = n;
} else {
/* insertion into a >= 2 node circular list */
n->next = header->next;
n->prev = header;
header->next = n;
}
return 0;
}
void list_destroy(Node** header_ptr)
{
Node* curr = *header_ptr;
Node* start = curr;
if (curr != NULL) {
do {
Node* tmp = curr->next;
free(curr->data);
free(curr);
curr = tmp;
} while(curr != start);
}
*header_ptr = 0;
}
Code:
#include <stdlib.h>
#include <stdio.h>
#include "circle.h"
int main(void)
{
Node* header = 0;
Node* n;
int* p;
float* fp;
int i;
for (i = 0; i < 10; ++i) {
p = malloc(sizeof (int));
*p = i;
list_insert(&header, p);
}
n = header;
for (i = 0; i < 30; ++i) {
printf("%d ", *(int*)n->data);
if ((i + 1) % 10 == 0)
putchar('\n');
n = n->next;
}
list_destroy(&header);
for (i = 1; i <= 100; ++i) {
fp = malloc(sizeof(float));
*fp = 5.0 / i;
list_insert(&header, fp);
}
n = header;
for (i = 0; i < 300; ++i) {
printf("%.3f ", *(float*)n->data);
if ((i + 1) % 10 == 0)
putchar('\n');
if ((i + 1) % 100 == 0)
putchar('\n');
n = n->next;
}
list_destroy(&header);
return 0;
}