请自己用双向链表实现一个队列,队列里节点内存的值为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;
}