练队列的实现

queue.h 文件

#pragma once

typedef struct QNode {

int data;
struct QNode *next;

}QNode,*QueuePtr;


typedef struct {
QueuePtr front;
QueuePtr rear;

}LinkQueue;

typedef int Status;

//初始化队列
Status InitQueue(LinkQueue *Q);

//销毁队列
Status DestroyQueue(LinkQueue *Q);

//清空队列
Status ClearQueue(LinkQueue *Q);

//判断队列是否为空
Status QueueEmpty(LinkQueue Q);

//获取队头元素
Status GetHead(LinkQueue Q);

//插入队尾元素
Status EnQueue(LinkQueue *Q,int e);

//删除队头元素
Status DeQueue(LinkQueue *Q,int *e);

//获取队列中的所有的元素

Status QueueTraverse(LinkQueue Q);

-------------------------------------------------------------------------------------------------- 

Queue.c 文件内容

#include "stdio.h"
#include "stdlib.h"
#include "queue.h"
#define ERROR 0
#define OK 1

void main() {

LinkQueue Q;

//初始化队列
InitQueue(&Q);

//向队列中插入元素
EnQueue(&Q,1);
EnQueue(&Q,2);
EnQueue(&Q,3);

QueueTraverse(Q);

int e;

DeQueue(&Q,&e);
DeQueue(&Q, &e);

QueueTraverse(Q);

GetHead(Q,&e);

printf("%d ",e);


}

//队列元素的删除在队头

//初始化一个队列
Status InitQueue(LinkQueue *Q) {

//队列中的每个元素看作一个节点
//Q->front 看作
Q->front = Q->rear = (QNode *)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, int e) {

QNode *node = (QNode *)malloc(sizeof(QNode));

if (!node) return ERROR;

node->data = e;
node->next = NULL;

//队列头节点不会存放元素值
Q->rear->next = node;
Q->rear = node;

return OK;

}

//删除队列元素
Status DeQueue(LinkQueue *Q, int *e) {

if (Q->front==Q->rear)return ERROR;

QNode *p;

p = Q->front->next;
*e = p->data;
Q->front->next = p->next;
if (p == Q->rear) {
Q->rear = Q->front;
}
free(p);

return OK;

}

//访问结点中的元素
Status QueueTraverse(LinkQueue Q) {

printf("输出队列中的元素值 ");

if (Q.front == Q.rear) return ERROR;//判断队列是否为空队列

Q.front = Q.front->next;

while (Q.front!=NULL)
{
printf("%d ", Q.front->data);

Q.front = Q.front->next;

}

}


//获取队头元素
Status GetHead(LinkQueue Q,int *e) {

if (Q.front == Q.rear) return ERROR;

Q.front = Q.front->next;

*e=Q.front->data;

return OK;


}

原文地址:https://www.cnblogs.com/paulversion/p/7662008.html