020-29133788
    资 讯
    您的位置:首页 >> 资 讯 >> 软件应用 >> 编程开发 >> 正文
    使用链结串列来制作伫列

    点击:   发布日期:2013-01-19

    本文来自 www.020fix.com

    #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[i];  /* 将阵列内容置入链结串列中 */
        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;
      }
    }