2021-11-04

队列顺序表、链表基本操作

队列顺序表:

#include<stdio.h>
#include<stdlib.h>
#define QElemType int
#define MAXQSIZE 100
#define Status int 
#define OVERFLOW 0
typedef struct{
	QElemType *base;      //存储空间基地址
	int front;
	int rear; 
	 
}SqQueue; 
Status InitQueue(SqQueue &Q){
	Q.base = new QElemType[MAXQSIZE];
	if(!Q.base) exit(OVERFLOW);
	Q.front = Q.rear = 0;
	return 1;
}
void QueueLength(SqQueue &Q){
	printf("队列总长度为%d\n",((Q.rear-Q.front+MAXQSIZE)%MAXQSIZE));
}
Status EnQueue(SqQueue &Q,QElemType &e){
	//判断队列数据是否满 
	if((Q.rear+1)%MAXQSIZE == Q.front){
		return 0;
	}
	Q.base[Q.rear] = e;
	Q.rear = (Q.rear+1)%MAXQSIZE;
	return 1;
	}
Status DeQueue(SqQueue &Q,QElemType &e){
	//判断队列数据是否空 
	if(Q.rear == Q.front){
		return 0;
	}
	e = Q.base[Q.front];
	Q.front = (Q.front+1)%MAXQSIZE;
	return 1;
	}
void EntoQueue(SqQueue &Q){
    int n;
    QElemType e;
    int flag;
	printf("请输入你要入队几个数据:\n");
	scanf("%d",&n);
	for(int i = 0;i < n;i++){
		printf("请输入你要插入第%d个数据是:\n",i+1);
		scanf("%d",&e);
		flag = EnQueue(Q,e);
		if(flag){
			printf("%d已入队列\n",e);
		}else{
			printf("队列已满!\n");
		}
	}
}
void DetoQueue(SqQueue &Q){
    int n;
    QElemType e;
    int flag;
	printf("请输入你要出队几个数据:\n");
	scanf("%d",&n);
	for(int i = 0;i < n;i++){
		flag = DeQueue(Q,e);
		if(flag){
			printf("%d已出队列\n",e);
		}else{
			printf("队列已空!\n");
		}
	}
}
void GetHead(SqQueue &Q){
	if(Q.front == Q.rear){
		printf("队列为空!\n"); 
	}else{
		printf("队头元素为%d\n",Q.base[Q.front]);
	}
}
menu(){ 
	printf("***************\n");
	printf("1.入队\n");
	printf("2.出队\n");
	printf("3.取队列长度\n");
	printf("4.取循环队列的队头元素\n");
	printf("5.退出\n");
	printf("***************\n"); 
} 
int main(){
	SqQueue Q;
	InitQueue(Q);
	while(1){
		menu();
		int choice;
		printf("请选择操作菜单:\n");
		scanf("%d",&choice);
		if(choice == 5) break;
		switch(choice){
			case 1:EntoQueue(Q); break;
			case 2:DetoQueue(Q); break;
			case 3:QueueLength(Q);break; 
			case 4:GetHead(Q); break;
			default:printf("输入错误!!\n");
		}
	}
	return 0;
} 

在这里插入图片描述

队列链表:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define QElemType int
#define Status int
#define MaxQSIZE 100
//队列链是有一个指向首元节点的头结点的,而栈链没有头结点,直接就是首元结点 
typedef struct QNode{
	QElemType data;
	struct QNode *next;
}QNode,*QueuePtr; 

typedef struct{
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;

Status InitQueue(LinkQueue &Q){
	Q.front = Q.rear = new QNode;
	Q.front->next = NULL;
	return 1;
}
Status EnQueue(LinkQueue &Q,QueuePtr &p,QElemType &e){
	p = new QNode;
	p->data = e;
	p->next = NULL;
	Q.rear->next = p;
	Q.rear = p;
	return 1;
} 
Status DeQueue(LinkQueue &Q,QueuePtr &p,QElemType &e){
	if(Q.front == Q.rear) return 0;
	p = Q.front->next;
	e = p->data;
	Q.front->next = p->next;
	if(Q.rear == p) Q.rear=Q.front;   //这时队列里只有一个数据了,再次让Q.rear == Q.front; 
	free(p);
	return 1;
} 
void EntoQueue(LinkQueue &Q,QueuePtr &p){
	int flag;
	int n;
	QElemType e;
	printf("请输入你要入队列几个数据:\n");
	scanf("%d",&n);
	for(int i = 0;i<n;i++){
		printf("请输入你要进入的第%d个数据是:\n",i+1);
		scanf("%d",&e);
		flag = EnQueue(Q,p,e);
		if(flag){
			printf("%d入队成功!\n",e);
		}else{
			printf("入队失败!\n");
		}
	}
}

void DetoQueue(LinkQueue &Q,QueuePtr &p){
	int flag;
	int n;
	QElemType e;
	printf("请输入你要出队列几个数据:\n");
	scanf("%d",&n);
	for(int i = 0;i<n;i++){
		flag = DeQueue(Q,p,e);
		if(flag){
			printf("%d出队成功!\n",e);
		}else{
			printf("出队失败!\n");
		}
	}
}
void GetHead(LinkQueue &Q){
	if(Q.front != Q.rear){   //队列非空 
		printf("队头数据为%d:\n",Q.front->next->data);
	}
}
menu(){
	printf("***************\n");
	printf("1.入队\n");
	printf("2.出队\n");
	printf("3.取队头元素\n");
	printf("4.退出\n");
	printf("***************\n"); 
} 
int main(){
	LinkQueue Q;
	QueuePtr p;
	InitQueue(Q);
	while(1){
		menu();
		int choice;
		printf("请选择操作菜单:\n");
		scanf("%d",&choice);
		if(choice == 4) break;
		switch(choice){
			case 1:EntoQueue(Q,p); break;
			case 2:DetoQueue(Q,p); break;
			case 3:GetHead(Q);break; 
			default:printf("输入错误!!\n");
		}
	}
	return 0;
} 

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值