2011-01-23 94 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"); 
}