# 数据结构系列－队列的基本操作

#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 11 //初始容量

typedef int Status;
typedef int QElemType;//定义数据类型

//循环队列的顺序存储结构
typedef struct{
QElemType data[MAXSIZE];
int front; //头指针
int rear;//尾指针，队列非空时，指向队尾元素的下一个位置
}SqQueue;

Status visit(QElemType item){
printf("%d",item);
return OK;
}

//初始化空队列
Status InitQueue(SqQueue *sQ){
sQ->front =0;
sQ->rear =0;
return OK;
}

//将队列清空
Status ClearQueue(SqQueue *Q){
Q->front = Q->rear =0;
return OK;
}

//判断队列是否为null
Status QueueEmpty(SqQueue Q){
if(Q.front == Q.rear)
return TRUE;
else
return FALSE;
}

//返回队列中的元素个数
int QueueLength(SqQueue Q){
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}

//返回队头元素
if(Q.front == Q.rear)//是否为空队列
return ERROR;
*e = Q.data[Q.front];
return OK;
}

//在队尾插入元素
Status EnQueue(SqQueue *Q, QElemType e){
if((Q->rear+1)%MAXSIZE == Q->front)//队列已满
return ERROR;

Q->data[Q->rear] =e;//插入队尾
Q->rear = (Q->rear +1)%MAXSIZE;//尾部指针后移，如果到最后则转到头部
return OK;
}

//元素出队
Status DeQueue(SqQueue *Q, QElemType *e){
if(Q->front == Q->rear)//队列空
return ERROR;
*e = Q->data[Q->front];//返回队头元素
Q->front = (Q->front+1)%MAXSIZE;//队头指针后移，如到最后转到头部
return OK;
}

//遍历队列元素
Status QueueTraverse(SqQueue Q){
int i = Q.front;
while((i+Q.front) != Q.rear){
visit(Q.data[i]);
i=(i+1)%MAXSIZE;
}
printf("\n");
return OK;
}

int main(){

Status j;
int i=0,l;
QElemType d;
SqQueue Q;
InitQueue(&Q);

//入队１０个元素
for(int i =0;i< MAXSIZE-1; i++){
EnQueue(&Q,i);
}
QueueTraverse(Q);

printf("依次出队:");
for(l=1;l<=MAXSIZE;l++)
{
DeQueue(&Q,&d);
printf("d= %d,",d);
}

return 0;
}

#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20

typedef int Status;
typedef int QElemType;

//结点结构
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;

//队列的链表结构
typedef struct{
QueuePtr front;//队头
QueuePtr rear;//对尾

Status visit(QElemType e)
{
printf("%d ",e);
return OK;
}

//初始化空的队列
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q->front)
exit(OVERFLOW);
Q->front->next =NULL;
return OK;
}

//销毁队列
while(Q->front){
Q->rear=Q->front->next;//从队头开始销毁
free(Q->front);
Q->front = Q->rear;
}
return OK;
}

//清空队列，队头指针还在
QueuePtr p,q;
Q->rear =Q->front;//跟初始状态相同，Q->rear指向头结点
p=Q->front->next;//开始销毁队头元素，队头，对尾依然保留
Q->front->next =NULL;
while(p){
q=p;
p=p->next;
free(q);
}
return OK;
}

//队列是否空
if(Q.front == Q.rear)
return TRUE;
else
return FALSE;
}

//取队列长度
int i=0;
QueuePtr p = Q.front;
while(Q.rear != p){
i++;
p = p->next;
}
return i;
}

//获取队头元素
QueuePtr p;
if(Q.front == Q.rear)//队空
return ERROR;
p=Q.front->next;
*e = p->data;
return OK;
}

//对尾插入元素
QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
if(!s)
exit(OVERFLOW);
s->data = e;
s->next =NULL;
Q->rear->next =s;//原来对尾的next指向新的元素
Q->rear =s;//将新元素变为对尾
return OK;
}

//队头元素出队
QueuePtr p;
if(Q->front == Q->rear)
return ERROR;
p=Q->front->next;//ｐ指向队头元素
*e = p->data;
Q->front->next = p->next;//头结点的后继指向队头的下一个元素
if(Q->rear == p){//队头等于对尾了
Q->rear = Q->front;//对尾指向头结点
}
free(p);
return OK;
}

//遍历元素
QueuePtr p;
p=Q.front->next;
while(p){
visit(p->data);
p=p->next;
}
printf("\n");
return OK;
}

int main(){
int i;
QElemType d;
i=InitQueue(&q);

//入队１０个元素
for(int index=0;index<MAXSIZE;index++){
EnQueue(&q,index);
}
QueueTraverse(q);

DestroyQueue(&q);
printf("队列已经销毁,q.front=%p q.rear=%p\n",q.front, q.rear);

return 0;
}

©️2019 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客