结点的循环链表为队列,并且只设一个指针指向队尾元素"/>
以带头结点的循环链表为队列,并且只设一个指针指向队尾元素
假设以带头结点的循环链表(看清楚了是链表,不是循环队列,小编一开始就看错了,浪费了挺多时间)表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针),试编写相应的置空队列、判断队列是否为空、入队和出队等算法。
#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;}}
}
这里做个解释,为什么这次和上次的系统都只能做一次就必须退出系统呢,因为两个系统都没有做交互式的文件存储删除,每次的数据无法做保留,在页面多做几次试验也是无意义的!
更多推荐
以带头结点的循环链表为队列,并且只设一个指针指向队尾元素
发布评论