数据结构——队列及循环队列
2014-12-02 22:49
337 查看
说明:严蔚敏的《数据结构》(C语言版)学习笔记,记录一下,以备后面查看。
#include <stdio.h>
#include <stdlib.h>
#define OK 1;
#define ERROR -1;
typedef int QElemType;
typedef int Status;
//定义队列节点
typedef struct QNode{
QElemType 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, QElemType e){
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p) return ERROR;
p->data = e;
p->next = NULL;
q->rear->next = p; //队列末尾指向p
q->rear = p; //p记为尾指针
return OK;
}
//出队列
Status DeQueue(LinkQueue *q, QElemType *e){
if(q->front == q->rear) return ERROR;
QueuePtr p = q->front->next; //指向队列头部第一个元素
*e = p->data;
q->front->next = p->next;
if(q->rear == p) q->rear = q->front;
free(p);
return OK;
}
初始化的时候,让front和rear都等于0,此时队列元素个数是0,当入队4个元素后如下图
此时对队列元素的个数是 rear - front = 4, 假如队列变为下面的样子,rear < front
队列中空一格的原因是为了区别队列是“空”还是“满”,当队列尾指针的下一个位置是头指针则说明队列满了。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define MAXQSIZE 100 //最大队列长度
typedef int QElemType;
typedef int Status;
//循环队列
typedef struct{
QElemType *base;
int front;
int rear;
}SqQueue;
//初始化循环队列
Status InitQueue(SqQueue *q){
q->base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
if (!q) return ERROR;
q->front = q->rear = 0;
return OK;
}
//获取队列长度
int QueueLength(SqQueue *q){
return (q->rear - q->front + MAXQSIZE) % MAXQSIZE;
}
//入队
Status EnQueue(SqQueue *q, QElemType e){
if ((q->rear + 1) % MAXQSIZE == q->front) {
return ERROR;
}
q->base[q->rear] = e;
q->rear = (q->rear + 1) % MAXQSIZE;
return OK;
}
//出队
Status DeQueue(SqQueue *q, QElemType *e){
if(q->front == q->rear) return ERROR;
*e = q->base[q->front];
q->front = (q->front + 1) % MAXQSIZE;
return OK;
}
#include <stdio.h>
#include <stdlib.h>
#define OK 1;
#define ERROR -1;
typedef int QElemType;
typedef int Status;
//定义队列节点
typedef struct QNode{
QElemType 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, QElemType e){
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p) return ERROR;
p->data = e;
p->next = NULL;
q->rear->next = p; //队列末尾指向p
q->rear = p; //p记为尾指针
return OK;
}
//出队列
Status DeQueue(LinkQueue *q, QElemType *e){
if(q->front == q->rear) return ERROR;
QueuePtr p = q->front->next; //指向队列头部第一个元素
*e = p->data;
q->front->next = p->next;
if(q->rear == p) q->rear = q->front;
free(p);
return OK;
}
初始化的时候,让front和rear都等于0,此时队列元素个数是0,当入队4个元素后如下图
此时对队列元素的个数是 rear - front = 4, 假如队列变为下面的样子,rear < front
队列中空一格的原因是为了区别队列是“空”还是“满”,当队列尾指针的下一个位置是头指针则说明队列满了。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define MAXQSIZE 100 //最大队列长度
typedef int QElemType;
typedef int Status;
//循环队列
typedef struct{
QElemType *base;
int front;
int rear;
}SqQueue;
//初始化循环队列
Status InitQueue(SqQueue *q){
q->base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
if (!q) return ERROR;
q->front = q->rear = 0;
return OK;
}
//获取队列长度
int QueueLength(SqQueue *q){
return (q->rear - q->front + MAXQSIZE) % MAXQSIZE;
}
//入队
Status EnQueue(SqQueue *q, QElemType e){
if ((q->rear + 1) % MAXQSIZE == q->front) {
return ERROR;
}
q->base[q->rear] = e;
q->rear = (q->rear + 1) % MAXQSIZE;
return OK;
}
//出队
Status DeQueue(SqQueue *q, QElemType *e){
if(q->front == q->rear) return ERROR;
*e = q->base[q->front];
q->front = (q->front + 1) % MAXQSIZE;
return OK;
}
相关文章推荐
- 五、数据结构基础之循环队列C语言实现
- 数据结构之循环队列
- 看数据结构写代码(16)顺序队列的实现(循环队列)
- 数据结构基础(7) --循环队列的设计与实现
- 【数据结构与算法基础】以数组实现的循环队列 / Circular Queue implemented by array
- 数据结构——循环队列操作
- 数据结构基础(7) --循环队列的设计与实现
- 数据结构之---C语言实现循环队列
- 数据结构基础(7) --循环队列的设计与实现
- 数据结构之循环队列
- 【数据结构】——顺序循环队列的相关操作
- 数据结构之队列11循环队列定义及实现
- 数据结构之循环队列操作
- 再回首,数据结构——循环队列上的常见操作
- 数据结构(三)——队列及实现、循环队列实现
- 数据结构之循环队列
- 数据结构(C实现)------- 顺序队列(循环队列之少用一个存储空间实现) .
- 数据结构之循环队列
- 数据结构与算法之循环队列
- 数据结构之静态循环队列(所有操作)