[英]What is the output of the following program? How do you trace such a program?
我必須確定以下程序的輸出。 答案是BEADC
,但是我不確定如何跟蹤程序。 這是我所知道的:
我們首先聲明一個數據類型為trip
名為road_trip
的結構。 在主程序中,我們為成員place
分配值。 然后創建一個鏈表,其中起始節點為s2
,結束節點為s3
。 因為您可以看到起始節點的地址存儲在單獨的指針ptr
,所以通常將其稱為頭指針。 s3
是鏈表的結尾,因為如果看到s3
您可能會注意到s3
next
是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;
}
printf("%c ", ptr -> place); /*I don't get this line*/ ptr = ptr -> next; /*I don't get this line*/
ptr
是指向trip
的指針(即 struct road_trip
) 。 ->
(“ 結構解除引用運算符”)運算符 答案是“ BEADC”,但我不確定如何跟蹤程序。
s5.next = &s1;
ptr = &s2;
s1.next = &s4;
s3.next = NULL;
s4.next = &s3;
s2.next = &s5;
上面的代碼對跟蹤程序很有用...
這里
ptr
指向s2
和:
s2
next
成員指向s5
s5
next
成員指向s1
s1
next
成員指向s4
s4
next
成員指向s3
s3
next
成員指向NULL
您在問題中給出了正確的解釋
我不明白的是程序如何按順序打印存儲在
s2
(B),s5
(E),s1
(A),s4
(D)和s3
(C)中的值
現在,當您以這種方式使用ptr
進行迭代時:
while (ptr != NULL)
{
printf("%c ", ptr -> place);
ptr = ptr -> next;
}
跟蹤循環:
- 在第一次迭代
B
被打印,因為ptr
指向s2
,因此ptr->place
與s2.place
相同(因此使用Structure取消引用運算符訪問了place
成員的值)
然后ptr = ptr->next
是相同ptr = s2->next
並且因此ptr = &s5
作為s2->next
點至s5
同樣,此循環繼續進行,您將以連接其next
成員的方式獲得輸出
循環在打印s3
之后結束,因為s3->next
指向NULL
,因此在打印s3
之后ptr
變為=NULL
進一步閱讀:
ptr是指向s2的指針,因此顯示char ptr-> place將顯示行程s2的位置。 然后將ptr更改為下一個指針-s2的下一個是s5。 顯示ptr-> place將顯示行程s5的現在位置。 然后,ptr更改為s5的下一個,即s1,直到到達s3(下一個指針為NULL)為止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.