第32回
データ構造(11)~構造体を前後に移動できる双方向リンク

双方向リンクの仕組み~構造体の生成

処理の仕組みを紹介しておきましょう。双方向リンクでは、「次」だけではなく「1つ前」の構造体へのポインタも保存しなければならないので、構造体を生成して配列の各要素の値をメンバに格納する処理が複雑になります。

最初だけの処理

forループの中では、カウンタ変数iが0のときだけ──先頭の値を格納するときだけ──「1つ前」を指すメンバprevにNULLを代入します。
  for (i=0; i<5; i++) {
    if (i==0) {
      p = malloc(sizeof(result));
      start = p;
      p->prev = NULL; -------- 1つ前にNULLを代入

2番目以降の処理

それ以外の──2番目以降の要素の値を格納する──ときには、まず「次」を指すメンバnextにmalloc関数で生成した「次の構造体へのポインタ」を代入しておき、そうして生成した次の構造体(p->next)のメンバprev(p->next->prev)に現在処理対象となっている構造体へのポインタ(p)を代入します。
    } else {
      p->next = malloc(sizeof(result));
      p->next->prev = p; -------- 次の1つ前=現在の構造体

その後、次の繰り返しのために新しく生成した構造体へのポインタをpに代入──という処理を行います。
      p = p->next;

残りのメンバにデータを格納

ここまでで、「1つ前」と「次」の構造体へのポインタがつながったので、あとは配列の要素の値をメンバid、name、scoreに格納するだけです。
    }
    p->id = (short int)i+1;
    strcpy(p->name, _name[i]); -------- 文字列をコピー
    p->score = _score[i];
    p->next = NULL; ------------------- 「次」にNULLを代入しておく
  }