-2

我有一个链接列表。在调用函数中,我创建了第一个节点,并将第一个节点的指针传递给函数以进行进一步处理。附加节点是在该函数中创建的。但是由于某种原因,在函数的处理过程中,必须删除第一个节点。所以在处理函数中,将链表的第一个节点地址更改为下一个节点。但是当返回调用函数时,这种变化不会反映在调用函数中。在调用函数中,链表的第一个节点还是被删除的第一个节点,如何更新?

内部调用函数:

model_list *allmodelroot;

allmodelroot =  new model_list;
allmodelroot->next = NULL;
allmodelroot->modelIndex = -1;  
processfunction(bmodelroot, wmodelroot, settings, featurePts, allmodelroot);

内部进程函数;

int processfunction(model_list *bmodelroot, model_list *wmodelroot, set_setting &settings, calib_features &featurePts, model_list *allmodelroot)
{
    model_list *first_allmodelroot = allmodelroot;  


    model_list *previous = allmodelroot;
   for(i = 0; i < allmodelrootSize; i++)
   {

       if(usemodel[i] == false)
       {
               //delete the first node
               first_allmodelroot = allmodelroot->next;
               previous = allmodelroot->next;
               delete allmodelroot;
               allmodelroot = previous;



       }else{
          previous = allmodelroot;
          allmodelroot = allmodelroot->next;
       }

   }

   allmodelroot = first_allmodelroot;   

}
4

2 回答 2

1

向代码传递一个表示链表本身的结构,而不是指向链表中第一个节点的指针。如果您没有这样的结构,我会说这是您的代码中的一个很大的缺陷。

于 2013-11-08T04:09:06.107 回答
1

您应该充分了解指针。
简而言之:指针本身在内存中有一个地址,但它的值是其他变量的地址。

#include <stdio.h>
void pointer_test(char *p) {
    printf("p addr \t:%d\n", (int)p);
    p = p + 1;
    printf("p addr \t:%d\n", (int)p);
}
int main() {
    char buf[3] = {'a', 'b', 'c'};
    printf("buf addr\t:%d\n", (int) buf);
    printf("buf[0] addr\t:%d\n", (int) &buf[0]);
    printf("buf[1] addr\t:%d\n", (int) &buf[1]);
    printf("buf[2] addr\t:%d\n", (int) &buf[2]);
    pointer_test(buf);
    printf("buf addr\t:%d\n", (int) buf);
    printf("buf[0] addr\t:%d\n", (int) &buf[0]);
    printf("buf[1] addr\t:%d\n", (int) &buf[1]);
    printf("buf[2] addr\t:%d\n", (int) &buf[2]);
    return 0;
}

在上面的例子中,p 的值是 buf 的地址,p 的地址在堆栈中或者只是一个寄存器。
buf 的地址被复制到函数 pointer_test 作为 p 的值。
在这种情况下,更改 p 的值不会影响 buf。
上述代码的输出可能如下所示:

buf addr        :2686736
buf[0] addr     :2686736
buf[1] addr     :2686737
buf[2] addr     :2686738
p addr  :2686736
p addr  :2686737
buf addr        :2686736
buf[0] addr     :2686736
buf[1] addr     :2686737
buf[2] addr     :2686738

对于您的情况,如果要修改 allmodelroot 的值,model_list **allmodelroot应该使用,这意味着传递指针 allmodelroot 的地址。一旦得到指针 allmodelroot 的原始地址,就可以在函数内部更改指针 allmdelroot 的值。

于 2013-11-08T04:36:58.297 回答