2013-09-27 120 views
0

大家好,我是C的新手,並試圖學習它。我有一個關於這個鏈表實現,我發現在很多地方的簡單查詢:這是一個很好的習慣嗎?

void addNode(node **listhead, int data, int pos){ 
     if(pos<=0 || pos > length(*listhead)+1){ 
       printf("Invalid position provided, there are currently %d nodes in the list \n", length(*listhead)); 
       return; 
     }else{ 
       node *current = *listhead; 
       node *newNode = (node*)malloc(sizeof(node)); 
       if(newNode == NULL){ 
         printf("Memory allocation error\n"); 
         return; 
       } 
       newNode->data = data; 
       newNode->next = NULL; 
       if (current == NULL){ 
         *listhead = newNode; 
         return; 
       }else{ 
         int i = 0; 
         while(current->next != NULL && i < pos-1){ 
           ++i; 
           current = current->next; 
         } 
         if(current->next == NULL){ 
           current->next = newNode; 
         } 
         if(i == pos-1){ 
           newNode->next = current->next; 
           current->next = newNode; 
         } 
       } 
     } 
} 




int main(){ 
     node *head = NULL; 
     node **headref = &head; 
     addNode(headref, 1, 1); 
     addNode(headref, 2, 2); 
     addNode(headref, 3, 3); 
     printList(head); 
     return 0; 
    } 

我的查詢是我們在這裏創建一個指向它指向NULL指針。此代碼有效,但我想知道這是否是一種好的做法。如果不是,我應該如何創建頭指針並將其引用傳遞給addNode函數。

+3

這不是一個鏈接列表實現。這是一個鏈表的用法。並且使用NULL指針沒有問題(它們出於某種原因在語言中),但是如果沒有更多的上下文和實際的**相關**代碼,很難分辨出所有這些都在做什麼。 – 2013-09-27 04:41:06

+1

如果你不喜歡'headref',你也可以使用'addNode(&head,1,1)'。一般來說,這個代碼並沒有一個特定的壞習慣。 –

+1

我也用addNode函數更新了代碼。感謝回覆,我想我明白了,只是對指針有愚蠢的擔心。再次感謝。 – user1772218

回答

2

建議的替代:

int main() { 
    node *head = addNode(NULL, 1, 1); 
    node *current = head; 
    current = addNode(current, 2, 2); 
    current = addNode(current, 3, 3); 
    printList(head); 
    return 0; 
} 

換句話說:

1)ADDNODE()成爲一個函數,它的電流值作爲參數(因此它不必須遍歷整個列表只是添加一個新元素)...

2)...並且它返回一個指向新節點的指針。

3)這意味着在程序ANY點後可以任何訪問a)該列表頭部,b)將前一指針的(前「添加」)和/或c)的下一個指針(加)。

+0

假設addNode被重寫爲返回添加的節點而不是作爲一個外部參數? – WhozCraig

+1

這是我從未想過的事情。感謝上帝,我問。這是非常好的實現。 – user1772218

+1

@ user1772218這是一個完全不同於你的設計。你的目的是爲了獲得一個列表頭,並將一個節點插入一個特定的位置(把它看作一個序號索引)。這不,位置參數是無用的,除非用作'當前'節點的*相對*偏移量。 – WhozCraig

0

我們通過一個雙指針addNode()來處理需要更新headref指針的情況。對於這種情況,使用「addNode(headref,1,1);」,addNode很可能會將頭中的addNode()內的malloced元素的地址存儲在headref中。如果您要將headref作爲指針傳遞,那麼在調用headref將繼續指向main中的地址之後,您將丟失malloced地址。

0

對於單鏈表,它實際上是一個很好的做法,它簡化了addNode的實現。 我想addNode(node_x, 1, 1)的呼叫會在node_x之前添加一個節點。如果只傳遞指向node_x的指針。然後該函數將需要循環遍歷整個列表並找到node_x之前的節點,並修改其指向新構造節點的指針。而如果你傳遞一個指向指針的指針,比如說node** p那麼這個函數只需要將新節點的地址分配給*p即可。

相關問題