双向链表实现一个队列

请自己用双向链表实现一个队列,队列里节点内存的值为int,要求实现入队,出队和查找指定节点的三个功能。

#include <iostream>
using namespace std;

typedef struct node {
	int data;
	node* prev;
	node* next;
} Node;

typedef struct queue {
	Node* front;
	Node* rear;
} LinkDQueue;

LinkDQueue* Creat_DQueuelist();              //创建双端队列函数
void En_DQueuelist(LinkDQueue* q, int e);    //入队函数
int De_DQueuelist(LinkDQueue* q);    //出队函数
void Print_DQueuelist(LinkDQueue* q);        //打印队列
int Getlength_DQueuelist(LinkDQueue* q);     //计算双端队列长度函数

int main() {
	LinkDQueue* queue = Creat_DQueuelist();
	Print_DQueuelist(queue);
	cout << "length: " << Getlength_DQueuelist(queue) << endl;

	En_DQueuelist(queue, 4);
	Print_DQueuelist(queue);
	cout << "length: " << Getlength_DQueuelist(queue) << endl;

	int data = De_DQueuelist(queue);
	if (data != INT_MAX) {
		cout << "删除元素:" << data << endl;
	}
	Print_DQueuelist(queue);
	return 0;
}

LinkDQueue* Creat_DQueuelist() {
	LinkDQueue* queue = new LinkDQueue;
	queue->front = queue->rear = new Node;
	queue->front->data = 0;
	queue->front->prev = NULL;
	queue->front->next = NULL;
	queue->rear->next = NULL;

	int length = 0;
	int number = 0;
	cout << "请输入双端队列长度:";
	cin >> length;
	if (!length) {
		return queue;
	}
	cout << "请输入双端队列数据:";
	for (int i = 0; i < length; i++) //端口2创建双端队列
			{
		Node* pnew = new Node;
		if (!pnew)
			cout << "内存分配失败!" << endl;
		cin >> number;
		pnew->data = number;
		pnew->next = NULL;
		queue->rear->next = pnew;
		pnew->prev = queue->rear;
		queue->rear = pnew;
	}
	return queue;
}

void En_DQueuelist(LinkDQueue* q, int e) {
	int n = 0;
	Node* tmp = new Node;
	tmp->data = e;
	cout << "请输入顺序入队端口:";
	cin >> n;
	if (q->front == q->rear) {
		q->rear->next = tmp;
		tmp->prev = q->rear;
		tmp->next = NULL;
		q->rear = tmp;
		return;
	}
	switch (n) {
	case 1:
		tmp->next = q->front->next;
		q->front->next->prev = tmp;
		q->front->next = tmp;
		tmp->prev = q->front;
		break;
	case 2:
		tmp->next = NULL;
		q->rear->next = tmp;
		tmp->prev = q->rear;
		q->rear = tmp;
		break;
	}
}

int De_DQueuelist(LinkDQueue* q) {
	int data = INT_MAX;
	if (!q || q->front == q->rear) {
		cout << "队列为空!" << endl;
		return data;
	}
	int n = 0;
	Node* tmp = NULL;
	cout << "请输入顺序出队端口:";
	cin >> n;
	switch (n) {
	case 1:
		tmp = q->front->next;
		data = tmp->data;
		q->front->next = tmp->next;

		if (q->rear == tmp) {
			q->rear = q->front;
		} else {
			tmp->next->prev = q->front;
		}
		delete tmp;
		return data;
	case 2:
		tmp = q->rear;
		data = tmp->data;
		tmp->prev->next = NULL;
		q->rear = tmp->prev;
//		tmp->prev = NULL;
		delete tmp;
		return data;
	}
}

void Print_DQueuelist(LinkDQueue* q) {

	int n = 0;
	Node * tmp = NULL;
	cout << "请输入顺序打印端口:";
	cin >> n;
	switch (n) {
	case 1:
		tmp = q->front->next;
		while (tmp) {
			cout << tmp->data << ' ';
			tmp = tmp->next;
		}
		break;
	case 2:
		tmp = q->rear;
		while (tmp != q->front) {
			cout << tmp->data << ' ';
			tmp = tmp->prev;
		}
		break;
	}
}

int Getlength_DQueuelist(LinkDQueue* q) {
	int length = 0;
	Node* tmp = q->front->next;
	while (tmp) {
		length++;
		tmp = tmp->next;
	}
	return length;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值