Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2160851
  • 博文数量: 556
  • 博客积分: 11457
  • 博客等级: 上将
  • 技术积分: 5973
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-24 22:33
文章分类

全部博文(556)

文章存档

2013年(22)

2012年(74)

2011年(460)

分类: C/C++

2012-08-13 17:22:15

连续存储【数组】的算法演示:参照自Java中ArrayList类中方法的设计(Java内核仍为C/C++)。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. //定义了一个数据类型,该数据类型的名字叫做struct Arr,该数据类型含有三个成员pBase,len,cnt
  5. struct Arr
  6. {
  7.      int *pBase; //存储的是数组第一个元素的地址
  8.      int len; //数组所能容纳的最大元素的个数
  9.      int cnt; //当前数组有效元素的个数
  10.     // int increment; //数组自动增长因子 allocate()
  11. };

  12. void init_arr(struct Arr * pArr,int length);
  13. bool append_arr(struct Arr * pArr,int val); //追加
  14. bool insert_arr(struct Arr * pArr,int pos, int val); //pos的值从1开始
  15. bool delete_arr(struct Arr * pArr,int pos, int * pVal);
  16. int get();
  17. bool is_empty(struct Arr * pArr);
  18. bool is_full(struct Arr * pArr);
  19. void sort_arr(struct Arr * pArr);
  20. void show_arr(struct Arr * pArr);
  21. void inversion_arr(struct Arr * pArr); //倒置

  22. //find_val_arr();
  23. //deleteAll(4);
  24. int main(void)
  25. {
  26.     struct Arr arr;
  27.     int val;
  28.     init_arr(&arr,6);
  29.     //printf("%d\n",arr.len);
  30.     show_arr(&arr);
  31.     append_arr(&arr,1);
  32.     append_arr(&arr,99);
  33.     append_arr(&arr,3);
  34.     append_arr(&arr,4);
  35.     append_arr(&arr,-6);
  36.     append_arr(&arr,33);
  37.     if(delete_arr(&arr,4,&val))
  38.     {
  39.         printf("删除成功!\n");
  40.         printf("%d\n",val);
  41.     }
  42.     else
  43.     {
  44.         printf("删除失败!");
  45.     }
  46.     insert_arr(&arr,4,44);
  47.     /*
  48.     append_arr(&arr,5);
  49.     append_arr(&arr,6);
  50.     if (append_arr(&arr,7))
  51.     {
  52.         printf("追加成功!\n");
  53.     }
  54.     else
  55.     {
  56.       printf("追加失败!\n");
  57.     }
  58.     */
  59.     show_arr(&arr);
  60.     inversion_arr(&arr);
  61.     printf("倒置后的数组是:");
  62.     show_arr(&arr);
  63.     printf("按升序排序后的数组是:");
  64.     sort_arr(&arr);
  65.     show_arr(&arr);
  66.     return 0;
  67. }

  68. void init_arr(struct Arr * pArr,int length)
  69. {
  70.     //(*pArr).len=99;
  71.     pArr->pBase = (int *)malloc(sizeof(int) * length);
  72.     if (NULL == pArr->pBase)
  73.     {
  74.         printf("动态内存分配失败!\n");
  75.         exit(-1); //终止整个程序
  76.     }
  77.     else
  78.     {
  79.        pArr->len = length;
  80.        pArr->cnt = 0;
  81.     }
  82.     return;
  83. }

  84. bool is_empty(struct Arr * pArr)
  85. {
  86.     if (0 == pArr->cnt)
  87.         return true;
  88.     else
  89.      return false;
  90. }

  91. void show_arr(struct Arr * pArr)
  92. {
  93.     if (is_empty(pArr))
  94.     {
  95.         printf("数组为空!\n");
  96.     }
  97.     else
  98.     {
  99.         for (int i=0;i<pArr->cnt; ++i)
  100.      printf("%d ",pArr->pBase[i]);
  101.          printf("\n");
  102.     }
  103. }

  104. bool is_full(struct Arr * pArr)
  105. {
  106.     if (pArr->cnt == pArr->len)
  107.      return true;
  108.     else
  109.         return false;
  110.         
  111. }

  112. bool append_arr(struct Arr * pArr,int val)
  113. {
  114.     //满时返回false
  115.      if (is_full(pArr))
  116.        return false;

  117.      //不满时追加
  118.      else
  119.          pArr->pBase[pArr->cnt] = val;
  120.      (pArr->cnt)++;
  121.      return true;
  122. }

  123. bool insert_arr(struct Arr * pArr,int pos, int val)
  124. {
  125.     int i;

  126.     if (is_full(pArr))
  127.      return false;
  128.     
  129.     if (pos<1 || pos>pArr->cnt+1)
  130.      return false;

  131.     for (i=pArr->cnt-1;i>=pos-1;--i)
  132.     {
  133.         pArr->pBase[i+1] = pArr->pBase[i];
  134.     }
  135.     pArr->pBase[pos-1] = val;
  136.     (pArr->cnt)++;
  137.     return true;
  138. }

  139. bool delete_arr(struct Arr * pArr,int pos, int * pVal)
  140. {
  141.     int i;

  142.     if (is_empty(pArr))
  143.         return false;
  144.     if (pos<1 ||pos>pArr->cnt)
  145.         return false;

  146.     *pVal = pArr->pBase[pos-1];

  147.     for (i=pos;i<pArr->cnt;++i)
  148.     {
  149.         pArr->pBase[i-1] = pArr->pBase[i];
  150.     }
  151.     pArr->cnt --;
  152.     return true;
  153. }

  154. void inversion_arr(struct Arr * pArr)
  155. {
  156.     int i=0;
  157.     int j=pArr->cnt-1;
  158.     int tmp;

  159.     while (i<j)
  160.     {
  161.         tmp=pArr->pBase[i];
  162.         pArr->pBase[i]=pArr->pBase[j];
  163.         pArr->pBase[j] = tmp;
  164.         ++i;
  165.         --j;
  166.     }
  167.     return;
  168. }

  169. void sort_arr(struct Arr * pArr)
  170. {
  171.     int i,j,tmp;
  172.     for (i=0;i<pArr->cnt;++i)
  173.     {
  174.         for (j=i+1;j<pArr->cnt;++j)
  175.         {
  176.             if (pArr->pBase[i] > pArr->pBase[j])
  177.             {
  178.                 tmp=pArr->pBase[i];
  179.                 pArr->pBase[i]=pArr->pBase[j];
  180.          pArr->pBase[j] = tmp;
  181.             }
  182.         }
  183.     }

  184. }
阅读(2342) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~