瓷瓷的可可 2023-11-08 23:49 采纳率: 100%
浏览 6
已结题

关于#vs c++链式队列结构体指针变量读取错误#的问题,请各位专家解答!

c++链式队列:使用结构体指针变量,vs警告读写错误

  • 错误提示:

    img

  • 变量检测

    img

  • 完整代码

#include<iostream>
#include<stdio.h>

using namespace std;


//队列结构体定义

typedef int ElementType;

struct Node { /* 队列中的结点 */
    ElementType Data;
    struct Node* Next;
};
//typedef struct Node* Position;

struct QNode {
    //Position Front, Rear;  /* 队列的头、尾指针 */
    Node* Front, * Rear;
    //int MaxSize;           /* 队列最大容量 */
};
typedef struct QNode* Queue;

//初始化
void cs(Queue& q) {
    q->Front = q->Rear = NULL;
}
//入队
void add(Queue& q,ElementType& e) {
    //Position s = (Position)malloc(sizeof(Node));
    Node* s = new Node;
    s->Data = e;
    s->Next = NULL;
    if (q->Front == NULL) {
        q->Front = q->Rear = s;
    }
    else {
        q->Rear->Next = s;
        q->Rear = s;
    }
}
//出队
void remove(Queue& q) {
    if (q->Front == NULL) {
        cout << "\n队列为空!" << endl;
    }
    else {
        Node* t = q->Front;
        q->Front = q->Front->Next;
        cout << "\n删除的队列元素是" << t->Data << endl;
        delete t;
    }
}
//遍历

//主函数
int main() {
    Queue q;
    ElementType m = 99;
    cs(q);
    add(q, m);
    remove(q);
    return 0;
}

  • 写回答

2条回答 默认 最新

  • 山亦玉 2023-11-09 00:20
    关注

    我用必应ai帮你搜了一下,可能有用:
    代码中存在一些问题,导致了读写错误。首先,没有为队列分配内存。在 main 函数中,只是声明了一个 Queue 类型的变量 q,但并没有为它分配内存。这可能是导致读写错误的原因。

    可以尝试修改 cs 函数,使其为队列分配内存。以下是修改后的 cs 函数:

    void cs(Queue& q) {
        q = new QNode;
        q->Front = q->Rear = NULL;
    }
    

    此外,当队列为空时, remove 函数仍然试图删除一个元素。这可能会导致未定义的行为。应该在尝试删除元素之前检查队列是否为空。

    修改后的程序:

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    //队列结构体定义
    typedef int ElementType;
    struct Node { /* 队列中的结点 */
        ElementType Data;
        struct Node* Next;
    };
    struct QNode {
        Node* Front, * Rear;
    };
    typedef struct QNode* Queue;
    //初始化
    void cs(Queue& q) {
        q = new QNode;
        q->Front = q->Rear = NULL;
    }
    //入队
    void add(Queue& q,ElementType& e) {
        Node* s = new Node;
        s->Data = e;
        s->Next = NULL;
        if (q->Front == NULL) {
            q->Front = q->Rear = s;
        }
        else {
            q->Rear->Next = s;
            q->Rear = s;
        }
    }
    //出队
    void remove(Queue& q) {
        if (q->Front == NULL) {
            cout << "\n队列为空!" << endl;
        }
        else {
            Node* t = q->Front;
            q->Front = q->Front->Next;
            cout << "\n删除的队列元素是" << t->Data << endl;
            delete t;
        }
    }
    //主函数
    int main() {
        Queue q;
        ElementType m = 99;
        cs(q);
        add(q, m);
        remove(q);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月18日
  • 已采纳回答 11月10日
  • 创建了问题 11月8日

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画