数据结构 循环队列的顺序存储与链式存储

循环队列的顺序存储

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10

typedef int QElemType;

typedef struct{     //对循环队列的结点的结构体进行定义
    QElemType data[MaxSize];
    int front;      //头指针指向队首元素
    int rear;       //尾指针指向队尾元素的下一个位置
}SqQueue;

int InitQueue(SqQueue *Q){//初始化队列
    Q->front=0;
    Q->rear=0;
    return 1;
}

int Length(SqQueue *Q){//求队列长度
    int len=(Q->rear-Q->front+MaxSize)%MaxSize;
    return len;
}

int EnQueue(SqQueue *Q,QElemType e){//入队列
    if(Length(Q)+1==MaxSize){
        printf("队列已满,数值%d无法进入\n",e);
        return 0;
    }
    Q->data[Q->rear]=e;
    Q->rear=(Q->rear+1)%MaxSize;
    return 1;
}

int DeQueue(SqQueue *Q,QElemType *e){//出队列
    if(Q->rear==Q->front){
        printf("队列已空,无法出队列\n");
        return 0;
    }
    *e=Q->data[Q->front];
    Q->front=(Q->front+1)%MaxSize;
    return 1;
}

void Print(SqQueue *Q){
    int i=0;
    printf("\n");
    if(Q->front>Q->rear){
        while(Q->front+i==MaxSize){
            printf("%d  ",Q->data[Q->front+i]);
            i++;
        }
        i=0;
        while(i!=Q->rear){
            printf("%d  ",Q->data[i]);
            i++;
        }
    }
    else{
        i=Q->front;
        while(i!=Q->rear){
            printf("%d  ",Q->data[i]);
            i++;
        }
    }
    printf("\n");
}

int main(){
    
    
    SqQueue Q;
    InitQueue(&Q);
    do{
		printf("   请选择要进行的操作:          \n");
		printf("   1 创建一个循环队列   2 入队   3 出队    4 打印   0 退出       \n");
		int select;
		scanf("%d", &select);
		if(select == 0)
			break;
		switch(select){
		case 0:
			break;
		case 1:
			printf("要创建的循环队列长度为:");
			int n;//要创建的循环队列长度
    		scanf("%d",&n);
    		printf("请依次输入元素:");
    		int an; 
    		for(int i=0;i<n;i++){//入队列
    	
    			scanf("%d",&an);
        		EnQueue(&Q,an);
    		}
    		printf("队列长度为:%d \n",Length(&Q));
			break;
		case 2:
			printf("请输入要入队的一个元素:");
			scanf("%d",&an);
			EnQueue(&Q,an);
			break;
		case 3:
			int num;
			int e;
			printf("输入要删除的元素个数(从队首进行删除)\n");
    		scanf("%d",&num);
    		for(int i=0;i<num;i++){
        	if(!DeQueue(&Q,&e))
            	break;
        	printf("删除了一个元素%d,此时队列为:",e);
        	Print(&Q);
        	printf("\n");
    		}
    		break;
    	case 4:
    		Print(&Q);
    		break;
		default:
			printf("你进行了误操作,请重新选择\n:");
			break;
		}
	}
	while(1);
	return 0;
}

循环队列的链式存储

#include<iostream>
#include<stdLib.h>
using namespace std;

//定义链队列 
typedef struct Haha{
	int data;
	struct Haha *next;	
}Haha, *que;

typedef struct{
	que front;
	que rear;
}link;

//对链队列初始化
void Init(link *q){
	q->front = q->rear = (que)malloc(sizeof(Haha));
	if(!(q->front)) 
		exit(1);
	q->front->next = 0;
} 

//插入新元素
void En(link *q, int e){
	que p;
	p = (que)malloc(sizeof(Haha));
	if(!p)    exit(1);
	p->data = e;
	p->next = 0;
	q->rear->next = p;
	q->rear = p;
}

//删除队头元素
int de(link *q){
	Haha *p;
	int e;
	if(q->front==q->rear)  return -1;
	p = q->front->next;
	e=p->data;
	q->front->next = p->next;
	if(q->rear == p)
		q->rear = q->front;
	free(p);
	cout << e << endl; 
	return 0;
}

//输出队列元素
void out(link *q){
	Haha *r=q->front->next;
	while(r){
		cout << r->data<<' ';
		r = r->next;
	} 
	cout << endl;
} 

//求队列长度
int len(link *q){
	Haha *r=q->front->next;
	int s = 0;
	while(r){
		r=r->next;
		s++;
	} 
	return s;
} 

int main(){
	link Q;
	Init(&Q);
	do{
		printf("   请选择要进行的操作:          \n");
		printf("   1 创建一个链队列   2 入队   3 出队    4 打印   0 退出       \n");
		int select;
		scanf("%d", &select);
		if(select == 0)
			break;
		switch(select){
		case 0:
			break;
		case 1:
			printf("要创建的循环队列长度为:");
			int n;//要创建的循环队列长度
    		scanf("%d",&n);
    		printf("请依次输入元素:");
    		int an; 
    		for(int i=0;i<n;i++){//入队列
    	
    			scanf("%d",&an);
        		En(&Q,an);
    		}
    		printf("队列长度为:%d \n",len(&Q));
			break;
		case 2:
			printf("请输入要入队的一个元素:");
			scanf("%d",&an);
			En(&Q,an);
			break;
		case 3:
			printf("队首删除了一个元素\n");

        	if(!de(&Q))
            	break;
        	printf("删除了一个元素,此时队列为:");
        	out(&Q);
        	printf("\n");
    
    		break;
    	case 4:
    		out(&Q);
    		break;
		default:
			printf("你进行了误操作,请重新选择\n:");
			break;
		}
	}
	while(1);
	return 0;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小昔超厉害

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值