以下程序的输出是什么?你如何追踪这样的程序?

时间:2016-07-03 22:46:54

标签: c linked-list structure

我必须确定下面程序的输出。答案是B E A D C,但我不确定如何跟踪程序。这就是我所知道的:

我们首先声明一个名为road_trip的结构,数据类型为trip。在主程序中,我们为成员place分配值。然后创建链接列表,其中起始节点为s2,结束节点为s3。因为您可以看到起始节点的地址存储在单独的指针ptr中,该指针通常称为头指针。 s3是链接列表的结尾,因为如果您看到s3,您可能会注意到next s3NULL。这意味着s3没有引用任何其他节点。

我不明白的是程序如何打印s2B),s5E),s1中存储的值(A),s4D)和s3C)按此顺序排列。我确定它与我之后撰写评论的两行有关。解释会有很大的帮助。

#include <stdio.h>

typedef struct road_trip
{
    char place;
    struct road_trip* next;
}trip;

int main (void)
{
    trip s1, s2, s3, s4, s5, s6;
    trip *ptr;

    s1.place = 'A';
    s2.place = 'B';
    s3.place = 'C';
    s4.place = 'D';
    s5.place = 'E';

    s5.next = &s1;
    ptr = &s2;
    s1.next = &s4;
    s3.next = NULL;
    s4.next = &s3;
    s2.next = &s5;

    while (ptr != NULL)
    {
        printf("%c ", ptr -> place);    /*I don't get this line*/
        ptr = ptr -> next;    /*I don't get this line*/
    }
    return 0;
}

2 个答案:

答案 0 :(得分:2)

printf("%c ", ptr -> place);    /*I don't get this line*/
ptr = ptr -> next;    /*I don't get this line*/
  • 此处,ptr是指向trip (即 struct road_trip 的指针。
  • 如果要使用指针访问结构的成员,则使用-> Structure dereference 运算符)运算符
  

答案是&#34; B E A D C&#34;,但我不确定如何追踪该计划。

s5.next = &s1;
ptr = &s2;
s1.next = &s4;
s3.next = NULL;
s4.next = &s3;
s2.next = &s5;

上面的代码部分对跟踪程序非常有用......

这里

  • ptr指向s2

  • next s2成员指向s5
  • next s5成员指向s1
  • next s1成员指向s4
  • next s4成员指向s3
  • next s3成员指向NULL

您在问题中给出了正确的解释

  

我不明白的是程序如何打印s2(B),s5(E),s1(A),{{}中存储的值1}}(D)和s4(C)的顺序

现在,当您以这种方式使用s3进行迭代时:

ptr

跟踪循环:

  
      
  • 第一次迭代 while (ptr != NULL) { printf("%c ", ptr -> place); ptr = ptr -> next; } 上打印,因为B指向ptr,因此s2ptr->place (因此使用 Structure dereference 运算符访问s2.place成员的值
  •   
  • 然后placeptr = ptr->next相同,因此ptr = s2->next ptr = &s5指向s2->next

  • 同样,此循环继续,您以s5成员的连接方式获得输出

  • 在打印next后,循环结束,因为s3指向s3->next,因此NULL在打印ptr后变为=NULL < / p>

进一步阅读:

  • 这是 linked lists 的典型实现(点击了解详情)

  • 这种类型的列表,其中一个结构成员指向列表的下一个结构称为 singly linked list (点击了解更多)

答案 1 :(得分:0)

ptr是指向s2的指针,因此显示char ptr-&gt; place将显示行程s2的位置。然后ptr被改为下一个指针 - s2的下一个是s5。显示ptr - &gt;地方将显示现在的旅行地点s5。然后ptr改为s5的下一个,即s1,直到它到达s3,下一个指针为NULL。