链队列--带头节点||不带头结点

//带头结点
#include<iostream>
typedef int ElemType;
using namespace std;
struct Node {
	ElemType data;
	Node* next;
};
class Queue {
public:
	Queue();
	bool QueueEmpty() const;
	bool EnQueue(ElemType e);
	bool DeQueue(ElemType& e);
	bool GetHead(ElemType& e);
	void QueueLength();
private:
	int count; 
	Node* front;
	Node* rear;
};
Queue::Queue()
{
	front = new Node;//带头节点
	rear = front;
	front->next = NULL;
	count=0;
}
bool Queue::QueueEmpty() const
{
	return front == rear;
}
bool Queue::EnQueue(ElemType e)
{
	Node* s = new Node;
	if (NULL == s)
		return false;
	s->data = e;
	s->next = NULL;
	rear->next = s;
	rear = s;
	count++;
	return true;
}
bool Queue::DeQueue(ElemType& e)
{
	if (QueueEmpty()) return false;
	Node* p = front->next;
	e = p->data;
	front->next = p->next;
	delete p;
	count--;
	p = NULL;
	if (front->next == NULL)
		rear = front;
	return true;
}
bool Queue::GetHead(ElemType& e)
{
	if (QueueEmpty())
		return false;
	e = front->next->data;
	return true;
}
void Queue::QueueLength()
{
	cout << " QueueLength= " << count << endl;
}
int main()
{
	Queue Q;
	for (int i = 1; i < 9; i++)
	{
		Q.EnQueue(i);
	}
	Q.QueueLength();
	ElemType e;
	Q.DeQueue(e);
	cout << "e=" << e << endl;
	Q.DeQueue(e);
	cout << "e=" << e << endl;
	Q.DeQueue(e);
	cout << "e=" << e << endl;
	Q.QueueLength();
	for (int i = 1; i < 6; i++)
	{
		Q.EnQueue(7 + i);
	}
	Q.QueueLength();
	cout << "----------------" << endl;
	bool ret;
	ret=Q.DeQueue(e);
	if (ret)
		cout << "e=" << e << endl;
	else
		cout << "fail" << endl;
	ret = Q.DeQueue(e);
	if (ret)
		cout << "e=" << e << endl;
	else
		cout << "fail" << endl;
	ret = Q.GetHead(e);
	if (ret)
		cout << "e=" << e << endl;
	else
		cout << "fail" << endl;
	Q.DeQueue(e);
	cout << "e=" << e << endl;
	Q.DeQueue(e);
	cout << "e=" << e << endl;
	Q.GetHead(e);
	cout << "e=" << e << endl;
	Q.QueueLength();
	return 0;
}
//无头节点
#include<iostream>
using namespace std;
typedef int ElemType;
struct Node
{
	ElemType data;
	Node* next;
};
class Queue {
public:
	Queue();
	bool QueueEmpty() const;
	bool EnQueue(ElemType e);
	bool DeQueue(ElemType& e);
	bool GetHead(ElemType& e);
	void QueueLength();
private:
	Node* front, * rear;
	int count;
};
Queue::Queue()
{
	count = 0;
	front = NULL;
	rear = NULL;
}
bool Queue::QueueEmpty() const
{
	return (front == NULL);
}
bool Queue::EnQueue(ElemType e)
{
	Node* s = new Node;
	s->data = e;
	s->next = NULL;
	if (front == NULL)
	{
		rear = s;
		front = rear;
	}
	else
	{
		rear->next = s;
		rear = s;
	}
	count++;
	return true;
}
bool Queue::DeQueue(ElemType& e)
{
	if (QueueEmpty()) return false;
	Node* p = front;
	e = p->data;
	count--;
	front = p->next;
	if (p == rear)
	{
		rear = NULL;
		front = NULL;
	}
	delete p;
	p = NULL;
	return true;
}
bool Queue::GetHead(ElemType& e)
{
	if (QueueEmpty())
		return false;
	e = front->data;
	return true;
}
void Queue::QueueLength()
{
	cout << "Length=" << count << endl;
}
int main()
{
	Queue Q;
	for (int i = 1; i < 9; i++)
	{
		Q.EnQueue(i);
	}
	Q.QueueLength();
	ElemType e;
	Q.DeQueue(e);
	cout << "e=" << e << endl;
	Q.DeQueue(e);
	cout << "e=" << e << endl;
	Q.DeQueue(e);
	cout << "e=" << e << endl;
	Q.QueueLength();
	for (int i = 1; i < 6; i++)
	{
		Q.DeQueue(e);
	}
	Q.QueueLength();
	cout << "----------------" << endl;
	bool ret;
	ret = Q.DeQueue(e);
	if (ret)
		cout << "e=" << e << endl;
	else
		cout << "fail" << endl;
	ret = Q.DeQueue(e);
	if (ret)
		cout << "e=" << e << endl;
	else
		cout << "fail" << endl;
	ret = Q.GetHead(e);
	if (ret)
		cout << "e=" << e << endl;
	else
		cout << "fail" << endl;
	Q.EnQueue(99);
	Q.DeQueue(e);
	cout << "e=" << e << endl;
	ret = Q.GetHead(e);
	if (ret)
		cout << "e=" << e << endl;
	else
		cout << "fail" << endl;
	Q.QueueLength();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
带头结点的链队列是一种使用链表实现的队列结构,每个节点包含一个数据元素和一个指向下一个节点的指针。头结点不存储数据,只用于方便操作。 基本操作包括: 1. 初始化队列:创建一个头结点,并将队头指针和队尾指针指向头结点。 2. 判断队列是否为空:判断队头指针和队尾指针是否相等,如果相等则队列为空。 3. 入队操作:创建一个新节点,并将数据元素存入节点中,将队尾指针指向新节点。 4. 出队操作:将队头指针指向头结点的下一个节点,返回队头节点的数据元素。 5. 取队头元素:返回队头节点的数据元素,但不改变队列状态。 以下是带头结点的链队列的基本操作的代码实现: ```c++ #include <iostream> using namespace std; // 定义链队列结点结构体 struct Node { int data; Node *next; }; // 定义带头结点的链队列结构体 struct Queue { Node *front; // 队头指针 Node *rear; // 队尾指针 }; // 初始化队列 void initQueue(Queue &q) { q.front = q.rear = new Node; q.front->next = nullptr; } // 判断队列是否为空 bool isEmpty(Queue q) { return q.front == q.rear; } // 入队操作 void enQueue(Queue &q, int x) { Node *newNode = new Node; newNode->data = x; newNode->next = nullptr; q.rear->next = newNode; q.rear = newNode; } // 出队操作 int deQueue(Queue &q) { if (isEmpty(q)) { cout << "Queue is empty!" << endl; return -1; } Node *p = q.front->next; int x = p->data; q.front->next = p->next; if (q.rear == p) { q.rear = q.front; } delete p; return x; } // 取队头元素 int getFront(Queue q) { if (isEmpty(q)) { cout << "Queue is empty!" << endl; return -1; } return q.front->next->data; } int main() { Queue q; initQueue(q); cout << "Is queue empty? " << isEmpty(q) << endl; enQueue(q, 1); enQueue(q, 2); enQueue(q, 3); cout << "Front element: " << getFront(q) << endl; cout << "Dequeue element: " << deQueue(q) << endl; cout << "Front element: " << getFront(q) << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值