2015-04-14 50 views
0
int Count(struct node* head, int searchFor) { 
    struct node* current = head; 
    int count = 0; 

    while (current != NULL) { 
     if (current->data == searchFor) 
      count++; 

     current = current->next; 
    } 

    return count; 
} 

爲什麼需要聲明當前的struct節點?如果我們使用在參數列表中傳遞的head,我們會得到相同的結果。LinkedList:爲什麼需要聲明新的結構節點當前?如果我使用參數頭進行跟蹤,代碼工作得很好嗎?

int Count(struct node* head, int searchFor) { 
    int count = 0; 

    while(head != NULL) { 
     if (head->data == searchFor) { 
      count ++; 
     } 

     head = head->next; 
    } 

    return count; 
} 

這是什麼概念?這只是乾淨的代碼或其他原因?

+1

這都是語義問題:「頭」和「當前」是兩個不同的概念。 – Medinoc

+0

如果您所做的只是步行節點,則不需要額外的'current'。你可以使用值頭指針而沒有問題(如果你想玩的話,指針應該是const struct node * head),沒有理由將一個熱指針傳遞給一個執行簡單隻讀枚舉的函數)。如果需要保存傳入指針值的原始數據(您的算法不會*演示),顯然需要輔助指針。 – WhozCraig

回答

2

當然這是「相同的」,它們在開始時「指向」相同的位置。

struct node* current = head; 

但是,當您將當前項目更改爲下一個時,它們會停止指向相同。

current = current->next; 

在這之後你目前是不一樣的頭了,如果你需要重新啓動你仍然有參考指針頭。

重點是你期望什麼時候讀「頭」,你期望它指向頭項目,對吧?如果你改變它,會讓你的代碼對於最終維護它的其他程序員感到困惑。

如果你不需要在這個函數中使用head(但是在某個地方有一個指向頭的指針總是好的),我建議將你的參數重命名爲current

int Count(struct node* current, int searchFor) { 
    int count = 0; 

    while(current != NULL) { 
     if (current->data == searchFor) { 
      count ++; 
     } 

     current = current->next; 
    } 

    return count; 
} 
+1

但是現在,這是參數名稱,對於調用者沒有任何意義!確實,唯一的好方法是爲兩個不同的概念使用兩個不同的變量。無論如何,優化器會給它們相同的寄存器/內存位置。 – Medinoc

+0

你仍然可以打電話給伯爵,沒什麼大不了的:伯爵(頭,10); – danielfranca

3

它通常做是爲了保持原始值(head)傳遞給函數,因爲current被修改,如果直接修改head你會永久失去原來的指針。但在你的情況下,你是否使用額外的臨時current沒有區別,因爲head不需要Count()

真的是味道的問題。我個人更喜歡使用current版本,因爲我覺得它比「當前」更易讀,而不是直接修改「頭部」。

1

爲你呈現這裏的代碼,只有一個概念背後:使代碼更易讀:)

當你看到頭部改變,那麼你必須要更加關注和肯定的是,代碼是正確的。這需要更多時間來理解代碼。:)

儘管如此,第一個代碼段有一個缺點。變量電流在未使用的代碼塊中聲明。我會按照以下方式編寫代碼:

int Count(const struct node* head, int searchFor) 
{ 
    int count = 0; 

    for (const struct node* current = head; current != NULL; current = current->next) 
    { 
     if (current->data == searchFor) count++; 
    } 

    return count; 
} 
+0

謝謝。不會添加「const struct node * current = head」使當前節點指向一個常量節點。 (即,你不能改變當前的值,對嗎?) – Nikita

相關問題