初冀 2023-03-20 23:36 采纳率: 61%
浏览 24
已结题

单链表尾指针越界问题怎么解决


/*如果采用带尾指针的单循环链表(带头结点)作为队列的存储结构,设计算法以实现队列的各运算。
*/
#include <iostream>
using namespace std;
#include<stdlib.h>
#include< stdio.h>

#define max 100
typedef int element;
typedef struct LNode {
    element data;
    struct LNode* next;
}node;
typedef struct {
     node* rear;//队尾指针
}linkQueue;
void iniQueue(linkQueue* Q) {
    Q->rear = new node;
    Q->rear->next = Q->rear;
}
//判断队空
bool queueEmpty(linkQueue* Q) {
    return (Q->rear = Q->rear->next);
}
//取队头元素
void queueFront(linkQueue* Q, element x) {
    if (queueEmpty(Q))
        cout << "队列为空,不可取队头元素" << endl;
    else
        node*p=Q->rear->next;
        x = Q->rear->next->next->data;
}
//入队
bool enQueue(linkQueue* Q, element x) {
    node* p = new node;
    if (p == NULL)
        return false;
    else {
        p->data = x;
        p->next = Q->rear->next;
        Q->rear->next = p;
        Q->rear = p;
        return true;
    }
}
//出队
void outQueue(linkQueue* Q, element x) {
    node* u,*p;
    if (queueEmpty(Q))
        cout << "队列为空,不可出队" << endl;
    else {
        p = Q->rear->next;
        x = p->next->data;
        u = p->next;
        p->next = u->next;
        delete u;
        if (p->next == NULL)
            Q->rear = Q->rear->next;
    }
}
int main() {
    linkQueue* Q = new     linkQueue;
    char a[100]="a", b[100] = "a";
    int m ;
    cout << "输入入队元素个数 " << endl;
    cin >> m  ;
    cout << "输入入队元素:";
    gets_s( a);
    for (int i = 0; i < m; i++) {
        enQueue(Q, a[i]);
    }
    for (int i = 0; i <m; i++) {
        outQueue(Q, b[i]);
        cout << b[i] << " ";
    }

}

img


运行结果是这样,想问一下该怎么解决Q->rear越界问题

  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2023-03-21 08:39
    关注

    iniQueue初始化函数你在main函数里没有调用,还有好几处错误,已修改:

    /*如果采用带尾指针的单循环链表(带头结点)作为队列的存储结构,设计算法以实现队列的各运算。
    */
    #include <iostream>
    using namespace std;
    #include<stdlib.h>
    #include< stdio.h>
     
    #define max 100
    typedef char element;   //明明元素是字符啊!
    typedef struct LNode {
        element data;
        struct LNode* next;
    }node;
    typedef struct {
         node* rear;//队尾指针
    }linkQueue;
    void iniQueue(linkQueue* Q) {
        Q->rear = new node;
        Q->rear->next = Q->rear;
    }
    //判断队空
    bool queueEmpty(linkQueue* Q) {
        return (Q->rear == Q->rear->next);  //是==,不是=
    }
    //取队头元素
    void queueFront(linkQueue* Q, element x) {
        if (queueEmpty(Q))
            cout << "队列为空,不可取队头元素" << endl;
        else
            node*p=Q->rear->next;
            x = Q->rear->next->next->data;
    }
    //入队
    bool enQueue(linkQueue* Q, element x) {
        node* p = new node;
        if (p == NULL)
            return false;
        else {
            p->data = x;
            p->next = Q->rear->next;
            Q->rear->next = p;
            Q->rear = p;
            return true;
        }
    }
    //出队
    void outQueue(linkQueue* Q, element &x) {   //x要用引用类型,是返回参数啊
        node* u,*p;
        if (queueEmpty(Q))
            cout << "队列为空,不可出队" << endl;
        else {
            p = Q->rear->next;
            x = p->next->data;
            u = p->next;
            p->next = u->next;
            delete u;
            if (p->next == NULL)
                Q->rear = Q->rear->next;
        }
    }
    int main() {
        linkQueue* Q = new     linkQueue;
        iniQueue(Q);  //队列初始化
        char a[100]="a", b[100] = "a";
        int m ;
        cout << "输入入队元素个数 " << endl;
        cin >> m  ;
        getchar();  //gets函数前,要接收掉前面的换行符
        cout << "输入入队元素:";
        gets_s( a);
        for (int i = 0; i < m; i++) {
            enQueue(Q, a[i]);
        }
        for (int i = 0; i <m; i++) {
            outQueue(Q, b[i]);
            cout << b[i] << " ";
        }
        system("pause");
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 已采纳回答 3月22日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥15 Oracle触发器记录修改前后的字段值
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题