【问题标题】:C++ assigning a new address to *next in a data structureC++ 为数据结构中的 *next 分配一个新地址
【发布时间】:2012-02-16 22:55:05
【问题描述】:

有些事情我无法理解... 基本上我得到了以下数据结构:

struct node_ll {
    int payload;
    node_ll *next;  //pointer to next node
};

本质上是一堆数字。 我需要创建一个具有以下原型的方法:

int tail_return(node_ll **list)

其中**list是上述数据结构的内存地址。我的实现如下:

int tail_return(node_ll **list) {

    node_ll *temp;
    temp = *list;

    node_ll *prev_temp;
    prev_temp = *list;

    bool firstPass = true;

    while(temp){

        if(firstPass == true){
        temp = temp->next;
        firstPass = false;

        } else {
            temp = temp->next;
            prev_temp = prev_temp->next;

        }
    }

    int toReturn = prev_temp->payload;

    prev_temp->payload = 0;
    (**list).next = prev_temp;

    delete temp;
    delete prev_temp;
    return toReturn;
}

但是我从测试运行中得到以下输出:

List a after head insertion of 2,4,6,8,10 elements:

{10,8,6,4,2}

now removing the last element

DELETED: 2

{10,0} where it's supposed to be: {10,8,6,4}

我做错了什么?显然,该方法找到了要删除的正确值 - 2。但是为什么当我在删除后尝试打印它时,我最终得到 10 和 0?

【问题讨论】:

  • tail return 应该做什么?
  • 想想这行代码做了什么:(**list).next = prev_temp;
  • 您应该使用std::liststd::stack,分别可从<list><stack> 获得。
  • tail_return 查找此堆栈中的最后一个元素,将其返回并删除。例如 - 我有另一个方法 head_return 它返回第一个元素并将其删除,它工作正常。 (**list).next = prev_temp;我的印象是这应该访问 node_ll 中的 *next 并将其设置为 prev_temp 中保存的地址。

标签: c++ pointers data-structures struct


【解决方案1】:
 (**list).next = prev_temp;

应该是

prev_temp->next = 0 ; 

当您执行(**list).next = prev_temp; 时,您正在处理传递给您的方法的参数,而不是链接列表中的最后一个节点。

【讨论】:

    【解决方案2】:

    我假设 tail_return 应该采用 node_ll 的链表并删除尾部元素?

    每个 @Aditya 是的,看起来像

    (**list).next = prev_temp;
    

    线路引起了问题。原因是您正在重新分配列表以指向倒数第二个元素(prev_temp)。

    删除最后一个元素是正确的

    delete temp;
    

    并且还删除该行

    delete prev_temp;
    

    因为这也会删除倒数第二个元素,您想保留它。

    另外,您当前正在返回倒数第二个元素。所以改变

    int toReturn = prev_temp->payload;
    

    int toReturn = temp->payload;
    

    【讨论】:

      【解决方案3】:
      (**list).next = prev_temp;
      

      太复杂了。如果你这样写

      (*list)->next = prev_temp;
      

      现在很清楚(呃)您更改了列表中的 first 元素。

      这只是编写更清晰代码的一个小建议。有关您的问题的解决方案,请参阅其他答案。

      【讨论】:

        猜你喜欢
        • 2012-07-29
        • 2011-04-26
        • 2011-10-28
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多