链表在memcached、redis中做为核心数据结构出现。相比数组,链表能动态增减容量,就比数组要灵活,而且hash表结构通常都使用链表进行数据存储git
完整案例代码已上传github: github.com/neatlife-le…github
对应代码以下redis
typedef struct _element {
struct _element *previous;
struct _element *next;
void *value;
} element;
复制代码
一个队列中包含多个元素,为了可以方便的获得这个队列头和尾,以及队列里的元素个数,使用这个queue结构来存放这些信息数组
对应代码以下数据结构
typedef struct _queue {
element *head;
element *end;
size_t size;
} queue;
复制代码
queue* new_queue(void *value) {
element *item = (element *) malloc(sizeof(element));
item->value = value;
item->previous = NULL;
item->next = NULL;
queue *a_queue = (queue *) malloc(sizeof(queue));
a_queue->head = item;
a_queue->end = item;
a_queue->size = 1;
return a_queue;
}
复制代码
void push(queue *a_queue, void *value) {
element *item = (element *) malloc(sizeof(element));
item->value = value;
item->previous = a_queue->end;
item->next = NULL;
a_queue->end->next = item;
a_queue->end = item;
a_queue->size = a_queue->size + 1;
}
复制代码
队列的特性是先进先出,通常出的时候都是拿链表的最后一个元素,进的时候就把新元素加到链表尾memcached
element* pop(queue *a_queue) {
element *item = a_queue->end;
a_queue->end = a_queue->end->previous;
item->previous = NULL;
a_queue->end->next = NULL;
a_queue->size = a_queue->size - 1;
return item;
}
复制代码
void stats(queue *a_queue) {
cout << "current queue size: " << a_queue->size << endl;
cout << "current queue content: " << endl;
element *item = a_queue->head;
while (item) {
cout << (size_t) item->value << endl;
item = item->next;
}
}
复制代码
queue* a_queue = new_queue((size_t *) 1)
push(a_queue, (size_t *) 2);
stats(a_queue);
element *item = pop(a_queue);
stats(a_queue);
cout << (size_t)item->value << endl;
复制代码
效果以下: 测试
出队列时可对a_queue->size进行判断,若是size等于0了,表示队列中已经没有数据了,就不能再执行出队列操做了ui
当出队列出到a_queue->size等于0时,须要清空队列的end、previous指针spa
栈和队列除了出栈操做不同,其它部分彻底一致,队列出队列的时候从尾部出,栈出栈的时候从头部出,核心代码以下3d
element* pop(stack *a_stack) {
element *item = a_stack->head;
a_stack->head = a_stack->head->next;
item->next = NULL;
a_stack->head->previous = NULL;
a_stack->size = a_stack->size - 1;
return item;
}
复制代码
cpp指针初始化须要明确设置为NULL