-1

我需要一些关于移动列表头的帮助..
这是我的教授方法,它有效,但我无法理解这一点。我认为每次调用都会更改列表头,但在实践中它会移动并指向最后一个元素..对此有什么帮助吗?多谢

    void reverserecv2(pt* listhead){
       pt curr=*listhead,suiv;
       if(curr && curr->next){
         suiv=curr->next;
         reverse(&(curr->next));
         suiv->next=curr;
        *listhead=curr->next;
         suiv->next->next=NULL;
        }
      }
   // my  structure : 

         typedef struct node{
            int data;
            struct node* next;
            }node;
            typedef node* pt ;
4

1 回答 1

0

如果您打印出一些数据,它可能会帮助您了解它在做什么;分配 *listhead 的位置,放入以下行:

printf(“*(%p) = %p\n”, listhead, curr->next);

我做了一个 len 4 列表:

*(0x79628344) = 0x79628320
*(0x79628354) = 0x79628320
*(0x79628364) = 0x79628320
*(0xbff92bd0) = 0x79628320

我们看到的是 listhead 本身有几个不同的值;当我们查看递归调用时,这是有道理的。每次使用next作为列表头调用它,以便更新每个节点。您可以从我那里看到,与其余地址不连续的地址是最终列表头所在的堆栈地址。

于 2019-05-30T23:19:30.370 回答