#include <stdio.h>
#include <stdlib.h>
typedef int elem_t;
struct node_info {
elem_t data;
struct node_info *next;
};
static void init_head(struct node_info *head)
{
head->data = 0;
head->next = head;
}
static void list_add(struct node_info *head,
elem_t data)
{
struct node_info *node = (struct node_info*)malloc(sizeof(struct node_info));
node->data = data;
node->next = head->next;
head->next = node;
}
static void list_add_tail(struct node_info *head,
elem_t data)
{
struct node_info *node = (struct node_info*)malloc(sizeof(struct node_info));
node->data = data;
//瀵绘.?捐〃??.?涓..?
struct node_info *cur = head->next;
for (; cur->next != head; cur = cur->next) {}
node->next = head;
cur->next = node;
}
static void list_for_each(struct node_info *head,
void (*todo)(struct node_info *))
{
struct node_info *cur = head->next;
for (; cur != head; cur = cur->next) {
todo(cur);
}
}
static void list_del(struct node_info *head,
elem_t data)
{
struct node_info *back = head;
struct node_info *cur = head->next;
for (; cur != head;) {
if (cur->data == data) {
back->next = cur->next;
free(cur);
cur = back->next;
} else {
back = cur;
cur = cur->next;
}
}
}
void list_destroy(struct node_info *head)
{
struct node_info *cur = head->next;
for (; cur != head; cur = head->next) {
head->next = cur->next;
free(cur);
}
}
#define LIST_LEN 10
static void print(struct node_info *node)
{
printf("%d ", node->data);
}
int main()
{
struct node_info head;
init_head(&head);
size_t i = 0;
for (i = 0; i < LIST_LEN; i++) {
list_add(&head, i);
list_add_tail(&head, i);
}
list_del(&head, 0);
list_for_each(&head, print);
printf("\n");
list_destroy(&head);
return 0;
}