DS之链队

       链队概述

       用链式表示的队列简称链队。一个链队列显然需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。为了操作方便,我们像给线性表的单链表的添加头结点那样也给链队列添加一个头结点,并令头指针指向头结点。因此,空的链队列的判决条件为头指针和尾指针均指向头结点。

 

         链队列的操作即为单链表的插入和删除操作图解

 

元素x入队列

 

元素y入队列

 

元素x出队列

链队的基本操作

1操作前准备

<span style="font-size:18px;">#include <iostream>
using namespace std;
#include <malloc.h>  
#include <stdlib.h>  
#define OK 1  
#define ERROR 0  
#define OVERFLOW -2  
#define TRUE 1  
#define FALSE 0  
#define INFEASIBLE -1    
typedef int Status;//重新定义Status为int型  
typedef int QElemType;//重新定义QElemType为int型
typedef struct QNode{//重新定义一个结点结构  
    QElemType   data;  
    struct QNode  *next;  
}QNode, *QueuePtr;  
typedef struct {//定义的一个链队  
    QueuePtr  front;//队头指针     
    QueuePtr  rear;//队尾指针  
}LinkQueue;//定义的一个结构变量</span> 

1初始化队列

<span style="font-size:18px;">//1初始化队列  
Status InitQueue(LinkQueue &Q)  
{  
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));   
    if(!Q.front)  
    {  
        exit(OVERFLOW);  
    }  
    Q.front->next=NULL;  
    return OK;  
}  </span>

2判断链队是否为空

<span style="font-size:18px;">//2判断链队是否为空
Status QueueEmpty(LinkQueue Q)
{
	return (Q.front==Q.rear);
}</span>

3求链队长度

<span style="font-size:18px;">//3求队列长度
Status QueueLength(LinkQueue Q)
{
	int i=0;
	QueuePtr p=Q.front;
	while(p!=Q.rear)
	{
		i++;
		p=p->next;
	}
	return i;
}</span>

4取队头元素

<span style="font-size:18px;">//4取队头元素
Status GetHead(LinkQueue Q,QElemType &e)
{
	if(Q.front==Q.rear)
	{
		return ERROR;
	}
	e=Q.front->next->data;
	return OK;
}</span>

5清空队列

<span style="font-size:18px;">//5清空队列
Status ClearQueue(LinkQueue &Q)
{
	Q.rear=Q.front;
	QueuePtr p=Q.front->next;
	Q.front->next=NULL;
	while(p)
	{
		QueuePtr q=p->next;
		free(p);
		p=q;
	}
	return OK;
}</span>

6销毁队列

<span style="font-size:18px;">//6销毁队列
Status DestroyQueue(LinkQueue &Q)
{
	while(Q.front)
	{
		Q.rear=Q.front->next;
		free(Q.front);
		Q.front=Q.rear;
	}
	return OK;
}</span>

7入队列

<span style="font-size:18px;">//7入队列  
Status EnQueue(LinkQueue &Q,QElemType e)  
{  
    QueuePtr p=(QueuePtr)malloc(sizeof(QNode));  
    if(!p)   
    {  
        exit(OVERFLOW);  
    }  
    p->data=e;   
    p->next=NULL;  
    Q.rear->next=p;  
    Q.rear=p;  
    return OK;   
}  </span>

8出队列

<span style="font-size:18px;">//8出队列  
Status DeQueue(LinkQueue &Q,QElemType &e)  
{  
   if(Q.front==Q.rear)   
   {  
       return ERROR;  
   }  
   QueuePtr p=(QueuePtr)malloc(sizeof(QNode));  
   p=Q.front->next;  
   e=p->data;  
   Q.front->next=p->next;  
   if(Q.rear==p)   
   {  
       Q.rear=Q.front;  
   }  
   free(p);  
   return OK;  
}  </span>







 




 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值