实验3.2 循环顺序队列的基本操作

头文件

#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 100

定义结构体

typedef int Elemtype;
typedef struct 
{
	int rear, front;
	char date[MAXNUM];
}sqqueue;

初始化队列

void chushihua(sqqueue* q)
{
	q->rear = q->front = 0;
}

入队

void rudui(sqqueue* q, Elemtype x)
{
	if ((q->rear + 1) % MAXNUM == q->front)
		printf("\n队列满!");
	else
	{
		q->date[q->rear] = x;
		q->rear = (q->rear + 1) % MAXNUM;
	}
}

出队

void chudui(sqqueue* q)
{
	Elemtype x;
	if (q->rear == q->front)
		printf("\n队列空!\n");
	else
	{
		x = q->date[q->front];
		q->front = (q->front + 1) % MAXNUM;
		printf("\n出队的元素的值为:%d\n", x);
	}
}

输出队列元素

void print(sqqueue* q)
{
	if (q->rear == q->front)
		printf("\n队列空!");
	else
	{
		printf("\n队列中的元素为:\n");
		for (int i = q->front ;i <= q->rear-1;i++)
			printf("%d\t", q->date[i]);
	}
}

我之前写的是

printf("\n队列中的元素为:\n");
	    while (q->front != q->rear)
		{
			q->rear = (q->rear- 1) % MAXNUM;
			printf("\t\t%d", q->date[q->rear]);
		}

第一个,q->date[q->rear] = x;q->rear = (q->rear + 1) % MAXNUM;,也就是你先让q->data[0]=x,然后尾指针再往后移,此时q->rear=1了接着,后面print队列的时候,你是先让尾指针往前移了,此时尾指针又变成0了,然后你就输出了,输出是没错,但是尾指针是0了,你下次再进队的时候,就是q->data[0]=x了,相当于把原来的1覆盖了。你之后每一次的进队都是覆盖第一个date,队列一直就只有一个元素了

求队列的长度

void changdu(sqqueue* q)
{
	int x;
	x = (q->rear - q->front + MAXNUM) % MAXNUM;
	printf("\n队列的长度为:%d\n", x);
}

置空队列

void zhikong(sqqueue* q)
{
	q->rear = q->front = 0;
}

求队首元素

void top(sqqueue* q)
{
	int i,x;
	i = q->rear;
	x = q->date[i-1];
	printf("\n队尾元素为:%d\n", x);
	x = q->date[q->front];
	printf("\n队首元素为:%d\n", x);
}

主函数

int main()
{
	sqqueue* q;
	q = (sqqueue*)malloc(sizeof(sqqueue));
	Elemtype select, e;
	chushihua(q);
	select = 0;
	do
	{
		printf("\n\n\t\t循环顺序队列的基本操作\n\n");
		printf("\t\t请选择需要进行的操作\n\n");
		printf("\t\t1.入队\n\n");
		printf("\t\t2.出队\n\n");
		printf("\t\t3.置空\n\n");
		printf("\t\t4.队列的长度\n\n");
		printf("\t\t5.队列两端元素值\n\n");
		printf("\t\t6.退出操作\n\n");
		scanf_s("%d", &select);
		switch (select)
		{
		case 1:
			printf("\n请输入需入队的元素的值。\n");
			scanf_s("%d", &e);
			rudui(q, e);
			print(q);
			break;
		case 2:
			chudui(q);
			print(q);
			break;
		case 3:
			zhikong(q);
			print(q);
			break;
		case 4:
			changdu(q);
			break;
		case 5:
			top(q);
			break;
		case 6:break;
		}
	} while (select < 6);
}

运行结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值