数据结构之队列

1.顺序队列 

Que_Opeartor.c

#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
#include "string.h"
#define MAXSIZE 5
typedef bool status;
struct Que
{
	int que[MAXSIZE];
	int front;//指向队头
	int rear;//指向队尾
};
//创建队列
struct Que *Que_Create()
{
	struct Que*q=(struct Que *)malloc(sizeof(struct Que));
	if(q==NULL)
	{
		return false;
	}
	memset(q->que,0,sizeof(q->que));
	q->front=q->rear=MAXSIZE-1;
	return q;
}
//判断队列是否已满
status Que_Is_Full(struct Que *q)
{
	
	//if(q->front==MAXSIZE-1)
	//{
	//	return true;
	//}
	if(q->rear==-1)
	{
		return true;
	}
	return false;
}
//判断队列是否为空
status Que_Is_Empty(struct Que *q)
{
	if(q->front==q->rear)
	{
		return true;
	}
	return false;
}
//遍历队列
status Que_Travel(struct Que *q)
{
	if(Que_Is_Empty(q))
	{
		printf("队列为空,遍历失败!\n");
		return false;
	}
	for(int i=q->rear+1;ique[i]);
	}
	return true;
}


//入队
status Que_Push(struct Que *q,int data)
{
	if(Que_Is_Full(q))
	{
		printf("队列已满,入队失败!\n");
		return false;
	}
	//理解,只要有数据入队,就让队头指针指向最后一个数据元素
    //即队列如下
    //我们将数据从右侧开始放,即将对头指向右侧,开始时队尾也指向右侧
    //随着数据的加入队尾逐渐左翼
    //—— —— —— —— —— ——
	q->que[q->rear]=data;
	q->rear--;
	return true;
}
//出队
status Que_Pop(struct Que *q,int *data)
{
	if(Que_Is_Empty(q))
	{
		printf("队列为空,出队失败!\n");
		return false;
	}
	*data=q->que[q->front];
	q->que[q->front]=0;
	int i=q->front;
	while(i!=q->rear)
	{
		q->que[i]=q->que[i-1];
		i--;
	}
	q->rear++;
	return true;
}


int main()
{
	struct Que *que1=Que_Create();
	Que_Push(que1,10);
	Que_Push(que1,20);
	Que_Push(que1,30);
	Que_Push(que1,40);
	Que_Travel(que1);
	printf("*********************\n");
	int data;
	Que_Pop(que1,&data);
	printf("出队的数据:%d\n",data);
	Que_Travel(que1);

	printf("\n*********************\n");
	Que_Push(que1,80);
	Que_Travel(que1);
	return 0;
}

2. 链式队列

Que_List.c

#include "stdio.h"
#include "stdbool.h"
#include "stdlib.h"
typedef bool status;
struct Que
{
	int data;
	struct Que *next;
};
struct Que_Point
{
	struct Que *front;
	struct Que *rear;
};
struct Que_Point *Que_Create()
{
	struct Que_Point *que_point=(struct Que_Point*)malloc(sizeof(struct Que_Point));
	if(que_point==NULL)
	{
		return NULL;
	}
	que_point->front=que_point->rear=(struct Que *)malloc(sizeof(struct Que));
	if(que_point->front==NULL)
	{
		return NULL;
	}
	que_point->front->data=0;
	que_point->front->next=NULL;
	return que_point;
}
//入队
status Que_Push(struct Que_Point *q,int data)
{
	struct Que *new_Node=(struct Que *)malloc(sizeof(struct Que));
	if(new_Node==NULL)
	{
		return false;
	}
	new_Node->data=data;
	q->rear->next=new_Node;
	new_Node->next=NULL;
	q->rear=new_Node;
	return true;
}
//出队
status Que_Pop(struct Que_Point *q,int *data)
{
	if(q->front==q->rear)
	{
		printf("队列为空,出队失败!\n");
		return false;
	}
	struct Que *temp=q->front->next;
	if(temp->next==NULL)
	{
		q->rear=q->front;
		q->front->next=NULL;
		*data=temp->data;
		free(temp);
		return true;
	}
	q->front->next=temp->next;
	temp->next=NULL;
	*data=temp->data;
	free(temp);
	return true;
}

//遍历
status Que_Travel(struct Que_Point *q)
{
	if(q->front==q->rear)
	{
		printf("队列为空,遍历失败!\n");
		return false;
	}
	struct Que *tra=q->front;
	while(tra->next)
	{
		tra=tra->next;
		printf("数据:%d\n",tra->data);
	}
	return true;
}

int main()
{
	struct Que_Point*que=Que_Create();
	//入队
	Que_Push(que,10);
	Que_Push(que,20);
	Que_Push(que,30);
	Que_Push(que,40);
	Que_Travel(que);
	//出队
	int data;
	Que_Pop(que,&data);
	printf("出队的数据:%d\n",data);
	Que_Travel(que);


	return 0;
}



循环队列

Que_Loop.c

#include "stdio.h"
#include "stdbool.h"
#include "stdlib.h"
typedef bool status;
struct Que
{
	int data;
	struct Que *next;
};
struct Que_Point
{
	struct Que *front;
	struct Que *rear;
};
struct Que_Point *Que_Create()
{
	struct Que_Point *que_point=(struct Que_Point*)malloc(sizeof(struct Que_Point));
	if(que_point==NULL)
	{
		return NULL;
	}
	que_point->front=que_point->rear=(struct Que *)malloc(sizeof(struct Que));
	if(que_point->front==NULL)
	{
		return NULL;
	}
	que_point->front->data=0;
	que_point->front->next=NULL;
	return que_point;
}
//入队
status Que_Push(struct Que_Point *q,int data)
{
	struct Que *new_Node=(struct Que *)malloc(sizeof(struct Que));
	if(new_Node==NULL)
	{
		return false;
	}
	new_Node->data=data;
	q->rear->next=new_Node;
	new_Node->next=NULL;
	q->rear=new_Node;
	return true;
}
//出队
status Que_Pop(struct Que_Point *q,int *data)
{
	if(q->front==q->rear)
	{
		printf("队列为空,出队失败!\n");
		return false;
	}
	struct Que *temp=q->front->next;
	if(temp->next==NULL)
	{
		q->rear=q->front;
		q->front->next=NULL;
		*data=temp->data;
		free(temp);
		return true;
	}
	q->front->next=temp->next;
	temp->next=NULL;
	*data=temp->data;
	free(temp);
	return true;
}

//遍历
status Que_Travel(struct Que_Point *q)
{
	if(q->front==q->rear)
	{
		printf("队列为空,遍历失败!\n");
		return false;
	}
	struct Que *tra=q->front;
	while(tra->next)
	{
		tra=tra->next;
		printf("数据:%d\n",tra->data);
	}
	return true;
}

int main()
{
	struct Que_Point*que=Que_Create();
	//入队
	Que_Push(que,10);
	Que_Push(que,20);
	Que_Push(que,30);
	Que_Push(que,40);
	Que_Travel(que);
	//出队
	int data;
	Que_Pop(que,&data);
	printf("出队的数据:%d\n",data);
	Que_Travel(que);


	return 0;
}



你可能感兴趣的:(数据结构,数据结构,c语言,linux,队列)