跟踪链接列表代码

时间:2011-01-23 18:15:29

标签: c linked-list

这是一个链表,其中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

我不相信这是正确的。我做错了什么?

2 个答案:

答案 0 :(得分: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-> gt; next

                                                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

正如您所看到的,这样做的目的是将列表的最后一个元素移到前面。

答案 1 :(得分:0)

您省略了这些链接,因此无法显示pCur->next = NULL的效果。此外,pCur->next->next = pList设置pCur,而非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");
}