数値の並びを連結リスト(linked list)構造で表現し、その合計を求めるプログラムを作りました。プログラム中にwhile
ループが1つありますが、これをfor
ループで置き換えたいと考えています。

どう書き直せばいいか、分かりますか?
main.c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int value;
struct ListNode *pNext;
} ListNode;
int SumListValues(const ListNode *pNode) {
const ListNode *p = pNode;
int sum = 0;
while (p) {
sum += p->value;
p = p->pNext;
}
return sum;
}
int main(void) {
ListNode node4 = { 40, 0 };
ListNode node3 = { 30, &node4 };
ListNode node2 = { 20, &node3 };
ListNode node1 = { 10, &node2 };
printf("Sum: %d\n", SumListValues(&node1));
return EXIT_SUCCESS;
}
実行結果
Sum: 100

ここまでいろいろな問題を出してきたけど……

はい。

目的が同じプログラムでも、書き方は1つじゃないっていうことは分かったかしら?

もちろん!正解はいくつもあるってことですよね。

そのとおり!今回は、それをそのまま問題にしてみたわ。

えっと。つまり、別の正解を考えるってことですか?

そういうこと!……まず、連結リストは分かる?

たしか、「数珠つなぎ」になってるデータ構造だったと思います。

そうね。一つ一つの「数珠」にあたる部分を「ノード(node)」というのだけど……

あ、はい。プログラム中にありますね。

ここにノードが4つあって、それぞれに数値が入ってる……
ListNode node4 = { 40, 0 };
ListNode node3 = { 30, &node4 };
ListNode node2 = { 20, &node3 };
ListNode node1 = { 10, &node2 };

10
、20
、30
、40
っていう数値の並びになっているわね。

それって、
node1
、node2
、node3
、node4
の順番でつながってるってことですか?

そうよ。ノードの構造体を見れば分かると思うけど。

構造体は……これか。
typedef struct ListNode {
int value;
struct ListNode *pNext;
} ListNode;

数値を
value
に格納しつつ、pNext
がポインタだから、これで次のノードにつながるんですね!

うん。そうやってできる「数珠つなぎ」が、連結リスト構造ね。

なるほど〜!

さてさて。ここまで分かったら、問題にとりかかれるんじゃないかしら?

おっと、そうでした。

while
が使われているのは、この関数か……
int SumListValues(const ListNode *pNode) {
const ListNode *p = pNode;
int sum = 0;
while (p) {
sum += p->value;
p = p->pNext;
}
return sum;
}

このループをよく見て、
for
で書く場合の正解を考えてみてね。

はーい。やってみます!

ループの条件になっている変数に注目してみましょう!