2014-03-28 45 views
1

我試圖創建一個函數,它接受一個結構,然後將該結構添加到鏈接列表的後面。我已經想出瞭如何添加到前面,但我無法將頭圍繞在後面。添加到鏈表後面C

這是我加入前的功能:

MusicRec * addToFront(MusicRec * theList, MusicRec * toBeAdded) 
{ 
toBeAdded->next = theList; 
theList = toBeAdded; 
return(theList); 
} 

我假設添加到列表中的背面是非常相似這增加了前,我似乎無法得到邏輯下來

+0

不,它不是很相似。你必須通過鏈表才能到達尾部 - 除非你有雙鏈表,這似乎並非如此。 – raina77ow

+0

你的代碼假定'theList'在進入函數時不爲空。是這樣嗎? – Kaz

回答

2

您需要首先遍歷列表的末尾,然後添加新的鏈接,這樣的事情:

MusicRec *addToBack(MusicRec *theList, MusicRec *toBeAdded) 
{ 
    MusicRec *ptr = theList; 
    if (!ptr) return toBeAdded; 
    while (ptr->next) 
     ptr = ptr->next; 
    ptr->next = toBeAdded; 
    return theList; 
} 
+0

當列表爲空時忘記:P'if(!theList)return toBeadded;'這是一個段等待發生! – SGM1

+0

我需要返回一個指向列表頭部的指針。在這種情況下,ptr是指向頭部的指針?我改變了代碼並添加了「if(!theList)return toBeadded;」這是你的意思嗎? – destroted

+0

不要那樣,只是'返回列表';'而不是ptr。在他的帖子中添加了一個編輯,但需要進行審查 – SGM1

1

一些遞歸方法:

樸素,O(n)的堆棧存儲器:

node *add_tail(node *list, node *added) 
{ 
    if (list == NULL) 
    return added; 
    list->next = add_tail(list->next, added); 
    return list; 
} 

包裝加尾遞歸函數(可優化循環):

void add_tail_rec(node **list, node *add) 
{ 
    if (*list == NULL) 
    *list = add; 
    else 
    add_tail_rec(&(*list)->next, add); 
} 

node *add_tail(node *list, node *add) 
{ 
    add_tail_rec(&list, add); 
    return list; 
} 

隨着假頭節點,而不是指針到指針:

void add_tail_rec(node *list, node *add) 
{ 
    if (list->next == NULL) 
    list->next = add; 
    else 
    add_tail_rec(list->next, add); 
} 

node *add_tail(node *list, node *add) 
{ 
    node fake; 
    fake.next = list; 
    add_tail_rec(&fake, add); 
    return fake.next; 
} 

沒有提升到包裝假頭節點或指針到指針,但空試驗的副本:

void add_tail_rec(node *list, node *add) 
{ 
    if (list->next == NULL) 
    list->next = add; 
    else 
    add_tail_rec(list->next, add); 
} 

node *add_tail(node *list, node *add) 
{ 
    if (list == NULL) 
     return add; 
    add_tail_rec(list, add); 
    return list; 
} 

在遞歸函數跟蹤插入位置中帶有額外的上下文參數。用這個技巧,遞歸部分返回一個值:並且該值總是隻有list!包裝可以使用三元表達式來返回addlist(添加了該項目)。

node *add_tail_rec(node *list, node *add, node *where) 
{ 
    return where->next == NULL 
      ? (where->next = add, list) 
      : add_tail_rec(list, add, where->next); 
} 

node *add_tail(node *list, node *add) 
{ 
    return list == NULL ? add : add_tail_rec(list, add, list); 
} 
+0

洛爾完全不是最佳的,但真的很短,我喜歡它。 – SGM1