List 連鎖/印字/解放

構造体を typedef で定義して、連鎖/印字/解放する関数を紹介します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. List 構造とはセルをポインタで連鎖したデータ構造です。
    List 構造の基礎は List 連鎖の基礎 を参照して下さい。
  2. LST 構造体を typedef で定義します。
    次のセルに連鎖するためのポインタ(*pt)とデータ領域(v)の定義です。
    DirectX などでは、先頭に LP を付けて構造体のポインタが定義されています。
    top は LST List 構造の先頭ポインタです。
    /*★ List 連鎖(typedef & 関数)    前田 稔 ★*/
    #include    <stdio.h>
    
    // LST 構造体の定義
    typedef struct  _LST
    {   struct  _LST    *pt;
        int             v;
    } LST, *LPLST;
    
    LPLST   top= NULL;      //List の先頭ポインタ
    
  3. add() は List 構造体に一件のデータ(n)を連鎖する関数です。
    wk にセルを割り当てて n を格納します。
    セル(wk)をリスト(lst)の最後の要素としてリンクします。
    wk をリストの先頭(最後に追加したセルが先頭)としてリターンします。
    // LST を一件割り当てる
    LPLST  add(LPLST lst, int n)
    {   LPLST   wk;
        wk= new LST;
        wk->v= n;
        wk->pt= lst;
        return wk;
    }
    
  4. 再起的に List を印字する関数です。
    disp(lst->pt); で次にリンクされたセルを指定して再起的に呼び出します。
    List の top から印字するので、格納した順序とは逆に印字されます。
    // LST を再帰で印字する
    void  disp(LPLST lst)
    {   if (lst==NULL)  return;
        printf("%3d",lst->v);
        disp(lst->pt);
        return;
    }
    
  5. 再起的に List を開放する関数です。
    new で割り当てた領域は delete で解放します。
    領域の解放は List の連鎖が途切れないように最後尾から解放しなければなりません。
    // 再帰で領域を開放する
    void  free(LPLST lst)
    {   if (lst==NULL)  return;
        free(lst->pt);
        printf("%3d開放",lst->v);
        delete lst;
        return;
    }
    
  6. Main() では add(), disp(), free() を順に呼び出すだけです。
    i はループのカウンタで、今回は i の値(1~5)をデータ領域(v)に格納しています。
    //☆ MAIN
    void  main()
    {   int     i;
    
        //List を連鎖
        for(i=1; i<6; i++)  top= add(top,i);
    
        //List をたどって印字
        disp(top);
    
        //List を開放
        free(top);
    }
    

超初心者のプログラム入門(C/C++)