中央論壇 - CENTER BBS

標題: 使用鏈結串列來製作佇列 [打印本頁]

作者: f66666602    時間: 2007-8-14 04:42
標題: 使用鏈結串列來製作佇列
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct list         /* 宣告鏈結串列結構 */
  4. {
  5.   int data;                 /* 資料欄位 */
  6.   struct list *link;        /* 指標欄位 */
  7. }node;
  8. node *Z=NULL;
  9. void print_list(node *);
  10. node *create_list(int *, int);
  11. void free_list(node *);
  12. void concatenate(node *, node *);
  13. void main( )
  14. {
  15.   node *X=NULL, *Y=NULL;
  16.   int array1[6]={ 1, 3, 5, 7, 9, 11 };
  17.   int array2[6]={ 2, 4, 6, 8, 10, 12 };
  18.   X=create_list(array1, 6);                 /* 建立鏈結串列X */
  19.   Y=create_list(array2, 6);                 /* 建立鏈結串列Y */
  20.   printf("原來的鏈結串列X:\n");
  21.   print_list(X);
  22.   printf("原來的鏈結串列Y:\n");
  23.   print_list(Y);
  24.   concatenate(X, Y);                /* 將鏈結串列X,Y合併成Z */
  25.   printf("合併後的鏈結串列Z:\n");
  26.   print_list(Z);
  27.   free_list(Z);
  28. }

  29. void print_list(node *head)     /* 印出鏈結串列的內容 */
  30. {
  31.   node *ptr;                /* 走訪鏈結串列所用的指標 */
  32.   for(ptr=head; ptr!=NULL; ptr=ptr->link)
  33.     printf("[%d]", ptr->data);   /* 印出鏈結串列節點內容 */
  34.   printf("\n");                /* 換行 */
  35. }
  36.                            
  37. node *create_list(int *array, int len)   /* 依陣列架構出鏈結串列 */
  38. {
  39.   node *head;                  /* 鏈結串列的起始指標 */
  40.   node *pre_node;            /* 新節點之前節點的指標 */
  41.   node *new_node;                   /* 新節點的指標 */
  42.   int i;
  43.   for(i=0; i<len; i++)
  44.   {
  45.     new_node=(node *)malloc(sizeof(node));  /* 配置記憶體空間給新節點 */
  46.     if(new_node == NULL)
  47.     {
  48.       printf("記憶體配置失敗!\n");
  49.       exit(1);              /* 立刻結束程式 */
  50.     }
  51.     new_node->data=array;  /* 將陣列內容置入鏈結串列中 */
  52.     if(i == 0)            /* 當第一次放入時,將head指標指向第一個節點 */
  53.     {
  54.       new_node->link=NULL;
  55.       head=new_node;
  56.     }
  57.     else                  /* 先走訪至最後一個節點,再加入新的節點 */
  58.     {
  59.       for(pre_node=head; pre_node->link!=NULL; pre_node=pre_node->link);
  60.       new_node->link=pre_node->link;
  61.       pre_node->link=new_node;
  62.     }
  63.   }
  64.   return head;               /* 將改變過後的鏈結串列傳回 */
  65. }

  66. void free_list(node *head)    /* 將整個鏈結串列的記憶體歸還 */
  67. {
  68.   node *free_node;
  69.   while(head != NULL)
  70.   {
  71.     free_node=head;
  72.     head=head->link;
  73.     free(free_node);
  74.   }
  75. }

  76. void concatenate(node *X, node *Y)
  77. {
  78.   node *ptr;
  79.   if(X == NULL)          /* 若X為空串列,則將Y的位址傳回 */
  80.     Z=Y;
  81.   else if(Y == NULL)       /* 若Y為空串列,則將X的位址傳回 */
  82.     Z=X;
  83.   else
  84.   {                   /* 走訪至尾端節點 */
  85.     for(ptr=X, Z=X; ptr->link!=NULL; ptr=ptr->link);
  86.             /* 將鏈結串列X的尾端節點指向鏈結串列Y的開始節點 */
  87.     ptr->link=Y;
  88.   }
  89. }
複製代碼





歡迎光臨 中央論壇 - CENTER BBS (https://www.centerbbs.com/) Powered by Discuz! X3