编辑:我也不介意知道这是否太模糊以至于您无法理解或发现问题所在,我知道它与代码没有直接关系,因为更改发生在我即将到来的时候退出函数......不是在实际的“代码”期间。所以我希望这已经足够了,不管如果需要我会添加更多。先感谢您!
我正在尝试制作一个简单的(单向)链表,我必须自己制作,而不是使用 STL 或任何其他已经制作的动态容器。我做了一个简单的,但我似乎有一个我根本无法解决的问题。
每当我在列表中创建一个新节点时(我总是返回列表的第一个节点以防它被更改,我不使用“哨兵”或“虚拟”节点)新节点是好的,直到我到达一个程序中的某个点,当它自行重置到我介绍的第一个节点时。
为了尽量让我的帖子保持干净,我将插入更少的代码和更多的“功能”或模式,但如果这还不够,我会添加更多。
下面是它的工作原理:
我的节点项目
struct Node { // simplified example
string type; //can be ignored
int ap_nr; // I sort by apartment number
int sum; // can also be ignored
Node *next;
};
在 main 中,我将我的第一个节点初始化为“假”节点(ap_nr = -1,其他 ap_nr 不能为负数)。
int main ()
{
int command = 1; // used for loop
Node *begin; // head of my list
begin = new Node;
begin = create_node(); // initialize
while (command != 0) // This is for work with a "handler", accesses different mechanics of the program, I don't know exactly how to explain in english
{
input_command(command, begin); // reads command, sends result to handler
}
return 0;
}
这是我的输入命令:
void input_command (int &command,Node *begin)
{
cout<<"Option #"; cin>>command;
input_validation (command, begin);
}
我使用 atm 的处理程序的唯一部分:
void input_validation (int command, Node *begin)
{
if (command == 1 trough 15) // pseudo code
execute (command)
}
将一个节点添加到列表后,我使用调试来跟踪它,第一个保持原样,但是第二个节点(我在第一个节点之前添加它并返回新的“开始”),一开始没关系(有一个新的内存位置,new_begin->next = old_begin
但在我退出ìnput_command
结构后它会重置)
*下面是 input_command 结构和程序图:*
主要: - 初始化“假”节点/进入菜单循环 -> 进入 input_command。
UI: -输入命令->读取命令->验证->发送到处理程序。
列表: - 将期望节点添加到“列表”(实际上没有列表本身,只是链接节点)-> 返回第一个节点。第一个节点没问题(有新地址,指向旧节点)
返回 UI:-> 输入命令(小括号)并重置(我的意思是,无论我添加什么节点,它都会成为我添加的第一个节点。假设我介绍了公寓 1 到 10,它只记得“1”)。
我错过了什么吗?我的设计中有逻辑错误吗?您需要更多代码来评估吗?告诉我要添加什么,我意识到这有点模棱两可。
注意:现在我只能在我的主节点之前添加节点,在我使它正常工作之前,我不会专注于任何新的东西,只要我的设计不是问题的一部分,我也不会改变它,但是如果很糟糕,我会很感激笔记和建议。
这是 add_node 函数唯一实现的部分:
Node *add_node (Node *begin,string type, int sum, int ap_nr) // Node begin e primul nod din lista, trebuie mereu plimbat cu toate functiile pe lista
{
// if first node is dummy node
if (begin->ap_nr == -1)
{
begin->type = type;
begin->ap_nr = ap_nr;
begin->sum = sum;
begin->next = 0;
return begin;
}
// else create new node and insert it in sorted position
else
{
// if node should be inserted before first node (begin)
if (ap_nr <begin->ap_nr)
{
Node *cursor;
cursor = new Node;
cursor->ap_nr = ap_nr;
cursor->type = type;
cursor->sum = sum;
cursor->next = begin;
return cursor;
}
}