如何在链接列表队列中将一些数据从一个节点传输到另一个节点C++

How do I transfer some data from one node to another in C++ Linkedlist Queue?

本文关键字:节点 C++ 一个 传输 另一个 数据 链接 列表 队列      更新时间:2023-10-16

我很抱歉发布整个代码,但是在从每个节点获取特定数据并将整个数据传输到名为"Enqueue"的函数中的全新节点时,我遇到了真正的困难。我尝试添加一个观察程序以查看我的程序在做什么,它卡在 if 语句"if (front == NULL && rear == NULL)"的"Enqueue"函数中。有人可以指出我的问题是什么我的错误吗?谢谢。

#include <iostream>
#include <string>
using namespace std;
int numb_persons_category1 = 0;
int numb_persons_category2 = 0;
int numb_persons_category0 = 0;

class Queue
{
    struct node
    {
        string name, date;
        int room;
        node *next;
    };
    node *front;
    node *rear;
public:
    Queue()
    {
        front = NULL;
        rear = NULL;
    }
    void Enqueue(string _name, string _date, int _room)
    {
        node *p = new node;
        p -> name = _name;
        p -> date = _date;
        p -> room = _room;
        p -> next = NULL;
        if (front == NULL && rear == NULL)
        {
            front = rear = p;
            return;
        }
        rear->next = p;
        rear = p;
    }
    void Dequeue()
    {
        node *temp = front;
        if (front == NULL)
            return;
        if (front == rear)
        {
            front = rear = NULL;
        }
        else
        {
            front = front->next;
        }
        free(temp);
    }
    int Front()
    {
        if(front == NULL)
        {
            cout<<"Queue is emptyn";
        }
        return front->room;
    }
    bool IsEmpty()
    {
        return front == NULL;
    }
    void populate(Queue *any_queue, int _room, int numb_persons_category)
    {
        node *any_node = front;
        while(any_node != NULL)
        {
            if (_room == 1)
            {
                any_queue->Enqueue(any_node->name, any_node->date, any_node->room);
                cout<<"Name: "<<any_node->name<<endl;
                cout<<"Last Visit: "<<any_node->date<<endl;
                cout<<"Room: "<<any_node->room<<endl;
                cout<<any_node->name<<" must be sent to "<<_room<<endl;
                numb_persons_category++;
            }
            else if (_room == 2)
            {
                any_queue->Enqueue(any_node->name, any_node->date, any_node->room);
                cout<<"Name: "<<any_node->name<<endl;
                cout<<"Last Visit: "<<any_node->date<<endl;
                cout<<"Room: "<<any_node->room<<endl;
                cout<<any_node->name<<" must be sent to "<<_room<<endl;
                numb_persons_category++;
            }
            else if (_room == 0)
            {
                any_queue->Enqueue(any_node->name, any_node->date, any_node->room);
                cout<<"Name: "<<any_node->name<<endl;
                cout<<"Last Visit: "<<any_node->date<<endl;
                cout<<"Room: "<<any_node->room<<endl;
                cout<<any_node->name<<" must be sent to "<<_room<<endl;
                numb_persons_category++;
            }
            cout<<endl<<endl;
            any_node = any_node->next;
        }
    }
    void Print()
    {
        //If you are using Windows, uncomment the line of code that says system("cls");
        //I have added the line of code as comment since I am using a non-Windows machine.
        //system("cls");
        //It doesn't matter if you don't really care about the output of my program anyway
        //It works in both cases.. But I am just trying to clear things up for the user :)
        node* temp = front;
        while(temp != NULL) {
            cout<<"Name: "<<temp->name<<endl;
            cout<<"Last Visit: "<<temp->date<<endl;
            cout<<"Room: "<<temp->room<<endl;
            cout<<endl;
            temp = temp->next;
        }
        cout<<endl;
        cout<<"Number of patients in category 0: "<<numb_persons_category0<<endl;
        cout<<"Number of patients in category 1: "<<numb_persons_category1<<endl;
        cout<<"Number of patients in category 2: "<<numb_persons_category2<<endl;
    }

};
Queue *obj_category1;
Queue *obj_category2;
Queue *obj_category0;
void room(string _name, string _date, int _room, Queue *obj)
{
    switch (_room)
    {
        case 1:
            obj->populate(obj_category1, _room, numb_persons_category1);
            break;           
        case 2:
            obj->populate(obj_category2, _room, numb_persons_category2);
            cout<<_name<<" must be sent to "<<_room<<endl;
            numb_persons_category2++;
            break;
        case 0:
            obj->populate(obj_category0, _room, numb_persons_category0);
            cout<<_name<<" must be sent to "<<_room<<endl;
            numb_persons_category0++;
            break;
        default: 
            cout<<"Room is unavailable!nn";
    }
}

int main()
{
    Queue *obj = new Queue();
    int room_number;
    string name, date;
    char user_visit;
    char run = 'y';
    while (run == 'y')
    {
        cout<<"Enter name: ";
        cin>>name;
        cout<<"Is this your first visit? (Y/N): ";
        cin>>user_visit;
        if (user_visit == 'n')
        {
            cout<<"Enter your last visit (MM/DD/YY): ";
            cin>>date;
        }
        else
        {
            date = "0/0/0";
        }
        cout<<"Enter room: ";
        cin>>room_number;
        cout<<"nnn";
        obj->Enqueue(name, date, room_number);
        room(name, date, room_number, obj);
        cout<<"Continue? (Y/N): ";
        cin>>run;
    }
    return 0;
}

您正在为节点分配new并使用free解除分配它们。
至少这是错误之一,可能还有更多。尝试踏步通过
带有调试器的代码。

注意; newdelete一起使用,并且在C++
mallocfree一起使用,并且是C风格

首先,请缩进整个程序代码,而不仅仅是嵌套块。其次,你有:

Queue *obj_category1; // which is null as global var initialized by default
obj->populate(obj_category1, _room, numb_persons_category1); // here you pass that null pointer and then it is accessed in the line the debugger complaining about

是的,"新"应该与"删除"而不是"免费"相匹配,因为它已经正确指出了。但这不是特定错误的原因,如果未调用特定析构函数,则会触发错误。在这种情况下,这并不好,但不是致命的。