您的位置:首页 > 编程语言 > C语言/C++

C语言链表实现队列操作

2013-12-20 17:19 549 查看
还是操作队列,但是这次换成链表,但是要注意出队的操作。

一般的思维是在出队的时候,删除头结点的下一个节点,这样的话确实可以将队列中的节点全部删除,但是如果我们将最后一个节点删除的时候,我们的算法就将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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: