2011-01-23 56 views
0

這裏跟蹤是一個鏈接列表,其中的plist指向包含鑑於下面的代碼值3通過鏈表代碼

pList 
    | 
    3  7  6  1  2  8  4  5 ->  NULL 

節點,則執行下面的代碼後重繪顯示變化到列表中的列表。

pCur = pList; 
while(pCur->next->next != NULL) 
    pCur = pCur->next; 
pCur->next->next = pList; 
pList = pCur -> next; 
pCur -> next = NULL; 
pCur = NULL; 

這裏是我發生了什麼事的解釋: pCur =的plist(pCur =的plist) | 3 7 6 1 2 8 4 5 - > NULL

pList pCur (pCur = pCur->next) 
    |  | 
    3  7  6  1  2  8  4  5 ->  NULL 

     pCur   PList (pCur->next->next = pList) 
      |    | 
    3  7  6  1  2  8  4  5 ->  NULL 

     pCur pList  (pList = pCur->next) 
      |  | 
    3  7  6  1  2  8  4  5 ->  NULL 


        (pCur->next = NULL) 
    3  7  6  1  2  8 -> NULL 

我不相信這是正確的。我究竟做錯了什麼?

+1

我不知道這是否正確。如果你不相信它是正確的,你可以在調試器中逐步完成,看看它實際做了什麼。 – 2011-01-23 18:20:27

回答

2

什麼它實際上是這樣的:

我們先從以下內容:

pCur = pList (pCur = pList) 
    | 
    3  7  6  1  2  8  4  5 ->  NULL 

我們再往前pCur一個向前而pCur-> next-> next!= NULL,所以我們以

pList           pCur 
    |            | 
    3  7  6  1  2  8  4  5 ->  NULL 

然後我們附上列表的頭到尾

pList           pCur   pList (again) 
    |            |    | 
    3  7  6  1  2  8  4  5  3  7 .... 

這給了我們一個無限循環鏈表。

我們再往前的plist指向pCur->下一

           pCur pList  
                |  |  
    3  7  6  1  2  8  4  5  3  7 .... 

如果我們繼續這樣了,這樣的plist是第一個(這是我們可以做的,因爲它是無限循環):

pList             pCur pList (again) 
    |              |  | 
    5  3  7  6  1  2  8  4  5  3  7 .... 

我們最後說,接下來pCur爲NULL,給我們:

pList             pCur 
    |              |  
    5  3  7  6  1  2  8  4 ->  NULL 

正如你所看到的,這樣做是移動拉斯維加斯t元素列表的前面。

+0

謝謝!這很有道理 – kachilous 2011-01-23 18:50:35

0

您正在省略鏈接,因此無法顯示pCur->next = NULL的效果。另外,pCur->next->next = pListpCur,而不是pList

這是很容易使這些繪圖編程:

void print_list(Link const *pCur, Link const *pList) 
{ 
    Link const *p; 

    printf("pCur -> "); 
    for (p = pCur; p != NULL && p != pList; p = p->next) 
     printf("%d -> ", p->data); 
    puts(p == NULL ? "NULL" : "pList"); 

    printf("pList -> "); 
    for (p = pList; p != NULL && p != pCur; p = p->next) 
     printf("%d -> ", p->data); 
    puts(p == NULL ? "NULL" : "pCur"); 
}