还是操作队列,但是这次换成链表,但是要注意出队的操作。
一般的思维是在出队的时候,删除头结点的下一个节点,这样的话确实可以将队列中的节点全部删除,但是如果我们将最后一个节点删除的时候,我们的算法就将tail指针赋值为NULL,这时如果再进行入队操作的时候,就会发生段错误。为什么呢?因为tail指针这是的值已经是NULL了,再将tail的后面接节点的话就会访问非法的内存空间。所以我们在出队操作的时候就直接删除头结点,然后将head指针指向下一个节点,这样下一个节点就成为头结点了,他自然就不是队列中的一员了。
下面是源代码:
/*************************************************************************
> File Name: linkqueue.c
> Author: Baniel Gao
> Mail: createchance@163.com
> Blog: blog.csdn.net/createchance
> Created Time: Fri 20 Dec 2013 01:53:21 PM CST
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef struct _nodequeue_ {
int data;
struct _nodequeue_ *next;
} nodequeue_st;
typedef struct _linkqueue_ {
int total;
int current;
nodequeue_st *head;
nodequeue_st *tail;
} linkqueue_st;
linkqueue_st *linkqueue_init(int size);
nodequeue_st *linkqueue_node_create(int value);
int linkqueue_enqueue(linkqueue_st *queue, int value);
int linkqueue_isfull(linkqueue_st *queue);
int linkqueue_dequeue(linkqueue_st *queue, int *value);
int linkqueue_isempty(linkqueue_st *queue);
int linkqueue_free(linkqueue_st *queue);
int main(void)
{
linkqueue_st *queue = NULL;
int value = 100;
int size = 10;
queue = linkqueue_init(size);
while (-1 != linkqueue_enqueue(queue, value))
value++;
while (-1 != linkqueue_dequeue(queue, &value))
printf("%5d", value);
putchar('\n');
linkqueue_free(queue);
return 0;
}
linkqueue_st *linkqueue_init(int size)
{
linkqueue_st *queue;
queue = (linkqueue_st *)malloc(sizeof(linkqueue_st));
queue->total = size;
queue->current = 0;
queue->head = linkqueue_node_create(0);
queue->tail = queue->head;
return queue;
}
nodequeue_st *linkqueue_node_create(int value)
{
nodequeue_st *node = NULL;
node = (nodequeue_st *)malloc(sizeof(nodequeue_st));
node->data = value;
node->next = NULL;
return node;
}
int linkqueue_enqueue(linkqueue_st *queue, int value)
{
nodequeue_st *node = NULL;
if (linkqueue_isfull(queue))
return -1;
node = linkqueue_node_create(value);
node->next = queue->tail->next;
queue->tail->next = node;
queue->tail = node;
queue->current++;
return 0;
}
int linkqueue_dequeue(linkqueue_st *queue, int *value)
{
nodequeue_st *tmp = NULL;
if (linkqueue_isempty(queue))
return -1;
tmp = queue->head;
*value = tmp->next->data;
queue->head = queue->head->next;
free(tmp);
queue->current--;
return 0;
}
int linkqueue_isfull(linkqueue_st *queue)
{
if (queue->current == queue->total)
return 1;
return 0;
}
int linkqueue_isempty(linkqueue_st *queue)
{
if (queue->current == 0)
return 1;
return 0;
}
int linkqueue_free(linkqueue_st *queue)
{
nodequeue_st *node = queue->head;
nodequeue_st *tmp = NULL;
while (node != NULL) {
tmp = node;
node = node->next;
free(tmp);
}
free(queue);
return 0;
}