根据算法导论 “10.3 Implementing pointers and objects” 这一章节实现。
list.h:
#ifndef _LINK_LIST_HEADER_
void init_list();
int push_back(int key);
int push_front(int key);
void erase(int key);
void print_list(void);
#define _LINK_LIST_HEADER_
#endif//_LINK_LIST_HEADER_
list.c:
#include <stdio.h>
#include "list.h"
#define MAX_SIZE 100
struct list_element
{
int prev;
int next;
int key;
int used;
};
struct list_element g_list[MAX_SIZE];
int used_head, free_head;
int used_tail, free_tail;
int used_size, free_size;
void init_list(void)
{
used_head = -1;
free_head = 0;
free_tail = MAX_SIZE-1;
used_tail = -1;
int i;
for(i = 0; i < MAX_SIZE -1; i++)
{
g_list[i].next = i+1;
g_list[i].used = 0;
}
g_list[i].next = -1;
g_list[i].used = 0;
free_size = MAX_SIZE;
used_size = 0;
}
int push_back(int key)
{
if( free_size == 0)
{
return 0;
}
if(used_size == 0)
{
used_head = free_head;
used_tail = free_head;
free_head = g_list[free_head].next;
g_list[used_head].prev = -1;
g_list[used_tail].next = -1;
}
else
{
g_list[used_tail].next = free_head;
g_list[free_head].prev = used_tail;
used_tail = free_head;
free_head = g_list[free_head].next;
}
g_list[used_tail].next = -1;
g_list[used_tail].key = key;
used_size++;
free_size--;
return 1;
}
int push_front(int key)
{
if( free_size == 0)
{
return 0;
}
if(used_size == 0)
{
used_head = free_head;
used_tail = free_head;
free_head = g_list[free_head].next;
g_list[used_tail].next = -1;
g_list[used_head].prev = -1;
}
else
{
g_list[used_head].prev = free_head;
int new_free_head = free_head;
free_head = g_list[free_head].next;
g_list[new_free_head].next = used_head;
g_list[new_free_head].prev = -1;
used_head = new_free_head;
}
g_list[used_head].key = key;
used_size++;
free_size--;
return 1;
}
void erase(int key)
{
if(used_size == 0)
{
return;
}
int idx = used_head;
while(idx != -1)
{
if(g_list[idx].key == key)
{
if(idx == used_head)
{
used_head = g_list[idx].next;
g_list[used_head].prev = -1;
}
else
{
int prev = g_list[idx].prev;
g_list[prev].next = g_list[idx].next;
int next = g_list[idx].next;
if(next != -1)
{
g_list[next].prev = prev;
}
}
g_list[idx].next = free_head;
free_head = idx;
free_size++;
used_size--;
break;
}
idx = g_list[idx].next;
}
}
void print_list(void)
{
int idx = used_head;
while(idx != -1)
{
printf("%d", g_list[idx].key);
idx = g_list[idx].next;
if(idx != -1)
{
printf("--->");
}
else
{
printf("\n");
}
}
}
测试:
#include "list.h"
int main(int argc, char **argv)
{
init_list();
push_front(3);
push_front(5);
push_front(7);
push_front(24);
push_front(9);
print_list();
erase(5);
push_back(8);
print_list();
erase(9);
print_list();
erase(8);
print_list();
return 0;
}
输出:
9--->24--->7--->5--->3
9--->24--->7--->3--->8
24--->7--->3--->8
24--->7--->3