带头结点并且只设尾指针的循环链队

假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素站点(注意不设头指针) ,试编写相应的置空队、判队空 、入队和出队等算法。

循环链队数据结构定义:

#include
using namespace std;
typedef int QElemType;
typedef int Status;
#define OK 1
#define ERROR 0
//结点
typedef struct QNode{
	QElemType date;
	struct QNode *next;
}QNode,*QueuePtr;
//链队
typedef struct{
	QueuePtr rear;
}LinkQueue;

置空队:

Status InitQueue(LinkQueue &Q)
{//置空队 
	Q.rear=new QNode;   //创建头结点 
	Q.rear->next=Q.rear;//首尾相连 ,尾指针连着头结点 ,头->1->2->3->头; 
	return OK;
}

判队空:

bool QueueEmpty(LinkQueue &Q)
{//判断队空 
	if(Q.rear->next=Q.rear) return true;
	return false;
}

入队:

void EnQueue(LinkQueue &Q,QElemType e)//入队 
{//入队 
	//创建新节点指向头结点 
	QueuePtr p=new QNode;
	p->date=e;
	p->next=Q.rear->next;
	//尾节点指向新节点,并后移 
	Q.rear->next=p;
	Q.rear=p;
}

出队:

Status DeQueue(LinkQueue &Q,QElemType &e)//删除队头元素,用e返回
{//出队 
	if( Q.rear->next==Q.rear) return ERROR;
	e=Q.rear->next->next->date;
	QueuePtr p=Q.rear->next->next;//p指向队头元素 
	Q.rear->next=p->next;
	delete p;
	return OK;
} 

完整代码:

//置空队列,判断是否为空,入队,出队 
#include
using namespace std;
typedef int QElemType;
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct QNode{
	QElemType date;
	struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
	QueuePtr rear;
}LinkQueue;
bool QueueEmpty(LinkQueue &Q)
{//判断队空 
	if(Q.rear->next=Q.rear) return true;
	return false;
}
Status InitQueue(LinkQueue &Q)
{//置空队 
	Q.rear=new QNode;   //创建头结点 
	Q.rear->next=Q.rear;//首尾相连 ,尾指针连着头结点 ,头->1->2->3->空; 
	return OK;
}
void EnQueue(LinkQueue &Q,QElemType e)//入队 
{//入队 
	//创建新节点指向头结点 
	QueuePtr p=new QNode;
	p->date=e;
	p->next=Q.rear->next;
	//尾节点指向新节点,并后移 
	Q.rear->next=p;
	Q.rear=p;
}
Status DeQueue(LinkQueue &Q,QElemType &e)//删除队头元素,用e返回
{//出队 
	if( Q.rear->next==Q.rear) return ERROR;
	e=Q.rear->next->next->date;
	QueuePtr p=Q.rear->next->next;//p指向队头元素 
	Q.rear->next=p->next;
	delete p;
	return OK;
} 
int main()
{
	return 0;
}

你可能感兴趣的:(数据结构学习记录,算法,数据结构)