数据结构第四次作业(2024.8.5)(第十三次作业)

顺序队列(循环队列)

#ifndef   __SEQUEUE__
#define   __SEQUEUE__

#include <stdio.h>
#include <stdlib.h>

#define  N  10

typedef int mytype;

typedef struct{
	mytype data[N];
	int head;
	int tail;
}Sequeue;

Sequeue* create_sequeue(void);
void print_sequeue(Sequeue*);
void add_sequeue(Sequeue*,mytype);
mytype remove_sequeue(Sequeue*);
int strlen_sequeue(Sequeue*);
void free_sequeue(Sequeue**);

#endif
#include "./sequeue.h"

//创建队列
Sequeue* create_sequeue(){
	Sequeue *se = (Sequeue*)malloc(sizeof(Sequeue));
	if(se==NULL){
		printf("创建队列失败!\n");
		return NULL;
	}
	printf("创建队列成功!\n");
	se->head=se->tail=0;
	return se;
}

//判空
int isEmpty(Sequeue* se){
	return se->head==se->tail ? 1 : 0 ;
}

//判满
int isFull(Sequeue* se){
	return (se->tail+1)%N==se->head ? 1 : 0 ;
}

//遍历
void print_sequeue(Sequeue* ps){
	if(ps!=NULL){
		if(isEmpty(ps)){
			printf("当前队列元素为空!\n");
			return;
		}
		for(int i=ps->head;i!=ps->tail;i=(i+1)%N)
			printf("当前数据为:%d\n",ps->data[i]);
		return;
	}
	printf("队列不存在\n");
}

//入队
void add_sequeue(Sequeue* as,mytype num){
	if(as!=NULL){
		if(!isFull(as)){
			as->data[as->tail]=num;
			as->tail=(as->tail+1)%N;
			return;
		}
		printf("队列已满,无法入队!\n");
		return;
	}
	printf("队列不存在!\n");
}



//出队//拿数据
mytype remove_sequeue(Sequeue* rs){
	if(rs!=NULL){
		if(!isEmpty(rs)){
			mytype a = rs->data[rs->head];
			rs->head=(rs->head+1)%N;
			return a;
		}
		printf("队列已空,无法出队!\n");
		return (mytype)-1;
	}
	printf("队列不存在!\n");
	return (mytype)-1;
}

//队列长度

int strlen_sequeue(Sequeue* ss){
	return (ss->tail-ss->head+N)%N;
//	return ss->tail>ss->head ? ss->tail-ss->head : N-ss->head+ss->tail;
}

//释放队列
void free_sequeue(Sequeue** fs){
	(*fs)->head = (*fs)->tail = 0;
	free(*fs);
	*fs=NULL;
}

#include "./sequeue.h"

int main(int argc, const char *argv[])
{
	Sequeue *seq = create_sequeue();
	if(seq==NULL)
		return 0;
	int jump=1,choose,num;
	while(jump){
		printf("请选择所需操作: 0:退出   1:遍历   2:入队   3:出队   4:队列长度   5:释放队列\n");
		scanf("%d",&choose);
		switch(choose){
		case 0:{
				   jump=0;
				   break;
			   }
		case 1:{
				   print_sequeue(seq);
				   break;
			   }
		case 2:{
				   printf("请输入您想插入的内容!\n");
				   scanf("%d",&num);
				   add_sequeue(seq,num);
				   break;
			   }
		case 3:{
				   printf("移除数据为:%d\n",remove_sequeue(seq));
				   break;
			   }
		case 4:{
				   printf("该队列长度为:%d\n",strlen_sequeue(seq));
				   break;
			   }
		case 5:{
				   free_sequeue(&seq);
				   if(seq==NULL)
					   printf("该队列已完全释放!\n");
				   else
					   printf("释放失败!\n");
				   break;
			   }
		default:{

				   break;
			   }
		}
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值