数据结构之——队列的基本操作

1.顺序队列,可以实现以下功能:

数据结构之——队列的基本操作_第1张图片

代码如下:

#include "stdio.h"

#define DateType int
#define MAXSIZE 100

typedef struct {
	DateType data[MAXSIZE];
	int front,rear;
}SeqQueue,*PSeqQueue;

/*初始化队列,入口参数:无,返回值:新的顺序队列指针,null表示失败*/
PSeqQueue Init_SeqQueue()
{
	PSeqQueue Q;
	Q = (PSeqQueue)malloc(sizeof(SeqQueue));

	if(Q)
	{
		Q->front = 0;
		Q->rear = 0;
	}

	return Q;
}

/*判断队列是否为空,入口参数:顺序队列,返回值:1表示为空,0表示不为空*/
int Empty_SeqQueue(PSeqQueue Q)
{
	if(Q && Q->front == Q->rear)
		return 1;
	else
		return 0;
}

/*入队操作,入口参数:顺序队列和待入队的元素x,返回值:1表示成功,-1表示队满溢出*/
int In_SeqQueue(PSeqQueue Q,DateType x)
{
	if((Q->rear + 1) % MAXSIZE == Q->front)
	{
		printf("队满!\n");
		return -1;
	}

	else
	{
		Q->rear = (Q->rear + 1) % MAXSIZE;
		Q->data[Q->rear] = x;
		return 1;
	}
}

/*出队操作,入口参数:顺序队列和保存出队元素的*x,返回值:1表示成功,-1表示队空*/
int Out_SeqQueue(PSeqQueue Q,DateType *x)
{
	if(Empty_SeqQueue(Q))
	{
		printf("队空!\n");
		return -1;
	}

	else
	{
		Q->front = (Q->front + 1) % MAXSIZE;
		*x = Q->data[Q->front];
		printf("出队列元素为:%d\n",*x);
		return 1;
	}
}

/*取队头元素,入口参数:顺序队列和保存队头元素的*x,返回值:1表示成功,-1表示队空*/
int GetFront_SeqQueue(PSeqQueue Q,DateType *x)
{
	if(Empty_SeqQueue(Q))
	{
		printf("队空!\n");
		return -1;
	}

	else
	{
		*x = Q->data[(Q->front + 1) % MAXSIZE];
		printf("队列头元素为:%d\n",*x);
	}
}

/*销毁栈,入口参数:要销毁的顺序队列指针的地址,无返回值*/
void Destory_SeqQueue(PSeqQueue *Q)
{
	if(*Q)
		free(*Q);
	*Q = NULL;
}

int main()
{
	int n,m,x;
	DateType *p;

	PSeqQueue Q;
	Q = (PSeqQueue)malloc(sizeof(SeqQueue));

	Q = Init_SeqQueue();


	while(1)
	{
		printf("/**这是一个顺序队列,请输入一个相对应的操作**/\n");
		printf("/*************1:判断队列是否为空************/\n");
		printf("/*************2:入队列          ************/\n");
		printf("/*************3:出队列          ************/\n");
		printf("/*************4:获取队列头元素  ************/\n");
		printf("/*************5:退出            ************/\n");

		scanf("%d",&n);
		switch(n)
		{
			case 1: m = Empty_SeqQueue(Q);
					if(m == 0)
						printf("队列非空\n");
					if(m == 1)
						printf("队列空\n");
					break;
			case 2: printf("请输入要入队列的元素:\n");
					scanf("%d",&x);
					m = In_SeqQueue(Q,x);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 3: m = Out_SeqQueue(Q,&p);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 4: m = GetFront_SeqQueue(Q,&p);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 5: Destory_SeqQueue(&Q);
					return;
		}
	}
	return 0;
}

2.链队列,可以实现以下功能:

数据结构之——队列的基本操作_第2张图片

代码如下:

#include "stdio.h"

#define DateType int

typedef struct node {
	DateType data;
	struct node *next;
}Qnode,*PQnode;    //链队节点类型

