编辑

为简单起见:我只想做一个最基本的游标,它可以简单地通过我的列表,而不用任何方式/形状或形式改变我的“开始”。我仍然想在我返回某些东西时开始改变,就在此之前。那么是否有可能使一个指针开始,从列表中通过而无需更改任何东西,除非要添加新节点时才在最后?

还可以使用不是“节点”的简单指针浏览列表吗?

/编辑

我有一个简单的(单个)链接列表,作为我的家庭作业的一部分。当然,除此之外,我还有很多事情要做,但是在我摆脱了困境之后,所有事情都应该向前推进,但是当我使用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;
};

最佳答案

指针cursorbegin指向相同的内存位置,因为您明确地说过: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/

10-11 15:32
查看更多