我必须确定下面程序的输出。答案是B E A D C
,但我不确定如何跟踪程序。这就是我所知道的:
我们首先声明一个名为road_trip
的结构,数据类型为trip
。在主程序中,我们为成员place
分配值。然后创建链接列表,其中起始节点为s2
,结束节点为s3
。因为您可以看到起始节点的地址存储在单独的指针ptr
中,该指针通常称为头指针。 s3
是链接列表的结尾,因为如果您看到s3
,您可能会注意到next
s3
为NULL
。这意味着s3
没有引用任何其他节点。
我不明白的是程序如何打印s2
(B
),s5
(E
),s1
中存储的值(A
),s4
(D
)和s3
(C
)按此顺序排列。我确定它与我之后撰写评论的两行有关。解释会有很大的帮助。
#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;
}
答案 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
,因此s2
与ptr->place
(因此使用 Structure dereference 运算符访问s2.place
成员的值
然后place
与ptr = 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。