学习笔记------数据结构(C语言版) 队列的顺序存储/循环队列

//SqQueue.cpp

#include"predefined.h"
#include"SqQueue.h"
Status InitQueue (SqQueue *Q)
//构造一个空队列Q
{
	(*Q).base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
	if(!(*Q).base)
		exit(OVERFLOW);
	(*Q).front=(*Q).rear=0;
	return OK;
}

Status DestroyQueue (SqQueue *Q)
//销毁队列Q
{
	free((*Q).base);
	(*Q).base=NULL;
	(*Q).front=(*Q).rear=0;
	return OK;
}

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

Status QueueEmpty(SqQueue Q)
//若Q为空队列,返回TRUE;否则返回FALSE
{
	if(Q.front==Q.rear)
		return TRUE;
	else
		return FALSE;
}

int QueueLength(SqQueue Q)
//返回Q的元素个数,即队列的长度
{
	return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}

Status GetHead(SqQueue Q,QElemType *e)
//用e返回Q的队头元素
{
	if(QueueEmpty(Q))
		return ERROR;
	*e=Q.base[Q.front];
	return OK;
}

Status EnQueue(SqQueue *Q,QElemType e)
//插入元素e为Q的新的队列元素
{
	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)
//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;
//否则返回ERROR
{
	if((*Q).rear==(*Q).front)
		return ERROR;
	*e=(*Q).base[(*Q).front];
	(*Q).front=((*Q).front+1)%MAXQSIZE;
	return OK;
}

void QueueTraverse(SqQueue Q,void (*visit)(QElemType e))
//从队头到队尾依次对每个元素调用visit
{
	int i;
	QElemType e;
	i=Q.front;
	while(i!=Q.rear)
	{
		e=Q.base[i];
		visit(e);
		i=(i+1)%MAXQSIZE;
	}
}

void PrintElem(QElemType e)    
{    
    printf("%d ",e);  
}

//main.cpp

#include"predefined.h"
#include"SqQueue.h"
int main()
{
	SqQueue Q;
    Status s;  
    int i;  
    QElemType e;  
    printf("Function 1\n★函数Status InitQueue (SqQueue *Q)测试...\n");  
    s=InitQueue(&Q);   
    printf("▲初始化循环队列Q: %d (0:失败 1:成功)\n\n",s);  
    printf("Function 2\n★函数Status QueueEmpty(SqQueue Q)测试...\n");  
    QueueEmpty(Q)?printf("▲循环队列Q为空!!!\n\n"):printf("▲循环队列Q非空!!!\n\n");  
    printf("Function 3\n★函数Status EnQueue(SqQueue *Q,QElemType e)测试...\n");  
    for(i=1;i<6;i++)  
    {  
        printf("▲元素\"%2d\"入队\n",2*i);  
        EnQueue(&Q,2*i);  
        printf("▲累计第%d元素\n",QueueLength(Q));  
    }  
    printf("\n");  
    printf("Function 4\n★函数void QueueTraverse(SqQueue Q,void (*visit)(QElemType e))测试...\n");  
    printf("▲队列Q中的元素为:Q={");  
    QueueTraverse(Q,PrintElem);  
    printf("}\n\n");  
    printf("Function 5\n★函数Status DeQueue(SqQueue *Q,QElemType *e)测试...\n");  
    DeQueue(&Q,&e);  
    printf("▲队列Q队头元素\"%2d\"出队\n",e);  
    printf("▲队列Q中的元素为:Q={");  
    QueueTraverse(Q,PrintElem);  
    printf("}\n\n");  
    printf("Function 6\n★函数int QueueLength(SqQueue Q)测试...\n");  
    i=QueueLength(Q);  
    printf("▲队列Q的长度为%d\n\n",i);  
    printf("Function 7\n★函数Status GetHead(SqQueue Q,QElemType *e)测试...\n");  
    GetHead(Q,&e);
    printf("▲队列Q队头元素\"%2d\"\n\n",e);  
    printf("Function 8\n★函数Status ClearQueue (SqQueue *Q)测试...\n");  
    printf("▲置空前:");  
    QueueEmpty(Q)?printf("▲循环队列Q为空!!!\n"):printf("▲循环队列Q非空!!!\n");  
    ClearQueue(&Q);
    printf("▲置空后:");
    QueueEmpty(Q)?printf("▲循环队列Q为空!!!\n\n"):printf("▲循环队列Q非空!!!\n\n"); 
    printf("Function 9\n★函数Status DestroyQueue (SqQueue *Q)测试...\n");  
    printf("▲销毁前:");  
	Q.base?printf("▲循环队列Q存在!!!\n"):printf("▲循环队列Q不存在!!!\n");  
    DestroyQueue(&Q);  
    printf("▲销毁后:");  
	Q.base?printf("▲循环队列Q存在!!!\n\n"):printf("▲循环队列Q不存在!!!\n\n");  
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值