#include <stdio.h>
#include "malloc.h"
#define MAXQSIZE 10
#define QueueSize 100
typedef int QElemType;
typedef struct {
QElemType *base;//队元素数组
int front;
int rear;
}SqQueue;
typedef int Datatype ; //设元素的类型为int型
typedef struct {
int quelen;
int rear;
Datatype *data;
}CirQueue;
int InitQueue(SqQueue *Q)
{
printf("初始化队列中。。。\n");
Q->base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(Q->base)
{
printf("初始化成功!\n");
Q->front=Q->rear=0;
return 1;
}
else
{ printf("初始化失败!");
return 0;
}
}
int InitQueue1(CirQueue *Q)
{
printf("初始化队列中。。。\n");
Q->data=(Datatype *)malloc(QueueSize*sizeof(Datatype));
if(Q->data)
{
printf("初始化成功!\n");
Q->quelen=Q->rear=0;
return 1;
}
else
{ printf("初始化失败!");
return 0;
}
}
void MenuList() {
printf("\n\n**************************\n");
printf(" 1 ------- 初始化队列\n");
printf(" 2 ------- 生成队列\n");
printf(" 3 ------- 入队列\n");
printf(" 4 ------- 出队列 \n");
printf(" 5 ------- 打印队头元素 \n");
printf(" 6 ------- 退出 \n");
printf(" 7 ------- 求队列中的元素个数 \n");
printf(" 8 ------- 不设头指针的入队 \n");
printf(" 9 ------- 不设头指针的出队 \n");
printf(" 10 ------- 非递归求最大公因数 \n");
printf(" 11 ------- 递归求最大公因数 \n");
printf("**************************\n");
}
void InitQ(SqQueue *Q)
{ int i,k,m;
printf("请输入队列中的元素个数(不大于10个):");
scanf("%d",&k);
for (i=0;i<k;i++)
{
printf("请输入队列中的第%d个元素:",i+1);
scanf("%d",&m);
Q->base[Q->rear]=m;
printf("入队的元素为:%d\n",Q->base[Q->rear]);
Q->rear=(Q->rear+1)%MAXQSIZE;
//printf("%d",Q->rear);
//printf("%d",Q->front);
}
}
void DeQueue(SqQueue *Q)//出队
{ int e;
if(Q->front==Q->rear)
printf("队列为空,不能出队!");
else
{
e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;//队头指针始终指向出队元素的下一位置
printf("出队元素为:%d\n",e);
}
}
int EnQueue(SqQueue *Q){//入队
int e;
printf("请输入入队元素的值:");
scanf("%d",&e);
if((Q->rear+1)%MAXQSIZE == Q->front){//预留一位法
printf("队列已满!");
return 0;
}
Q->base[Q->rear]=e; //插入x值到队尾
Q->rear=(Q->rear+1)%MAXQSIZE; //队尾指针循环后移,队尾指针始终指向最后一个元素的下一位置
return 1 ;
}
int QueueLength(SqQueue *Q)
{
return (Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
}
int QueueVisit(SqQueue *Q)
{
int e;
if ( Q->rear== Q->front ) return 0 ; //队空
e=Q->base[Q->front] ; //e值带回出队元素的值
Q->front=(Q->front+1)%MAXQSIZE; //队头指针循环后移
return e ;
}
int FullQueue( CirQueue *Q)
{//判队满,队中元素个数等于空间大小
return Q->quelen== QueueSize;
}
void EnQueue1( CirQueue *Q, Datatype x)
{// 入队
if(FullQueue(Q))
printf("队已满,无法入队");
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%QueueSize;//在循环意义上的加1
Q->quelen++;
}
Datatype DeQueue1( CirQueue *Q)
{//出队
if(Q->quelen==0)
printf("队已空,无元素可出队");
int tmpfront; //设一个临时队头指针
tmpfront=(QueueSize+Q->rear - Q->quelen)%QueueSize;//计算头指针位置
Q->quelen--;
return Q->data[tmpfront];
}
int fun1(int m, int n)//非递归
{
int temp;
while (1)
{
if (m < n)
{
temp = m;
m = n;
n = temp;
}
if (n == 0)
{
return m;
}
else
{
int r = m % n;
m = n;
n = r;
}
}
}
int fun2(int m, int n)//递归
{
if (n == 0)
{
return m;
}
if (m < n)
{
return fun2(n, m);//m,n交换位置
}
return fun2(n, m % n);
}
void main() {
int s, m = 0, f,a,b;
SqQueue q;
CirQueue Q;
InitQueue1(&Q);
while (m != 100) {
MenuList();
printf("请输入选择:");
scanf("%d", &m);
if (m == 1)
s = InitQueue(&q);
if (m == 2) {
if (s == 0) { printf(" 初始化队列失败,不能生成队列!\n"); }
else
InitQ(&q);
}
if (m == 3) EnQueue(&q);
if(m==4)
DeQueue(&q);
if (m == 5) {
f = QueueVisit(&q);
printf("队头元素为:%d", f);
}
if (m == 8) {
printf("请输入入队的值:");
scanf("%d", &f);
EnQueue1(&Q, f);
}
if (m == 7) {
f=QueueLength(&q);
printf("队列中元素的个数为:%d",f);
}
if (m == 9) {
f = DeQueue1(&Q);
printf("出队的元素为:%d", f);
}
if(m==10){
printf("请输入两个数:");
scanf("%d,%d",&a,&b);
f=fun1(a,b);
printf("%d和%d的最大公因数为:%d",a,b,f);
}
if(m==11){
printf("请输入两个数:");
scanf("%d,%d",&a,&b);
f=fun2(a,b);
printf("%d和%d的最大公因数为:%d",a,b,f);
}
}
}
代码-队列
于 2022-08-15 19:02:29 首次发布