4-1 链队列的基本操作
队列是限定所有的插入操作在表的一端进行,而删除操作在表的另一端进行的线性表。具有先进先出的特性,如果对元素的保存次序与使用顺序相同的,例如先到先服务属性的实际问题都可以使用队列解决。队列在计算机中有两种存储结构,一种是顺序存储结构实现,一种是链式存储结构。请采用链表作为存储结构,实现对整数类型数据元素进行链队列的进队、出队、读取队头元素的操作,同时实现初始化、判空、判满的功能。 (1)使用链队列实现对整数数据进行进队、出队、读取队头元素的操作。 (2)同时在对数据元素进行以上三个功能的同时需要实现链队列初始化、判空的接口。
函数接口定义:
/*初始化操作。*/
int InitQueue(LinkQueue * Q);
/*入队操作。*/
int EnterQueue(LinkQueue *Q,QueueElementType x);
/*出队操作。*/
int DeleteQueue(LinkQueue *Q,QueueElementType *x);
/*取队头操作。*/
int GetHead(LinkQueue *Q, int *x);
/*队列判空操作。*/
int IsEmpty(LinkQueue *Q);
裁判测试程序样例:
#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
typedef int QueueElementType; //队元素宏定义为int
typedef struct Node
{
QueueElementType data; /*数据域*/
struct Node *next; /*指针域*/
}LinkQueueNode;
typedef struct
{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue;
/*初始化操作。*/
int InitQueue(LinkQueue * Q);
/*入队操作。*/
int EnterQueue(LinkQueue *Q,QueueElementType x);
/*出队操作。*/
int DeleteQueue(LinkQueue *Q,QueueElementType *x);
/*取队头操作。*/
int GetHead(LinkQueue *Q, int *x);
/*队列判空操作。*/
int IsEmpty(LinkQueue *Q);
int main()
{
LinkQueue Q;
InitQueue(&Q);
EnterQueue(&Q,1);EnterQueue(&Q,2);EnterQueue(&Q,3);EnterQueue(&Q,4);
int x;
GetHead(&Q, &x);
printf("front:%d\n",x);
DeleteQueue(&Q,&x);
printf("del:%d\n",x);
printf("remain:");
while (!IsEmpty(&Q))
{
DeleteQueue(&Q, &x);
printf("%d ", x);
}
return 0;
}
/* 请在这里填写答案 */
/*初始化操作。*/
int InitQueue(LinkQueue * Q)
{
}
/*入队操作。*/
int EnterQueue(LinkQueue *Q,QueueElementType x)
{
}
/*出队操作。*/
int DeleteQueue(LinkQueue *Q,QueueElementType *x)
{
}
/*取队头操作。*/
int GetHead(LinkQueue *Q, int *x)
{
}
/*队列判空操作。*/
int IsEmpty(LinkQueue *Q)
{
}
输入样例:
输出样例:
在这里给出相应的输出。例如:
front:1
del:1
remain:2 3 4
接口实现:
/*初始化操作。*/
int InitQueue(LinkQueue * Q)
{
/* 将Q初始化为一个空的链队列 */
Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL)
{
Q->rear=Q->front;
Q->front->next=NULL;
return(TRUE);
}
else return(FALSE); /* 溢出!*/
}
/*入队操作。*/
int EnterQueue(LinkQueue *Q,QueueElementType x)
{
/* 将数据元素x插入到队列Q中 */
LinkQueueNode *NewNode;
NewNode=(LinkQueueNode * )malloc(sizeof(LinkQueueNode));
if(NewNode!=NULL)
{
NewNode->data=x;
NewNode->next=NULL;
Q->rear->next=NewNode;
Q->rear=NewNode;
return(TRUE);
}
else return(FALSE); /* 溢出!*/
}
/*出队操作。*/
int DeleteQueue(LinkQueue *Q,QueueElementType *x)
{
/* 将队列Q的队头元素出队,并存放到x所指的存储空间中 */
LinkQueueNode * p;
if(Q->front==Q->rear)
return(FALSE);
p=Q->front->next;
Q->front->next=p->next; /* 队头元素p出队 */
if(Q->rear==p) /* 如果队中只有一个元素p,则p出队后成为空队 */
Q->rear=Q->front;
*x=p->data;
free(p); /* 释放存储空间 */
return(TRUE);
}
int GetHead(LinkQueue *Q, int *x)
{
/*提取队列的队头元素,用x返回其值*/
if(Q->front==Q->rear) /*队列为空*/
return(FALSE);
*x=Q->front->next->data;
return(TRUE); /*操作成功*/
}
int IsEmpty(LinkQueue *Q)
{
if(Q->front==Q->rear) /*队列为空*/
return(TRUE);
else
return FALSE;
}