链表/结点/迭代器结构体
// 结点
typedef struct listNode
{
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;
// 链表迭代器
typedef struct listIter
{
listNode *next; // 下一个结点
int direction; // 迭代方向
} listIter;
// 链表
typedef struct list
{
listNode *head; // 表头结点
listNode *tail; // 表尾结点
void *(*dup)(void *ptr); // 结点值复制函数
void (*free)(void *ptr); // 结点值释放函数
int (*match)(void *ptr, void *key); // 结点值对比函数
unsigned int len; // 链表所包含的结点数量
} list;
链表迭代器
// 返回链表迭代器,既可以从链表头开始迭代,也可以从链表尾开始迭代
listIter *listGetIterator(list *list, int direction)
{
listIter *iter;
if ((iter = zmalloc(sizeof(*iter))) == NULL)
{
return NULL;
}
// 从链表头开始
if (direction == AL_START_HEAD)
{
iter->next = list->head;
}
// 从链表尾开始
else
{
iter->next = list->tail;
}
iter->direction = direction;
return iter;
}
// 释放链表迭代器
void listReleaseIterator(listIter *iter)
{
zfree(iter);
}
通过迭代器获取链表中下一个结点
// 从链表迭代器中返回下一个结点
listNode *listNext(listIter *iter)
{
listNode *current = iter->next;
if (current != NULL)
{
if (iter->direction == AL_START_HEAD)
{
iter->next = current->next;
}
else
{
iter->next = current->prev;
}
}
return current;
}
迭代整个链表
listIter *iter;
listNode *node;
iter = listGetIterator(orig, AL_START_HEAD);
while((node = listNext(iter)) != NULL)
{
// TODO
}
网友评论