[07a2] 単連結リストのアクセス2

整数の並んだ単連結リストを読み込み、出力する例題が示されている。 最後に、リストの「最後から2番目のセルに入っている値」を出力した い(長さが2未満なら-1を出力)。この値を求めて返する関数funcを作成 せよ。再帰は用いても用いなくてもよい。

#include <stdio.h>
#include <stdlib.h>
struct node { int data; struct node *next; };
typedef struct node *nodep;
nodep rlist(void) {
  int i;
  printf("i> "); scanf("%d", &i);
  if(i == 0) { return NULL; }
  nodep p = (nodep)malloc(sizeof(struct node));
  p->data = i; p->next = rlist(); return p;
}
void plist(nodep p) {
  if(p == NULL) { printf("\n"); return; }
  printf(" %d", p->data); plist(p->next);
}
int main(void) {
  nodep list = rlist();
  plist(list);
  // printf("%d\n", func(list));
  return 0;
}

記号列 

コード 

選択肢

ア int func(nodep p);
イ int func(nodep p) {
ウ int func1(nodep p) {
エ }
オ while(p != NULL) {
カ while(p->next != NULL) {
キ while(p->next->next != NULL) {
ク if(p == NULL) {
ケ if(p->next == NULL) {
コ if(p->next->next == NULL) {
サ return func(p->next);
シ return p->data + func(p->next->next);
ス return p->data + func1(p->next);
セ return p->data;
ソ return s;
タ return -1;
チ return 0;
ツ break;
テ int s = 0;
ト p = p->next->next;
ナ p = p->next;
ニ s = s + p->data;

選択肢の行をドラグして上のコード領域に配置してください。 コード領域の行はドラグにより位置が変更できます。 削除したい場合は選択肢の領域に戻してください。