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

    科技2025-11-02  8

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

    #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; } } }

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

    Processed: 0.009, SQL: 8