中央論壇 - CENTER BBS

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

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

void print_list(node *head)     /* 印出鏈結串列的內容 */
{
  node *ptr;                /* 走訪鏈結串列所用的指標 */
  for(ptr=head; ptr!=NULL; ptr=ptr->link)
    printf("[%d]"、ptr->data);   /* 印出鏈結串列節點內容 */
  printf("\n");                /* 換行 */
}
                           
node *create_list(int *array、int len)   /* 依陣列架構出鏈結串列 */
{
  node *head;                  /* 鏈結串列的起始指標 */
  node *pre_node;            /* 新節點之前節點的指標 */
  node *new_node;                   /* 新節點的指標 */
  int i;
  for(i=0; i<len; i++)
  {
    new_node=(node *)malloc(sizeof(node));  /* 配置記憶體空間給新節點 */
    if(new_node == NULL)
    {
      printf("記憶體配置失敗!\n");
      exit(1);              /* 立刻結束程式 */
    }
    new_node->data=array;  /* 將陣列內容置入鏈結串列中 */
    if(i == 0)            /* 當第一次放入時,將head指標指向第一個節點 */
    {
      new_node->link=NULL;
      head=new_node;
    }
    else                  /* 先走訪至最後一個節點,再加入新的節點 */
    {
      for(pre_node=head; pre_node->link!=NULL; pre_node=pre_node->link);
      new_node->link=pre_node->link;
      pre_node->link=new_node;
    }
  }
  return head;               /* 將改變過後的鏈結串列傳回 */
}

void free_list(node *head)    /* 將整個鏈結串列的記憶體歸還 */
{
  node *free_node;
  while(head != NULL)
  {
    free_node=head;
    head=head->link;
    free(free_node);
  }
}

void concatenate(node *X、node *Y)
{
  node *ptr;
  if(X == NULL)          /* 若X為空串列,則將Y的位址傳回 */
    Z=Y;
  else if(Y == NULL)       /* 若Y為空串列,則將X的位址傳回 */
    Z=X;
  else
  {                   /* 走訪至尾端節點 */
    for(ptr=X、Z=X; ptr->link!=NULL; ptr=ptr->link);
            /* 將鏈結串列X的尾端節點指向鏈結串列Y的開始節點 */
    ptr->link=Y;
  }
}





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