数据结构设计
//定义迭代器迭代方向
#define LIST_START_HEAD 0
#define LIST_START_TAIL 1
//链表节点
typedef struct list_node
{
struct list_node* prev;
struct list_node* next;
void* value;
}list_node;
//链表
typedef struct list
{
unsigned int length;
list_node* head;
list_node* tail;
}list;
//迭代器结构
typedef struct list_iter
{
list_node* next;
int direction;
}list_iter;
接口设计
//创建链表
list* list_create();
//在链表头部添加节点
list* list_pushfront(list* list, void* value);
//在链表尾部添加节点
list* list_pushback(list* list, void* value);
//删除一个节点
void list_delnode(list* list, list_node* node);
//获取头部元素
void* get_front(list* list);
//获取尾部元素
void* get_back(list * list);
//清空链表中所有节点
void list_empty(list* list);
//释放链表
void list_release(list* list);
//创建一个迭代器
list_iter* get_list_iter(list* list, int direction);
//迭代器返回链表下一个节点值
void* get_next(list_iter* iter);
//释放迭代器内存
void list_iter_release(list_iter* iter);
接口实现
#include<stdio.h>
#include<stdlib.h>
#include"list.h"
//创建链表
list* list_create()
{
list* list = (struct list*)malloc(sizeof(struct list));
if (list == NULL)
return NULL;
list->head = list->tail = NULL;
list->length = 0;
return list;
}
//在链表头部添加节点
list* list_pushfront(list* list, void* value)
{
list_node* node = (struct list_node*)malloc(sizeof(struct list_node));
if (node == NULL)
return NULL;
node->value = value;
if (!list->length)
{
list->head = list->tail = node;
node->prev = node->next = NULL;
}
else
{
node->prev = NULL;
node->next = list->head;
list->head->prev = node;
list->head = node;
}
list->length++;
return list;
}
//在链表尾部添加节点
list* list_pushback(list* list, void* value)
{
list_node* node = (struct list_node*)malloc(sizeof(struct list_node));
if (node == NULL)
return NULL;
node->value = value;
if (!list->length)
{
list->head = list->tail = node;
node->next = node->next = NULL;
}
else
{
node->prev = list->tail;
node->next = NULL;
list->tail->next = node;
list->tail = node;
}
list->length++;
return list;
}
//删除一个节点
void list_delnode(list* list, list_node* node)
{
if (node->prev)
node->prev->next = node->next;
else
list->head = node->next;
if (node->next)
node->next->prev = node->prev;
else
list->tail = node->prev;
free(node);
list->length--;
return;
}
//获取头部元素
void* get_front(list* list)
{
if (!list->head)
return NULL;
void* value = list->head->value;
list_delnode(list, list->head);
return value;
}
//获取尾部元素
void* get_back(list* list)
{
if (!list->tail)
return NULL;
void* value = list->tail->value;
list_delnode(list, list->tail);
return value;
}
//清空链表中所有节点
void list_empty(list* list)
{
list_node* cur, * next;
cur = list->head;
while (list->length--)
{
next = cur->next;
free(cur);
cur = next;
}
list->head = list->tail = NULL;
list->length = 0;
return;
}
//释放链表
void list_release(list* list)
{
list_empty(list);
free(list);
}
//创建一个迭代器
list_iter* get_list_iter(list* list, int direction)
{
list_iter* iter = (struct list_iter*)malloc(sizeof(struct list_iter));
if (!iter)
return NULL;
if (direction == LIST_START_HEAD)
iter->next = list->head;
else
iter->next = list->tail;
iter->direction = direction;
return iter;
}
//迭代器返回链表下一个节点值
void* get_next(list_iter* iter)
{
list_node* cur = iter->next;
if (iter->direction == LIST_START_HEAD)
iter->next = cur->next;
else
iter->next = cur->prev;
return cur->value;
}
//释放迭代器内存
void list_iter_release(list_iter* iter)
{
free(iter);
}
测试代码
#include<stdio.h>
#include<stdlib.h>
#include"list.h"
int main()
{
//测试数据
char a = 'A';
char b = 'B';
char c = 'C';
//创建链表
list* list = list_create();
//测试空表
printf("---------- 测试空表是否报错 ----------\n");
printf("%p\n", get_front(list));
printf("%p\n", get_back(list));
//链表头添加数据
list_pushfront(list, &a);
list_pushfront(list, &b);
//链表尾添加数据
list_pushback(list, &c);
list_pushback(list, &a);
printf("-- 链表长度:%d --\n", list->length);
printf("-- 测试表头出队 --\n");
while (list->length > 2)
printf("%c\n", *(char*)get_front(list));
printf("-- 测试表尾出队 --\n");
while (list->length)
printf("%c\n", *(char*)get_back(list));
//添加数据
list_pushfront(list, &a);
list_pushfront(list, &b);
list_pushfront(list, &c);
//创建正向迭代器
list_iter* iter = get_list_iter(list, LIST_START_HEAD);
printf("-- 测试迭代器 --\n");
printf("%c\n", *(char*)get_next(iter));
printf("%c\n", *(char*)get_next(iter));
//释放迭代器
list_iter_release(iter);
//清除链表节点
list_empty(list);
printf("---------- 测试空表是否报错 ----------\n");
printf("%p\n", get_front(list));
printf("%p\n", get_back(list));
list_release(list);
return 0;
}