如何在链接列表队列中将一些数据从一个节点传输到另一个节点C++
How do I transfer some data from one node to another in C++ Linkedlist Queue?
我很抱歉发布整个代码,但是在从每个节点获取特定数据并将整个数据传输到名为"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
解除分配它们。
至少这是错误之一,可能还有更多。尝试踏步通过
带有调试器的代码。
注意; new
与delete
一起使用,并且在C++
malloc
与free
一起使用,并且是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
是的,"新"应该与"删除"而不是"免费"相匹配,因为它已经正确指出了。但这不是特定错误的原因,如果未调用特定析构函数,则会触发错误。在这种情况下,这并不好,但不是致命的。
相关文章:
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 如何在pugixml中获取节点的内部XML
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 节点 *temp; 和节点 *tmp = 新节点之间的差异
- 引擎节点:未定义的符号:_ZTV6Config
- 为什么"delete"关键字不删除节点?
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 如何按数字顺序插入链表节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限