[资料分享] 数据结构01:数组

[复制链接]
956|0
 楼主| seifguo 发表于 2016-3-20 22:32 | 显示全部楼层 |阅读模式


  1.     /*
  2.      * 根据郝斌老师视频整理
  3.      * 编译环境:
  4.      * guo@linux:~$ gcc --version
  5.      * gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
  6.      */
  7.     #include <stdio.h>
  8.     #include <malloc.h> /*malloc()*/
  9.     #include <stdlib.h> /*exit()*/

  10.     #define FALSE 0
  11.     #define TRUE 1

  12.     typedef struct Array
  13.     {
  14.         int *pBase;     /*存储数组第一个元素的地址*/
  15.         int len;         /*数组能容纳的有效元素的个数*/
  16.         int cnt;         /*当前数组有效元素的个数*/
  17.     // int increment; /*自动增长因子,需要allocate()函数*/
  18.     }ARRAY;

  19.     /**************************声明*******************************/
  20.     /*初始化数组*/
  21.     void InitArray(ARRAY *, int );
  22.     /*数组追加元素*/
  23.     int AppendArray(ARRAY *, int );
  24.     /*数组插入元素*/
  25.     int InsertArray(ARRAY *, int , int );
  26.     /*数组删除元素*/
  27.     int DeleteArray(ARRAY *, int, int *);
  28.     /*获得元素*/
  29.     int get(ARRAY *,int , int *);
  30.     /*判断数组是否为空*/
  31.     int IsEmpty(ARRAY *);
  32.     /*判断数组是否已满*/
  33.     int IsFull(ARRAY *);
  34.     /*数组排序*/
  35.     void SortArray(ARRAY *);
  36.     /*显示数组*/
  37.     void ShowArray(ARRAY *);
  38.     /*倒置数组*/
  39.     void InversionArray(ARRAY *);

  40.     /*
  41.      * 函数名称:InitArray。
  42.      * 函数说明:初始化数组,为数组分配内存,并确定长度。
  43.      * 输入参数:pArr数组首地址,length数组长度。
  44.      * 输出参数:无。
  45.      */
  46.     void InitArray(ARRAY *pArr, int length)
  47.     {
  48.         pArr->pBase = (int *)malloc(sizeof(int)*length);
  49.         if (NULL == pArr->pBase)
  50.         {
  51.             printf("动态分配内存失败!\n");
  52.             exit(-1);
  53.         }
  54.         else
  55.         {
  56.             pArr->len = length;
  57.             pArr->cnt = 0;
  58.         }

  59.         return;
  60.     }

  61.     /*
  62.      * 函数名称:IsEmpty。
  63.      * 函数说明:判断数组是否为空。
  64.      * 输入参数:pArr数组首地址。
  65.      * 输出参数:如果数组为空,返回TRUE;否则返回FALSE。
  66.      */
  67.     int IsEmpty(ARRAY *pArr)
  68.     {
  69.         if (0==pArr->cnt)
  70.             return TRUE;
  71.         else
  72.             return FALSE;
  73.     }

  74.     /*
  75.      * 函数名称:IsFull。
  76.      * 函数说明:判断数组是否为满。
  77.      * 输入参数:pArr数组首地址。
  78.      * 输出参数:如果数组为满,返回TRUE;否则返回FALSE。
  79.      */
  80.     int IsFull(ARRAY *pArr)
  81.     {
  82.         if (pArr->len == pArr->cnt)
  83.             return TRUE;
  84.         else
  85.             return FALSE;
  86.     }

  87.     /*
  88.      * 函数名称:AppendArray。
  89.      * 函数说明:数组追加元素。
  90.      * 输入参数:pArr数组首地址,val要追加的值。
  91.      * 输出参数:如果数组为满,返回FALSE;追加成功返回TRUE。
  92.      */
  93.     int AppendArray(ARRAY *pArr,int val)
  94.     {
  95.         if ( IsFull(pArr) )
  96.             return FALSE;

  97.         pArr->pBase[pArr->cnt] = val;
  98.         pArr->cnt++;

  99.         return TRUE;
  100.     }

  101.     /*
  102.      * 函数名称:InsertArray。
  103.      * 函数说明:插入元素,如果数组只有3个元素,可以插入到第4个元素位置。
  104.      * 输入参数:pArr数组首地址;position要插入的位置,从1开始;val要插入的值。
  105.      * 输出参数:如果数组为满或下标越界或没有存储那么多元素,返回FALSE;插入成功返回TRUE。
  106.      */
  107.     int InsertArray(ARRAY *pArr, int position, int val)
  108.     {
  109.         int i;

  110.         if ( IsFull(pArr) )
  111.             return FALSE;        /*数组已满*/
  112.         if (position<1 || position>pArr->len)
  113.             return FALSE;         /*下标越界*/
  114.         if (position>pArr->cnt+1)
  115.             return FALSE;         /*没存储那么多元素*/

  116.         /*在位置position后的元素都向后移动一位*/
  117.         for (i=pArr->cnt;i>=position;--i)
  118.         {
  119.             pArr->pBase[i] = pArr->pBase[i-1];
  120.         }
  121.         
  122.         pArr->pBase[position-1] = val;
  123.         pArr->cnt++;

  124.         return TRUE;
  125.     }

  126.     /*
  127.      * 函数名称:DeleteArray。
  128.      * 函数说明:删除元素。
  129.      * 输入参数:pArr数组首地址;position要删除的位置;val存储要删除的值。
  130.      * 输出参数:如果数组为满或下标越界或没有存储那么多元素,返回FALSE;删除成功返回TRUE。
  131.      * 删除成功前,先存储要删除的元素。
  132.      */
  133.     int DeleteArray(ARRAY *pArr, int position, int *val)
  134.     {
  135.         int i;

  136.         if ( IsEmpty(pArr) )
  137.             return FALSE;         /*数组为空*/
  138.         if (position<1 || position>pArr->len)
  139.             return FALSE;         /*下标越界*/
  140.         if (position > pArr->cnt)
  141.             return FALSE;         /*数组未存储那么多元素*/

  142.         *val = pArr->pBase[position-1];
  143.         for (i=position-1;i<pArr->cnt;++i)
  144.         {
  145.             pArr->pBase[i] = pArr->pBase[i+1];
  146.         }
  147.         pArr->cnt--;

  148.         return TRUE;
  149.     }

  150.     /*
  151.      *
  152.      */
  153.     int get(ARRAY *pArr, int i, int *val)
  154.     {
  155.         if (i<1 || i>pArr->cnt)
  156.             return FALSE;
  157.         *val = pArr->pBase[i-1];
  158.         return TRUE;
  159.     }

  160.     /*
  161.      * 函数名称:InversionArray。
  162.      * 函数说明:倒置数组。
  163.      * 输入参数:pArr数组首地址。
  164.      * 输出参数:无。
  165.      */
  166.     void InversionArray(ARRAY *pArr)
  167.     {
  168.         int i = 0;
  169.         int j = pArr->cnt - 1;
  170.         int temp;

  171.         while (i<j)
  172.         {
  173.             temp = pArr->pBase[i];
  174.             pArr->pBase[i] = pArr->pBase[j];
  175.             pArr->pBase[j] = temp;
  176.             ++i;
  177.             --j;
  178.         }

  179.         return;
  180.     }

  181.     /*
  182.      * 函数名称:SortArray。
  183.      * 函数说明:选择排序
  184.      *              1. 先取数组第一个元素,跟其他所有元素比较,放最小值
  185.      *              2. 再取数组第二个元素,跟其他除了第一个元素外的所有元素比较,放最小值
  186.      *              3. 依次进行,直到比较完
  187.      * 输入参数:pArr数组首地址。
  188.      * 输出参数:无。
  189.      */
  190.     void SortArray(ARRAY *pArr)
  191.     {
  192.         int i, j, temp;
  193.         for (i=0;i<pArr->cnt-1;++i)
  194.         {
  195.             for (j=i+1;j<pArr->cnt;++j)
  196.             {
  197.                 if (pArr->pBase[i] > pArr->pBase[j])
  198.                 {
  199.                     temp = pArr->pBase[i];
  200.                     pArr->pBase[i] = pArr->pBase[j];
  201.                     pArr->pBase[j] = temp;
  202.                 }
  203.             }
  204.         }
  205.         return;
  206.     }

  207.     /*
  208.      * 函数名称:ShowArray。
  209.      * 函数说明:显示数组元素。
  210.      * 输入参数:pArr数组首地址。
  211.      * 输出参数:无。
  212.      */
  213.     void ShowArray(ARRAY *pArr)
  214.     {
  215.         int i;

  216.         if ( IsEmpty(pArr) )
  217.         {
  218.             printf("Array is empty!\n");
  219.         }
  220.         else
  221.         {
  222.             for (i=0;i<pArr->cnt;++i)
  223.             {
  224.                 printf("%d ",pArr->pBase[i]);
  225.             }
  226.             printf("\n");
  227.         }
  228.     }


  229.     int main(void)
  230.     {
  231.         int temp32;        
  232.         int val;         
  233.         ARRAY arr;

  234.         InitArray(&arr, 6);
  235.         printf("新建数组:\n");
  236.         printf("len=%d cnt=%d\n", arr.len, arr.cnt);
  237.         ShowArray(&arr);
  238.         
  239.         printf("追加后,数组元素为:\n");
  240.         AppendArray(&arr,11);
  241.         AppendArray(&arr,22);
  242.         AppendArray(&arr,33);
  243.         AppendArray(&arr,44);
  244.     /*    AppendArray(&arr,55);
  245.         AppendArray(&arr,66);
  246.         AppendArray(&arr,77);
  247.         AppendArray(&arr,88); */
  248.         ShowArray(&arr);

  249.         printf("插入后,数组元素为:\n");
  250.         temp32 = InsertArray(&arr,5,99);
  251.         if (TRUE == temp32)
  252.         {
  253.             ShowArray(&arr);
  254.         }
  255.         else
  256.         {
  257.             printf("插入错误!\n");
  258.         }

  259.         printf("删除后,数组元素为:\n");
  260.         temp32 = DeleteArray(&arr, 3, &val);
  261.         if (TRUE == temp32)
  262.         {
  263.             ShowArray(&arr);
  264.             printf("删除的元素是%d\n", val);
  265.         }
  266.         else
  267.         {
  268.             printf("删除错误!\n");;
  269.         }

  270.         temp32 = get(&arr, 5, &val);
  271.         if (temp32)
  272.         {
  273.             printf("第%d个元素是%d.\n", 5, val);
  274.         }
  275.         else
  276.         {
  277.             printf("获取元素错误!\n");
  278.         }

  279.         printf("数组倒置后为:\n");
  280.         InversionArray(&arr);
  281.         ShowArray(&arr);
  282.         
  283.         printf("数组按升序排列后为:\n");
  284.         SortArray(&arr);
  285.         ShowArray(&arr);

  286.         return 0;
  287.     }



您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

83

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部