2011-02-07 130 views
0

誰能告訴我爲什麼替換功能不起作用?說主叫replace(1,2,列表)。它應搜索節點,如果節點的值爲1,則應創建一個值爲2的新節點來替換它,然後釋放分配給第一個節點的內存。我無法弄清楚=(c - 替換鏈表功能

typedef struct iNode 
{ 
    int myInt; 
    struct iNode* next; 
} IntNode, *IntNodePtr; 

IntNodePtr insert(int i, IntNodePtr p) 
{ 
    IntNodePtr newp = malloc(sizeof(struct iNode)); 
    newp->myInt = i; 
    newp->next = p; 
    return newp; 
} 

IntNodePtr delete(int i, IntNodePtr p) 
{ 
    /* End of list check */ 
    if(p == NULL) 
     return NULL; 

    /* Check if current node is the one to delete */ 
    if(p->myInt == i) 
    { 
     IntNodePtr temp; 
     temp = p->next; 

     free(p); 
     return temp; 
    } 

    p->next = delete(i, p->next); 
    return p; 
} 

IntNodePtr replace(int i, int j, IntNodePtr p) 
{ 
    if(p == NULL) 
     return NULL; 

    if(p->myInt == i) 
     insert(j, p->next); 

    free(p); 

    p->next = replace(i, j, p->next); 
    return p; 
} 
+0

請注意,您將始終需要將列表中的第一個鏈接傳遞給您的`replace`函數。否則,你會最終打破名單。這也適用於2到3個答案。我知道這可能是假設的,但... – JimR 2011-02-07 03:26:18

回答

0

有幾個問題你replace()功能(它看起來罰款我在你的最後一個問題)。

  1. 你叫insert()當你發現有i的節點,但你什麼都不做與新節點(什麼insert()回報)。基本上你要插入的新節點是新p所以你應該設置p它。

  2. 您可以免費使用p並立即嘗試將pnext字段設置爲值。 p指向的位置無效,因此您不應該這樣做。您應該使用一個臨時變量來保存舊的p,以便以後可以釋放該變量。只有在實際取代它時才應該這樣做,因此它應該是以前的條件的一部分。

我認爲應該覆蓋它。基本上變化是:

/* if the current node contains the int I'm looking for... */ 
if(p->myInt == i) 
{ /* ... the current node needs to be replaced */ 
    /* save the current node to delete later (2) */ 
    IntNodePtr oldNode = p; 

    /* insert a new node making it the new current node (1) */ 
    p = insert(j, oldNode->next); 

    /* free the old node (2) */ 
    free(oldNode); 
} 
/* and so on */ 
+0

你能編輯代碼併發布它嗎?即時通訊完全困惑和沮喪與這東西,仍然不理解它。我也喜歡我的舊功能,但功能必須是不變的,而我的舊功能是可變的。 – mikecavs 2011-02-07 03:10:26

0

正如馬克指出,你free(p)是未定義行爲。因此,下一個語句

p->next = replace(i, j, p->next); 

變爲無效,因爲您要分配給p->next的指針值,但p->next存儲位置本身沒有定義。

但是,爲什麼你讓這個替換函數遞歸?一個簡單的while循環就足夠了。

IntNodePtr replace(int i, int j, IntNodePtr p) { 
    if(p == NULL) 
     return NULL; 
    IntNodePtr prevPtr = NULL; 
    while(p){ 
     if(p->myInt == i){ 
      IntNodePtr temp = insert(j, p->next); 
      if(prevPtr) 
       prevPtr->next = temp; 
      free(p); 
      break; 
     } 
     prevPtr = p; 
     p = p->next; 
    } 
} 

並且使用的是不正確的插入功能爲好,因爲你沒有連接上一個節點到新創建的節點。