以带头结点的循环链表为队列,并且只设一个指针指向队尾元素

编程入门 行业动态 更新时间:2024-10-11 15:17:53

以带头<a href=https://www.elefans.com/category/jswz/34/1765314.html style=结点的循环链表为队列,并且只设一个指针指向队尾元素"/>

以带头结点的循环链表为队列,并且只设一个指针指向队尾元素

假设以带头结点的循环链表(看清楚了是链表,不是循环队列,小编一开始就看错了,浪费了挺多时间)表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针),试编写相应的置空队列、判断队列是否为空、入队和出队等算法。

#include<iostream>
using namespace std;
//定义队列的链式存储结构
typedef struct QNode{int data;struct QNode *next;
}QNode, *QueuePtr;
//只设一个指向队尾元素的指针
typedef struct {QueuePtr rear;//记录链表长度int s;
}LinkQueue;
//交互页面
void ShowMenu() {cout << "**************循环链表表示队列***************" << endl;cout << "******************0.入队*********************" << endl;cout << "******************1.出队*********************" << endl;cout << "******************2.置空队列*****************" << endl;cout << "******************3.打印队列*****************" << endl;cout << "*************本试验仅可进行一次**************" << endl;}
//置空队列
void InitQueue(LinkQueue &Q) {Q.s = 0;Q.rear = Q.rear->next;while (Q.rear != Q.rear->next) {QueuePtr s= Q.rear->next;Q.rear->next = s->next;delete s;}system("pause");system("cls");
}
//判断队是否为空,空返回1,否则返回0
bool EmptyQueue(LinkQueue Q) {return Q.rear->next->next == Q.rear->next;
}
//入队
void EnQueue(LinkQueue &Q) {int m;cout << "请输入您需要插入元素的个数" << endl;cin >> m;Q.s += m;cout << "请依次输入您需要添加的元素" << endl;for (int i = 0;i < m;i++) {//局部变量初始化QueuePtr p=new QNode;cout << "请输入第"<<(i+1)<<"个元素" << endl;cin >> p->data;p->next = Q.rear->next;Q.rear->next = p;Q.rear = p;}system("pause");system("cls");
}
//出队
void DelQueue(LinkQueue &Q) {int n;cout << "请输入您需要删除元素的个数" << endl;cin >> n;for (int i = 0;i < n;i++) {if (Q.rear->next->next == Q.rear->next) {cout << "队列已空,无法继续删除元素" << endl;break;}QueuePtr p = Q.rear->next->next;//队列中只有一个结点if (p == Q.rear) {Q.rear = Q.rear->next;Q.rear->next = p->next;Q.s--;}else {Q.rear->next->next = p->next;Q.s--;}}system("pause");system("cls");
}
//打印队列的所有元素,打印后就退出系统
void PrintQueue(LinkQueue &Q) {//判断队列是否为空if (EmptyQueue(Q))cout << "队列为空,无法打印" << endl;else {QueuePtr q = Q.rear->next->next;for(int i=0;i<Q.s;i++) {cout << q->data;cout << "\t";q = q->next;}}system("pause");exit(0);
}
int main() {LinkQueue Q;Q.rear = new QNode();Q.s = 0;Q.rear->next = Q.rear;int i;while (1) {ShowMenu();cout << "请输入您的操作" << endl;cin >> i;switch (i){case 0: {EnQueue(Q);break;}case 1:{DelQueue(Q);break;}case 2: {InitQueue(Q);break;}case 3:{PrintQueue(Q);break;}default:break;}}
}






这里做个解释,为什么这次和上次的系统都只能做一次就必须退出系统呢,因为两个系统都没有做交互式的文件存储删除,每次的数据无法做保留,在页面多做几次试验也是无意义的!

更多推荐

以带头结点的循环链表为队列,并且只设一个指针指向队尾元素

本文发布于:2024-03-13 19:03:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1734613.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:结点   队列   指针   元素   链表

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!