1. 程式人生 > >佇列的鏈式表示和實現

佇列的鏈式表示和實現

注意:

  1. 隊首指標 Q.front 指向的不是第一個資料元素結點 Q.front->next 才是。
  2. 隊尾指標 Q.rear 始終指向最後一個結點。
  3. Q.length 始終是當前佇列的長度
#include <iostream>
using namespace std;

typedef struct QNode{
	int data;
	struct QNode *next;
} QNode, *QNodePtr;
typedef struct{
	QNodePtr front;		// 隊首指標
	QNodePtr rear;		// 隊尾指標
	int length;
} LinkQueue;

bool QueueInit(LinkQueue &Q)
{
	Q.front = Q.rear = new QNode;	// 生成新節點作為頭結點, 隊首和隊尾指標指向它
	Q.rear->next = NULL;			// 頭結點的指標域置為空
	Q.length = 0;					// 初始長度為0
	return true;
}
bool QueuePush(LinkQueue &Q, int e)	// 插入元素e為Q的新隊尾元素
{
	QNodePtr p = new QNode;		// 先申請節點
	p->data = e;			// 設定資料域
	p->next = NULL;			// 指標域
	Q.rear->next = p;		// 新節點插入到隊尾
	Q.rear = p;				// 修改隊尾指標
	Q.length ++;		// 長度加一
	return true;
}
bool QueuePop(LinkQueue &Q)
{
	if(Q.front == Q.rear)
		return false;		// 隊空,不能刪除
	QNodePtr p = Q.front->next;	// 臨時指標指向隊首結點
	Q.front->next = p->next;	// 隊首指標指向首節點的下一個節點
	if(p == Q.rear)			// 如果最後一個結點被刪
		Q.rear = Q.front;	//
	delete p;
	Q.length --;		// 長度減一
	return true;
}
int QueueTop(const LinkQueue &Q)
{
	if(Q.front == Q.rear)
	{
		cout << "Error" << endl;
		return 0;
	}
	return Q.front->next->data;
}
int QueueSize(const LinkQueue &Q)
{
	return Q.length;
}
int main()
{
	LinkQueue Q;
	QueueInit(Q);
	QueuePush(Q, 1);
	QueuePush(Q, 2);
	QueuePush(Q, 3);
	cout << QueueTop(Q) << endl;
	cout << QueueSize(Q) << endl;
	QueuePop(Q);
	cout << QueueTop(Q) << endl;
	cout << QueueSize(Q) << endl;




	return 0;
}