typedef struct{
    PQnode front,rear;    //指向链队节点类型的指针
}LinkQueue,*PLinkQueue;

/*初始化队列,入口参数:无,返回值:新的顺序队列指针,null表示失败*/
PLinkQueue Init_LinkQueue()
{
	PLinkQueue Q;
	Q = (PLinkQueue)malloc(sizeof(LinkQueue));

	if(Q)
	{
		Q->front = NULL;
		Q->rear = NULL;
	}

	return Q;
}

/*判断队列是否为空,入口参数:链队列,返回值:1表示为空,0表示不为空*/
int Empty_LinkQueue(PLinkQueue Q)
{
	if(Q && Q->front == NULL && Q->rear == NULL)
		return 1;
	else
		return 0;
}

/*入队操作,入口参数:链队列和待入队的元素x,返回值:1表示成功,0表示系统内存溢出*/
int In_LinkQueue(PLinkQueue Q,DateType x)
{
	PQnode p;
	p = (PQnode)malloc(sizeof(Qnode));

	if(!p)
	{
		printf("内存溢出!\n");
    	return 0;
	}

	p->data = x;
	p->next = NULL;

	if(Empty_LinkQueue(Q))
	{
		Q->front = Q->rear = p;
	}
	else
	{
		Q->rear->next = p;    //最后一个元素指向p
		Q->rear = p;    //尾指针指向p
	}

	return 1;
}

/*出队操作,入口参数:链队列和保存出队元素的*x,返回值:1表示成功,-1表示队空*/
int Out_LinkQueue(PLinkQueue Q,DateType *x)
{
	PQnode p;
	if(Empty_LinkQueue(Q))
	{
		printf("队空!\n");
		return -1;
	}

	*x = Q->front->data;
	printf("出队列元素为:%d\n",*x);
	p = Q->front;
	Q->front = Q->front->next;
	free(p);

	if(!Q->front)
	{
		Q->rear = NULL;
	}

	return 1;
}

/*取队头元素,入口参数:链队列和保存队头元素的*x,返回值:1表示成功,0表示队空*/
int GetFront_LinkQueue(PLinkQueue Q,DateType *x)
{
	if(Empty_LinkQueue(Q))
	{
		printf("队空!\n");
		return 0;
	}

	else
	{
		*x = Q->front->data;
		printf("队列头元素为:%d\n",*x);
	}

	return 1;
}

/*销毁栈,入口参数:要销毁的链队列指针的地址,无返回值*/
void Destory_LinkQueue(PLinkQueue *Q)
{
	PQnode p,q;
	q = (*Q)->front;

	if(*Q)
	{
		while(q)
		{
			p = q;
			q = q->next;
			free(p);
		}

		free(*Q);
	}

	*Q = NULL;
}

int main()
{
	int n,m,x;
	DateType *p;

	PLinkQueue Q;
	Q = (PLinkQueue)malloc(sizeof(LinkQueue));

	Q = Init_LinkQueue();


	while(1)
	{
		printf("/***这是一个链队列,请输入一个相对应的操作***/\n");
		printf("/*************1:判断队列是否为空************/\n");
		printf("/*************2:入队列          ************/\n");
		printf("/*************3:出队列          ************/\n");
		printf("/*************4:获取队列头元素  ************/\n");
		printf("/*************5:退出            ************/\n");

		scanf("%d",&n);
		switch(n)
		{
			case 1: m = Empty_LinkQueue(Q);
					if(m == 0)
						printf("队列非空\n");
					if(m == 1)
						printf("队列空\n");
					break;
			case 2: printf("请输入要入队列的元素:\n");
					scanf("%d",&x);
					m = In_LinkQueue(Q,x);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 3: m = Out_LinkQueue(Q,&p);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 4: m = GetFront_LinkQueue(Q,&p);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 5: Destory_LinkQueue(&Q);
					return;
		}
	}
	return 0;
}

 

你可能感兴趣的:(数据结构)