2013-10-22 51 views
3

我給出了一個名爲「head」的稀疏數組,它是一個具有索引和值的二維數組。因此,像: (3,100)(6200)(8100)如何按升序創建鏈接列表

  1. 我要插入的節點(值,指數)爲以升序此稀疏陣列。所以,如果我給(2 100),列表看起來應該像: (2,100)(3100)(6200)(8100)

同樣的,如果我給(4200),它應該返回 ( 3100)(4200)(6200)(8100)

條件1:如果指數是相同的,那麼我必須添加值

所以,如果我給(3100),那麼我應該返回 (3,200)(6,200)(8,100)

條件2:如果指數相同,且值爲零,則應刪除該值。所以,如果數組(3,-100),我必須回到

(6200)(8100)

Node * List_insert_ascend(Node * head, int value, int index) 
{ 
    Node * node = List_create(value, index); //this creates an empty node, "node" 

    if (index < (head->index)) //node's index is less, e.g. (1,100) 
    {node -> next = head;} //this inserts "node" before "head" 
    if (index == (head->index)) 
    { 
    node = head; 
    head->value = head->value + value; //Condition 1 
    while ((head->value)==0) //Condition 2 
    { 
     Node *p = head->next; 
     head = p; 

    } 
    } 
    return node; 

} 

我的理解是,當我讓頭戴式>旁邊的新掌門人,應該讓擺脫原來的條目。

但0值ed指數繼續保留在列表中。結果是 (3,0)(6200)(8100)

如果有人可以幫我找出我做錯了什麼(甚至爲什麼)我真的很感激它。

+0

在List_insert_ascend方法中,給出了指向列表頭節點的指針。因此,作爲第一步,您實際上必須遍歷列表中的節點以查看哪個節點具有匹配的索引。如果沒有節點具有匹配的索引,則創建一個新節點。如果特定節點確實具有相同的索引,請使用List_insert_ascend中的給定值添加該節點的值。現在檢查結果值是否爲0.如果是,則刪除節點。在整個方法結束時,您應該返回結果列表的頭部,而不是任意節點。 – sufinawaz

回答

1

你的函數應返回頭或節點返回新的頭部要麼**頭參數

頭戴式>指數是一個崩潰當且僅當你沒有頭都

Node * list_insert_update_remove(Node **head, int value, int index) 
{ 
    Node *node = List_create(...); 
    if (*head == NULL) 
    *head = node; 
    else { 
    Node *prev = NULL; 
    Node *list = head; 
    while (list) { 
     if (index < list->index) { //prepend 
     if (prev == NULL) // before head 
      *head = node; 
     else { 
      prev->next = node; // into the middle/end 
      node->next = list; 
     } 
     break; 
     } else if (index == list->index) { 
     //update or remove (execercise) 
     break; 
     } else if (list->next == NULL) { // append at end 
     list->next = node; 
     break; 
     } 
     prev = list; 
     list = list->next; 
    } 
    } 

    return *head; 
} 
2

您的代碼中存在未定義的行爲。

當你

Node *p = head->next; 
head = p; 
free(p); 

你實際上釋放的節點是headp點。然後解除引用head導致未定義的行爲。

但這不是唯一的問題。另一個原因是你實際上並沒有解開你正在釋放的節點。之前的head->next(從重新分配head及其後續釋放之前)指針仍然指向現在的空閒節點。

+0

謝謝,我剛剛擺脫了免費(p)線。但是我仍然沒有看到問題出在哪裏。 – wickedcolor

+0

@ user2826609編輯之後,你不會實際刪除任何節點,只要循環,只要'head-> value == 0'。如果'head-> value'不是零,那麼你只需退出循環並返回列表頭。 –