链队列的功能如下:
初始化链队列的双指针
void InitQueue(NodePointer & q) //初始化链队列的双指针
{
q.front = (Node *)malloc(sizeof(Node));
q.rear = (Node *)malloc(sizeof(Node));
q.front = q.rear;
q.front->next = nullptr;
q.rear->next = nullptr;
if(!q.front || !q.rear)
{
cout << "\n\t\t内存分配失败,程序退出" << endl;
exit(-1);
}
cout << "\n\t\t初始化链队列成功!!" << endl;
return;
}
测试输入数字的合理性
void TestKeyValue(int & key) //测试输入数字的合理性
{
if(key == 1 || key ==0)
{
return;
}
else
{
cout << "\n\t\t你的输入有误!" << endl;
cout << "\n\t\t请重新输入 ";
cin >> key;
TestKeyValue(key);
}
}
插入元素
void PushNode(NodePointer & q,int elemt) //插入元素
{
Node * node = (Node *)malloc(sizeof(Node));
if(!node)
{
cout << "\n\t\t内存分配失败,程序退出" << endl;
exit(-1);
}
node->next = NULL;
node->data = elemt;
if(q.front == NULL) //采用q.front->next 的原因是q.front 保存了 q.rear的初始内存地址,保存直接从第二个节点开始
{
q.front = node;
q.rear = node; //由于q.front已经被保存了q.rear ,所以该if条件不执行
}
else
{
q.rear->next = node; //尾插法插入元素
q.rear = node;
}
cout << "\n\t\t插入元素成功!" << endl;
return;
}
弹出队头元素
bool PabNodeHead(NodePointer & q,int & data) //弹出对头元素
{
if(q.front== nullptr || q.rear==nullptr)
{
return false;
}
Node * p = q.front->next;
data = p->data;
q.front->next = p->next; //采用q.front->next 的原因是q.front
//保存了 q.rear的初始内存地址,保存直接从第二个节点开始
delete(p); //释放被弹出节点的空间
return true;
}
弹出队尾元素
bool PabNodeBack(NodePointer & q,int & data) //弹出队尾元素
{
if(q.front==NULL || q.rear==NULL)
{
return false;
}
Node * head = q.front->next;
while(head->next != q.rear) //通过遍历使rear指针指向尾部节点的
//上一个节点,然后删除尾部节点
{
head = head->next;
}
Node * p = q.rear;
data = p->data;
q.rear = head;
delete(p);
return true;
}
获取队列的头元素
bool getQueueHeadNode(NodePointer & q,int & data) //获取队列的头元素
{
if(q.front == NULL)
{
cout << "\n\t\t队列为空!" << endl;
return false;
}
data = q.front->next->data;
return true;
}
展示队列的元素
void ShowQueue(NodePointer & q)
{
if(q.front == NULL)
{
cout << "\n\t\t队列为空!" << endl;
return;
}
cout << "\n\t\t队列的输出如下!" << endl;
Node * p = q.front->next;
cout << "\n\t\t";
while(p != q.rear)
{
printf("%6d",p->data);
p = p->next;
}
printf("%6d",p->data);
return;
}
菜单选项
void ShowMenu()
{
printf("\n\t\t*****************************************************");
printf("\n\t\t* 1--------进 队 *");
printf("\n\t\t* 2--------出 队 *");
printf("\n\t\t* 3--------读对头元素 *");
printf("\n\t\t* 4--------显 示 *");
printf("\n\t\t* 0--------退 出 *");
printf("\n\t\t*****************************************************");
}
完整代码:
#include<iostream>
using namespace std;
typedef struct Qnode
{
int data;
struct Qnode * next;
}Node;
typedef struct node
{
Node * front;
Node * rear;
}NodePointer;
void InitQueue(NodePointer & q) //初始化链队列的双指针
{
q.front = (Node *)malloc(sizeof(Node));
q.rear = (Node *)malloc(sizeof(Node));
q.front = q.rear;
q.front->next = nullptr;
q.rear->next = nullptr;
if(!q.front || !q.rear)
{
cout << "\n\t\t内存分配失败,程序退出" << endl;
exit(-1);
}
cout << "\n\t\t初始化链队列成功!!" << endl;
return;
}
void TestKeyValue(int & key) //测试输入数字的合理性
{
if(key == 1 || key ==0)
{
return;
}
else
{
cout << "\n\t\t你的输入有误!" << endl;
cout << "\n\t\t请重新输入 ";
cin >> key;
TestKeyValue(key);
}
}
void PushNode(NodePointer & q,int elemt) //插入元素
{
Node * node = (Node *)malloc(sizeof(Node));
if(!node)
{
cout << "\n\t\t内存分配失败,程序退出" << endl;
exit(-1);
}
node->next = NULL;
node->data = elemt;
if(q.front == NULL) //采用q.front->next 的原因是q.front 保存了 q.rear的初始内存地址,保存直接从第二个节点开始
{
q.front = node;
q.rear = node; //由于q.front已经被保存了q.rear ,所以该if条件不执行
}
else
{
q.rear->next = node;
q.rear = node;
}
cout << "\n\t\t插入元素成功!" << endl;
return;
}
bool PabNodeHead(NodePointer & q,int & data) //弹出对头元素
{
if(q.front== nullptr || q.rear==nullptr)
{
return false;
}
Node * p = q.front->next;
data = p->data;
q.front->next = p->next; //采用q.front->next 的原因是q.front 保存了 q.rear的初始内存地址,保存直接从第二个节点开始
delete(p);
return true;
}
bool PabNodeBack(NodePointer & q,int & data) //弹出队尾元素
{
if(q.front==NULL || q.rear==NULL)
{
return false;
}
Node * head = q.front->next;
while(head->next != q.rear)
{
head = head->next;
}
Node * p = q.rear;
data = p->data;
q.rear = head;
delete(p);
return true;
}
bool getQueueHeadNode(NodePointer & q,int & data) //获取队列的头元素
{
if(q.front == NULL)
{
cout << "\n\t\t队列为空!" << endl;
return false;
}
data = q.front->next->data;
return true;
}
void ShowQueue(NodePointer & q)
{
if(q.front == NULL)
{
cout << "\n\t\t队列为空!" << endl;
return;
}
cout << "\n\t\t队列的输出如下!" << endl;
Node * p = q.front->next;
cout << "\n\t\t";
while(p != q.rear)
{
printf("%6d",p->data);
p = p->next;
}
printf("%6d",p->data);
return;
}
void ShowMenu()
{
printf("\n\t\t*****************************************************");
printf("\n\t\t* 1--------进 队 *");
printf("\n\t\t* 2--------出 队 *");
printf("\n\t\t* 3--------读对头元素 *");
printf("\n\t\t* 4--------显 示 *");
printf("\n\t\t* 0--------退 出 *");
printf("\n\t\t*****************************************************");
}
int main(void)
{
bool loop = true;
NodePointer q;
InitQueue(q); //初始化队列
do
{
ShowMenu();
cout << "\n\t\t请输入你的选择(0-5):";
char key;
cin >> key;
switch(key)
{
case '1':
cout << "\n\t\t[ 进 队 ]" << endl;
cout << "\n\t\t请你输入入队元素 ";
int num;
cin >> num;
PushNode(q,num);
break;
case '2':
cout << "\n\t\t[ 出 队 ]" << endl;
cout << "\n\t\t弹出元素 1-头部元素 0-尾部元素 ";
int key2;
cin >> key2;
TestKeyValue(key2);
int data; //获取数据
if(key2 == 1)
{
if(PabNodeHead(q,data))
{
cout << "\n\t\t" << data << endl;
cout << "\n\t\t弹出头部元素成功" << endl;
}
else
{
cout << "\n\t\t队列为空!" << endl;
}
}
else
{
if(PabNodeBack(q,data))
{
cout << "\n\t\t" << data << endl;
cout << "\n\t\t弹出队尾元素完毕" << endl;
}
else
{
cout << "\n\t\t队列为空!" << endl;
}
}
break;
case '3':
cout << "\n\t\t[ 读对头元素 ]" << endl;
int FirstData;
if(getQueueHeadNode(q,FirstData))
{
cout << "\n\t\t" << FirstData << endl;
}
else
{
cout << "\n\t\t队列为空!" << endl;
}
break;
case '4':
ShowQueue(q);
break;
// case '5':
// break;
case '0':
cout << "\n\t\t[ 退 出 ]" << endl;
int key3;
cout << "\n\t\t是否确定退出 1-是 0-否 ";
cin >> key3;
TestKeyValue(key3);
if(key3 == 1)
{
loop = false;
cout << "\n\t\t程序退出!" << endl;
}
else
{
cout << "\n\t\t程序继续运行!" << endl;
}
break;
default:
cout << "\n\t\t输入有误,请重新选择!" << endl;
break;
}
}while(loop);
}