编辑 我也不介意知道这是不是太模糊,你不能理解和/或发现什么是错的,我知道它是与代码没有直接关系,因为当我即将退出函数时,更改就会发生...而不是在实际的“代码”期间。所以我希望这已经足够了,不管我是否需要增加更多。提前谢谢!
我正在尝试创建一个简单的(单向)链表,我必须自己制作,而不是使用STL或任何其他已经制作的动态容器。我做了一个简单的但我似乎有一个问题,我根本无法绕过头。
每当我在列表中创建一个新节点时(我总是返回列表的第一个节点,以防它被更改,我不使用“sentinel”或“dummy”节点)新节点是好的,直到当程序将其全部重置为我引入的第一个节点时,我在程序中达到了某个点。
为了尽量保持我的帖子干净,我会插入更少的代码和更多的“功能”或模式,但如果还不够,我会添加更多。
以下是它的工作原理:
我的节点项目
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)
}
在我向列表中添加一个节点之后,我使用debug来跟踪它,第一个保持原样,然后是第二个节点(我在第一个节点之前添加它并返回新的“begin”),at首先它没问题(有一个新的内存位置和new_begin->next = old_begin
但是在我退出ìnput_command
结构后它重置了)
* 这是input_command结构和程序图:*
主要 - 初始化'假'节点/进入菜单循环 - &gt;转到input_command。
用户界面 - 输入命令 - &gt;读命令 - &gt;验证 - &gt;发送给处理程序。
列表: - 将欲望节点添加到“列表”(实际上没有列表本身,只是链接节点) - &gt;返回第一个节点。 第一个节点没问题(有新地址,指向旧节点)
返回UI: - &gt;输入命令(下括号)和 重置 (我的意思是无论我添加什么节点,它都成为我添加的第一个节点。所以我想说我介绍一下公寓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;
}
}
答案 0 :(得分:3)
正如RStrad所说,你遇到的问题是你想修改一个函数中的指针,并且那些修改仍然存在于那个函数之外。
在C / C ++中,所有内容都是按值传递的。如果你想要一个函数来改变某些东西,你需要传递一个指向某事的指针。因此,在您想要更改指针的情况下,您需要将指针传递给该指针,如下所示:
*Node begin;
input_command(command, &begin);
// the pointer itself has an address, which you are sending with &
input_command()
的定义将是:
void input_command (int &command, Node **begin)
// observe here the pointer to your pointer
从input_command()
内部,您对input_validation
的呼叫必须是:
input_validation (command, &(*begin));
// the address of the pointer towards which **begin points
input_validation()
的定义将是:
void input_validation (int command, Node **begin)
...并且任何进一步的调用,比如说实际添加节点的函数,将继续遵循这种格式。简而言之,如果你有一个指针*P
,并且你想在一个函数中修改它,你需要发送它的地址&P
。该函数将接收指向指针**P
的指针,并且必须使用&(*P)
进行任何其他包含P地址的调用。
答案 1 :(得分:1)
我真的需要看到在列表代码中添加一个节点。根据您在当前头部之前添加节点所描述的内容,问题是begin仅在本地范围内被修改,并且不会从input_command传回(即通过引用传递或按值传递)