队列的实现
2016-04-02 10:23
344 查看
队列(Queue)是一种先进先出的结构,它只允许在表的一端插入元素,而在另一端删除元素。队列在操作系统的并发中尤为重要,比如阻塞队列,优先队列等。队列也可以通过线性和链表两种方式实现。这里主要讲如何通过链表来实现队列和基本的队列操作。看看原理图吧:
需要注意的是,既然用链表实现队列,那么链表中必定有头结点,因此队头元素应是头结点指向的下一结点。
以下是队列的实现方法:
需要注意的是,既然用链表实现队列,那么链表中必定有头结点,因此队头元素应是头结点指向的下一结点。
以下是队列的实现方法:
#include <stdio.h> #include <malloc.h> typedef int ElemType; typedef int Status; #define OK 1 #define ERROR 0 typedef struct QNode{ ElemType data; struct QNode *next; } QNode, *QueuePtr; typedef struct { QueuePtr front; //队头指针 QueuePtr rear; //队尾指针 } LinkQueue; /* *初始化队列 */ Status initQueue(LinkQueue &q) { q.front = q.rear = (QueuePtr) malloc(sizeof(QNode)); //初始化队头队尾指针,指向同一地址 if (!q.front) return ERROR; q.front->next = NULL; return OK; } /* *销毁队列 */ Status destroyQueue(LinkQueue &q) { while (q.front) { //遍历队列并释放结点空间 q.rear = q.front->next; free(q.front); q.front = q.rear; } return OK; } /* *入队 */ Status enQueue(LinkQueue &q, ElemType e) { QueuePtr p; p = (QueuePtr) malloc(sizeof(QNode)); p->data = e; //在队尾添加元素 p->next = NULL; q.rear->next = p; q.rear = p; //队尾指针指向最新的队尾 return OK; } /* *出队 */ Status deQueue(LinkQueue &q, ElemType &e) { if (q.front == q.rear) return ERROR; //队列为空,不能删除元素 QueuePtr p; p = q.front->next; //找到队头元素,并出列 e = p->data; q.front->next = p->next; if (q.rear == p) q.rear = q.front; //如果只有一个元素,删除后队头队尾都指向头结点 free(p); //释放空间 return OK; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- [C/C++]反转链表
- 如何写好 C main 函数
- C#数据结构之顺序表(SeqList)实例详解
- C#实现基于链表的内存记事本实例
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- C#线程队列用法实例分析
- 算法系列15天速成 第九天 队列
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法