home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2000 December / VPR0012A.BIN / OLS / CMKT111 / cmkt111.lzh / Cmachine / sample / record.c < prev    next >
C/C++ Source or Header  |  2000-09-10  |  2KB  |  123 lines

  1.  
  2. /*
  3.  * C machine サンプル ~ 構造体・ヒープ領域
  4.  *
  5.  * 「連結リスト」
  6.  *
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12.  
  13. /*
  14.  * 1レコード構造体
  15.  */
  16. typedef struct one_rec{
  17.     char            name[20];    // 氏名
  18.     unsigned short    age;        // 年齢
  19.     struct one_rec    *next;        // 次
  20. } ONE_REC;
  21.  
  22. ONE_REC    *top_rec;        // レコードリストトップポインタ
  23.  
  24. void AddRec(void);        // リストにレコードを追加
  25. void DelRec(void);        // リストから氏名指定によりレコードを削除
  26. void OutList(void);        // リスト一括出力
  27. void FreeList(void);    // リスト一括開放
  28.  
  29. int main(void)
  30. {
  31.     short    no, loop_flg = 1;
  32.  
  33.     while(loop_flg) {
  34.  
  35.         puts("1:追加、2:削除、3:出力、4:終了");
  36.         printf("1~4のどれかを入力してください:");
  37.         scanf("%hd", &no);
  38.  
  39.         switch(no)
  40.         {
  41.         case 1:        // 追加
  42.             AddRec();
  43.             break;
  44.         case 2:        // 削除
  45.             DelRec();
  46.             break;
  47.         case 3:        // 出力
  48.             OutList();
  49.             break;
  50.         case 4:        // 終了
  51.         default:
  52.             FreeList();
  53.             loop_flg = 0;
  54.         }
  55.     }
  56.  
  57.     return 0;
  58. }
  59.  
  60. void AddRec(void)
  61. {
  62.     ONE_REC    **rec_wk;
  63.  
  64.     rec_wk = &top_rec;
  65.     while(*rec_wk != NULL) {
  66.         rec_wk = &(*rec_wk)->next;
  67.     }
  68.  
  69.     *rec_wk = (ONE_REC *)malloc(sizeof(ONE_REC));
  70.     memset(*rec_wk, 0, sizeof(ONE_REC));
  71.     printf("氏名:"); scanf("%s", (*rec_wk)->name);
  72.     printf("年齢:"); scanf("%hd", &(*rec_wk)->age);
  73. }
  74.  
  75. void DelRec(void)
  76. {
  77.     ONE_REC    *rec_wk = top_rec;
  78.     ONE_REC    *rec_prev = NULL;
  79.     char    name_wk[20];
  80.  
  81.     printf("削除するレコードの氏名:"); scanf("%s", name_wk);
  82.     while(rec_wk != NULL) {
  83.         if(strcmp(name_wk, rec_wk->name) == 0) {
  84.             if(rec_prev != NULL) {
  85.                 rec_prev->next = rec_wk->next;
  86.             }
  87.             else {
  88.                 top_rec = rec_wk->next;
  89.             }
  90.  
  91.             free(rec_wk);
  92.             break;
  93.         }
  94.  
  95.         rec_prev = rec_wk;
  96.         rec_wk = rec_wk->next;
  97.     }
  98. }
  99.  
  100. void OutList(void)
  101. {
  102.     ONE_REC *rec_wk = top_rec;
  103.  
  104.     while(rec_wk) {
  105.         printf("名前:%s  年齢:%d\n", rec_wk->name, rec_wk->age);
  106.         rec_wk = rec_wk->next;
  107.     }
  108. }
  109.  
  110. void FreeList(void)
  111. {
  112.     ONE_REC *rec_wk = top_rec;
  113.     ONE_REC    *rec_next;
  114.  
  115.     while(rec_wk) {
  116.         rec_next = rec_wk->next;
  117.         free(rec_wk);
  118.         rec_wk = rec_next;
  119.     }
  120.  
  121.     top_rec = NULL;
  122. }
  123.