如何使用多個箭頭運算子(->)到達具有 x 個節點的鏈表的最后一個節點?
我很好奇如何在我的代碼中表達 -> 操作 x 次
偽代碼 p (->next)*x
我想讓 p->link->link->..... 我想做 x 次而不使用 p=p->link
uj5u.com熱心網友回復:
您可以使用遞回:
struct List
{
struct List *next;
};
struct List *findLast(struct List *node)
{
if(node -> next) return findLast(node -> next);
return node;
}
struct List *findNth(struct List *node, size_t N)
{
if(N && node -> next) return findLast(node -> next, N - 1)
if(!N) return node;
return NULL;
}
uj5u.com熱心網友回復:
在我看來,您只是想要某種迭代的 next 函式或宏/行內函式,您p=p->next可以在其中封裝。
struct list { struct list *next; };
struct list *iterated_next(struct list *p, int x){
for(int i=0; i<x;i ) p=p->next; return p;
}
我不是要避免p=p->next。這只是記號。如果它被封裝起來,它不會有任何從外部觀察到的影響。
有了以上,請注意,如果您這樣做:
struct list *iterated_next3(struct list *p){
return iterated_next(p,3);
}
在 gcc 和 clang 上進行優化(小迭代計數將使優化編譯器想要行內函式并展開回圈),您將得到 (x86_64):
iterated_next3:
movq (%rdi), %rax
movq (%rax), %rax
movq (%rax), %rax
ret
這與您從(https://gcc.godbolt.org/z/zM684oxex)獲得的完全相同:
struct list *iterated_next3_(struct list *p){
return p->next->next->next;
}
,強調堅持“否”p=p->next并不是一個非常合理的要求。
當然,您可以使用基于遞回的iterated_next而無需拼寫來實作相同的效果p=p->next(請參閱0_______的答案),但這是尾遞回,無論如何它都希望優化為有效的 while 回圈,所以我' d 堅持p=p->next回圈,因為我發現它更能描述演算法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322575.html
上一篇:在c中獲取鏈接指向的檔案的名稱
