链式表示的队列——链式队列1——基本内容

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36669549/article/details/84572484

【定义】
链式队列通常用链表实现。在队列中分别需要一个指向队头和队尾的指针表示队头和队尾,这两个指针分别称为队头指针和队尾指针,不带头结点的链式队列和带头结点的链式队列分别如图所示。


对于带头结点的链式队列,当队列为空时,队头指针front和队尾指针rear都指向头结点,如图所示。
 

 

【循环队列】

收尾相连的链式队列就构成了链式循环队列。在链式循环队列中,可以只设置队尾指针,而无须设置队头指针,一个只设置队尾指针的链式循环队列如图所示。
 

当队列为空时,队列LQ为空的判断条件为LQ.rear->next=LQ.rear,如图所示。
 

 【存储结构】

typedef struct QNode
{
     DataType data;
     struct QNode* next;
}LQNode,*QueuePtr;
typedef struct
{
     QueuePtr front;
     QueuePtr rear;
}LinkQueue;

【基本运算】

(1)初始化链式队列

void InitQueue(LinkQueue *LQ)
{
	LQ->front = LQ->rear = (LQNode*)malloc(sizeof(LQNode));
	if (LQ->front==NULL)
	{
		exit(-1);
	}
	LQ->front->next = NULL;

}

(2)判断链式队列是否为空

int QueueEmpty(LinkQueue LQ)
{
	if (LQ.rear->next==NULL)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

(3)将元素e入队,在链式队列中插入元素时,只需要移动队尾指针;删除元素时,只需要移动队头指针。例如,在链式队列中插入a、b、c的指针变化如图。
 

插入元素a

插入元素b,c

在链式队列中插入元素e,先让队列中的最后一个结点的指针域指向待插入的结点,然后队尾指针指向该结点,如图所示。
 

//将元素e入队
int EnQueue(LinkQueue *LQ, DataType e)
{
	LQNode *s;
	s = (LQNode*)malloc(sizeof(LQNode));
	if (!s)
	{
		exit(-1);
	}
	s->data = e;
	s->next = NULL;
	LQ->rear->next = s;
	LQ->rear = s;
	return 1;
}

 

(4)将队头元素出队,即删除链式队列中的队头元素。删除队头元素结点的指针变化情况如图。

int DeQueue(LinkQueue *LQ, DataType *e)
{
	LQNode *s;
	if (LQ->front==LQ->rear)
	{
		return 0;
	}
	else
	{
		s = LQ->front->next;
		*e = s->data;
		LQ->front->next = s->next;
		if (LQ->rear==s)
		{
			LQ->rear = LQ->front;
		}
		free(s);
		return 1;
	}
}

 (5)取队头元素。

int GetHead(LinkQueue LQ, DataType *e)
{
	LQNode *s;
	if (LQ.front==LQ.rear)
	{
		return 0;
	}
	else
	{
		s = LQ.front->next;
		*e = s->data;
		return 1;
	}
}

(6)清空链式队列

void ClearQueue(LinkQueue *LQ)
{
	while (LQ->front!=NULL)
	{
		LQ->rear = LQ->front->next;
		free(LQ->front);
		LQ->front = LQ->rear;
	}
}

 

猜你喜欢

转载自blog.csdn.net/baidu_36669549/article/details/84572484
0条评论
添加一条新回复