4-1 链队列的基本操作

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值