Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;为数据结构中的下一个*分配新地址_C++_Pointers_Data Structures_Struct - Fatal编程技术网

C++ C++;为数据结构中的下一个*分配新地址

C++ C++;为数据结构中的下一个*分配新地址,c++,pointers,data-structures,struct,C++,Pointers,Data Structures,Struct,有件事我想不通。。。 基本上,我得到了以下数据结构: struct node_ll { int payload; node_ll *next; //pointer to next node }; 这本质上是一堆数字。 我需要创建一个具有以下原型的方法: int tail_return(node_ll **list) 其中,**列表是上述数据结构的内存地址。我的执行情况如下: int tail_return(node_ll **list) { node_ll *te

有件事我想不通。。。 基本上,我得到了以下数据结构:

struct node_ll {
    int payload;
    node_ll *next;  //pointer to next node
};
这本质上是一堆数字。 我需要创建一个具有以下原型的方法:

int tail_return(node_ll **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

 (**list).next = prev_temp;
应该是

prev_temp->next = 0 ; 

当您执行
(**列表)时。下一步=上一步您正在操作传递给方法的参数,而不是链接列表中的最后一个节点。

我假设tail\u return应该获取节点的链接列表并删除tail元素

是的,per@Aditya,看起来像

(**list).next = prev_temp;
线路出现问题。原因是您正在重新分配列表以指向倒数第二个元素(prev_temp)

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

delete temp;
并拆下管路

delete prev_temp;
因为这也会删除倒数第二个元素,您希望保留它

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

int toReturn = prev_temp->payload;

这太复杂了。如果你这样写的话

(*list)->next = prev_temp;
现在很清楚(er)您更改了列表中的第一个元素


这只是编写更清晰代码的一个小建议。查看其他答案以了解问题的解决方案。

tail
return应该做什么?想想这行代码的作用:
(**列表)。next=prev\u temp
您应该使用
std::list
std::stack
,分别可从
获得。tail\u return查找此堆栈中的最后一个元素,返回并删除它。例如,我有另一个方法head_return,它返回第一个元素并将其删除,效果很好。(**列表)。下一个=上一个温度;我认为这应该访问节点ll中的*下一个,并将其设置为prev_temp中保存的地址。
(**list).next = prev_temp;
(*list)->next = prev_temp;