[08a1] 双連結リストの操作1

整数をデータとする頭つき双連結環状リストを定義し、リストを「9」 だけを含むように初期化し、内容を打ち出す例題が示されている。この 初期化と打ち出しの間に、複数の整数を入力し(0で終了)、そのデータ を持つセルを「渡されたセルの前に入力された順で挿入し」、かつ「渡 されたセルの次に入力された逆順で挿入する」(つまり入力1つについて 2つずつセルを新規作成する)関数funcを挿入したい。パラメタには「9」 のセルを渡す(例示では呼び出しはコメントになっている)。たとえば、 「1 2 3 0」を入力したとき、環状リスト全体は「1 2 3 9 3 2 1」とな る。関数funcを作成せよ。再帰および配列は用いないこと。

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
struct node { int data; struct node *prev, *next; };
typedef struct node *nodep;
nodep newnode(int d, nodep p, nodep q) {
  nodep r = (nodep)malloc(sizeof(struct node));
  r->data = d; r->prev = p; r->next = q; return r;
}
void plist(nodep p) {
  nodep q = p->next;
  while(q != p) {
    printf(" %d", q->data); q = q->next;
  }
  printf("\n");
}
int main(void) {
  nodep head = newnode(-1, NULL, NULL);
  nodep p = newnode(9, head, head);
  head->prev = head->next = p;
  // func(p);
  plist(head);
  return 0;
}