队列。。。。

在写顺序队列的时候我发现了以前很多未解决的问题,如今我一一将他们解决了

#include <stdio.h>
#include <stdlib.h>
#define maxsize 50
typedef struct{
	int data[maxsize];
	int front,rear;
}squeue,*queue;//顺序队列也是被限定的单链表,与栈不同的是,队列只允许在队尾入队在队头出队
queue s;
//这里的s可以在前面加上*,*s可以当作结构体类型用,如果为int型指针加上了*号就代表这个指针指向的int型的数据 
//初始时front=rear=0
void initsqueue(queue &s)
{
	s=(queue)malloc(sizeof(squeue));//注意这里我在写的时候特意没写这一句话,那么就会导致空指针的问题 
	s->front=s->rear=0;
} 
//入队操作,先判断是否队满,先送值到队尾元素,再将队尾指针加一,这个队尾rear最大可以一直取到maxsize 
void push(queue &s,int x)
{
	//判断队满 
	if(s->rear==maxsize) return;
	s->data[s->rear++]=x;//这里运行完之后rear会不会加1,答案是会加的	
} 
//出队操作,先判断是否队空,先将队列中的元素拿出来,再将front加一
//判断队空条件为rear是否等于front
void pop(queue &s)
{
	int x;
	if(s->front==s->rear) return;
	s->data[s->front++]=x;
 } 

//由于我一开始在主函数的while循环中写了->类型去引用结构体的内容然后发现会改变结构体里的数据,发现了这个问题后我没有第一时间去修正
//而是想到了另一个问题,如果我这里用.的话会不会改变,通过测试答案是会的,而且继续测试发现*().形式也会改变原结构体里的数值,
//我由此又想到另一个问题,我->类型如果写在函数里面会改变吗,通过测试答案是会的,那么在传入参数的时候我发现了一个符号&
//我之前一直是为了规范去写这么一个符号,但其实这个符号是有一定的作用的
//假如说我传入的参数是结构体指针类型,那么我写不写这个符号其实都可以都会对原来结构体里面的值进行改变
//但是如果我传入的是结构体类型,并且传入参数的时候没有加&的话会出现问题,这样传入的参数不会对结构体中的变量进行改变
//也就是说后面的操作全都为无效操作,所以我们在写结构体类型传参的时候要加上& 
//以上注释也就是解决了.和->的区别问题,这个问题困扰了我很久 
int main()
{
	int x;
 	printf("输入要插入的数:");
	scanf("%d",&x); 
 	initsqueue(s);
 	push(s,x);
 	int i=s->front;
 	while(s->rear>i)
 	{
 		printf("第%d个数据为%d\n",i+1,s->data[i]);
 		i++;
	}
	pop(s);
	int j=s->front;
	if(s->front==s->rear) printf("此时队列为空");
 	while(s->rear>j)
 	{
 		printf("第%d个数据为%d\n",j+1,s->data[j]);
 		j++;
	}
}

首先就是结构体类型与结构体指针类型的转换,我们只需要在结构体指针类型的变量加上*再打上()就可以当结构体类型用了,也就是可以从->变为使用.来调用结构体中的数据

第二个就是我当时考虑的队满的条件,我一开始想的是rear-front=maxsize即可但是这样是不对的,因为当front在地址下标为1的位置,rear在地址下标为maxsize的位置也是队满因为无法再进行插入元素,而他这个满被称为假溢出,所以真正的队满的条件是rear等于maxsize的时候

第三个是队空的条件,我一开始也判断错了,我一开始认为的是当rear=front=0即可,但是这个等于0其实是不需要的,为什么呢其实我们可以假设这个条件是对的,当我们rear和front位于地址下标为t的位置的时候若要进行删除操作我们会先判空,发现此时rear=front=t不满足我们假设的条件因此系统便认为这时队不为空便继续进行删除操作,但是这对吗。显然是错的,那么我们只需要把=0去掉就可以了,真正的队空的条件rear=front

最后就是我在写的时候遇到的一些小问题:

由于我一开始在主函数的while循环中写了->类型去引用结构体的内容然后发现会改变结构体里的数据,发现了这个问题后我没有第一时间去修正,而是想到了另一个问题,如果我这里用.的话会不会改变,通过测试答案是会的,而且继续测试发现*().形式也会改变原结构体里的数值,
我由此又想到另一个问题,我->类型如果写在函数里面会改变吗,通过测试答案是会的,那么在传入参数的时候我发现了一个符号&,我之前一直是为了规范去写这么一个符号,但其实这个符号是有一定的作用的
假如说我传入的参数是结构体指针类型,那么我写不写这个符号其实都可以都会对原来结构体里面的值进行改变
但是如果我传入的是结构体类型,并且传入参数的时候没有加&的话会出现问题,这样传入的参数不会对结构体中的变量进行改变
也就是说后面的操作全都为无效操作,所以我们在写结构体类型传参的时候要加上& 
以上注释也就是解决了.和->的区别问题,这个问题困扰了我很久

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值