[07b1] 単連結リストの間欠削除

整数の並んだ単連結リストを読み込み、出力する例題が示されている。 この読み込みと出力の間に「元のリストの偶数番目のセルのみから成る リストを得る関数func」の呼び出しを挿入したい(現在は呼び出しはコ メントになっている)。関数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();
//list = func(list);
  plist(list);
  return 0;
}

記号列 

コード 

選択肢

ア nodep func(nodep p) {
イ }
ウ if(p == NULL) {
エ if(p->next == NULL) {
オ nodep q;
カ p = p->next;
キ q = p->next;
ク p->next = func(p->next);
ケ p->next = func(q->next);
コ q->next = p;
サ q->next = p->next;
シ return p;
ス return q;
セ return NULL;

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