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;
}
一般的思维是在出队的时候,删除头结点的下一个节点,这样的话确实可以将队列中的节点全部删除,但是如果我们将最后一个节点删除的时候,我们的算法就将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;
}
相关文章推荐
- Linux下的C语言编程——链表实现队列操作
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- c语言实现--不带头结点的单链表操作
- c语言实现多线程下的链表队列
- C语言实现单链表的基本操作及其部分面试题
- 链表,顺序表的基本操作及其实现的栈与队列
- C语言实现单链表——之基本操作1
- 双向链表的C语言实现与基本操作(二)
- C语言实现无头链表的基本操作
- 对链表各种操作的实现(C语言)
- C语言实现,无头结点不带环的单向链表的基本操作
- 双向链表的实现与操作(C语言实现)
- 队列 queue 的链表实现操作 -C++
- 链式队列的基础操作实现(C语言)
- 在链表中获取一个数据、查找操作C语言实现
- 用链表实现队列的操作
- 链表实现队列C语言写法
- c语言实现双向链表的基本操作
- 顺序队列(循环队列)基本操作实现 C语言
- c语言实现单链表的基础操作