编辑
为简单起见:我只想做一个最基本的游标,它可以简单地通过我的列表,而不用任何方式/形状或形式改变我的“开始”。我仍然想在我返回某些东西时开始改变,就在此之前。那么是否有可能使一个指针开始,从列表中通过而无需更改任何东西,除非要添加新节点时才在最后?
还可以使用不是“节点”的简单指针浏览列表吗?
/编辑
我有一个简单的(单个)链接列表,作为我的家庭作业的一部分。当然,除此之外,我还有很多事情要做,但是在我摆脱了困境之后,所有事情都应该向前推进,但是当我使用C ++一段时间(是borland C ++)时,我做了很多事情知道是被遗忘了一半还是过时了。我已经用python编程了一段时间,但这意味着我对C ++中的指针工作方式感到沮丧。
我的问题是,当我尝试向列表中添加新的Node时,我的光标的行为异常,我将在下面进行解释:
编辑:好的,我更改了:
Node *cursor;
cursor = new Node
cursor = begin;
惨败,但结果是相同的,在声明游标之后并开始将它们都指向相同的内存位置(类似:0x32ce8)。
/编辑
Node *add_node (Node *begin,string type, int sum, int ap_nr) // begin is the first node in the list
{
// 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
{
// EDIT:
Node *cursor = begin; // Same problem
//if node should be inserted before first node (begin)
if (ap_nr <begin->ap_nr)
{
cursor->ap_nr = ap_nr;
cursor->type = type;
cursor->sum = sum;
cursor->next = begin;
return cursor;
}
总是在调试时,begin具有类似的形式:0x32ce02,在创建“游标”时,它具有截然不同的形式(也更长),但是当我这样做时:cursor = begin,那么游标就变成了类似0x32df02的形式。
但是问题是当我到达“ if(ap_nr ap_nr)”时,由于绝对没有可行的原因,光标变为:0x32ce02和“ cursor-> next = begin”确保了无限循环。而且无论我添加多少节点,这种情况总是会发生,因此每当我打印列表时,它都是最后添加的Node的无限流。
难道我做错了什么 ?是声明还是分配,创建?什么东西?
另外,如果我在另一个模块中某处的指针*开始,并且使用此函数,我将返回一个新的begin ...应该可以,对吗?
附言我还希望有一个简单的解决方案(如果我的方法不好,可以使用另一种方法)
我还要指出我是如何列出清单的。这只是节点的简单链接:
struct Node {
string type;
int ap_nr;
int sum;
Node *next;
};
最佳答案
指针cursor
和begin
指向相同的内存位置,因为您明确地说过:Node* cursor = begin;
字面意思是“创建一个名为cursor
的指针变量,该变量指向与begin
相同的位置。”因此,这样做确实不足为奇。
编辑:删除了基于错误猜测的建议,代码打算做什么,并将其更改为更适用的建议
从注释中,我现在了解到,您想在某个位置插入一个节点,以使字段ap_nr
在结果列表中不断增加,并假设它最初是在不断增加(如果仍然不正确,请清楚说明您的内容)想要)。
对于这种情况,cursor
的初始化现在当然是正确的。但是,修改对象cursor
指向的对象是不正确的:您要在该节点之前插入一个新节点。但是为此,您必须进行一些更改:
首先,您需要另一个指针变量,该变量包含一个指向新创建的节点的指针,例如
Node* new_node = new Node;
然后,您必须将该节点插入列表。也就是说,您必须使用
cursor->ap_nr=ap_nr;
等,而不是new_node->ap_nr=ap_nr;
等。此外,其后的节点当然不是列表的第一个节点(由first
指向),而是您刚刚找到的节点(由current
指向)。但是,现在有一个问题:您必须将该新节点插入列表,这意味着您必须修改前一个节点的
next
指针(但不要指向begin
,而是指向新创建的节点) !)。但是您再也没有指向上一个节点的指针,因为您的列表是单链接的,也就是说,您没有从找到的元素到上一个元素的指针。但是要插入元素,必须更改next
。但是,您所拥有的是指向下一个节点的指针。因此,更好的策略是让您的
cursor
指向上一个节点,然后始终使用cursor->next
而不是cursor
(当然,移动cursor
时除外)。这样,您可以在设置new_node->next
之后编写cursor->next = new_node;
您的代码中缺少的其他内容包括检查
current
是否不为null(它将在列表的末尾)以及该代码使您的cursor
向前移动(属于您的else
部分)内部if
)。实际上,我现在注意到您的块没有关闭,因此前进代码可能在您的实际代码中。
最后,一些一般性建议:如果对函数的代码进行模块化,则可能会更轻松地编写该代码:让一个函数在给定节点之后插入新节点(仅更改
next
指针,然后返回指向新插入的代码的指针),具有另一个函数以查找应在其后插入新节点的节点,并使函数add_node
仅调用那些其他函数。这样,在每个功能中,您都可以专注于其中一个子问题。关于c++ - 链表中的游标无明显原因改变值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9954304/