文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>c语言版仿c++封闭动态数组...

c语言版仿c++封闭动态数组...

时间:2010-08-18  来源:zhaogengzi

#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int DataType;           //是这样用吗?

struct DArray
{
 int capacity;            //数组容量
 DataType *parray;           //动态数组其实就是一个指向一块内在的指针.
 int count;             //已使用的元素个数
 void (*init_array)(struct DArray *pthis, int size);   //初始化数组的大小.
 void (*insert)(struct DArray *pthis, int index, DataType element);
 DataType (*get_element)(struct DArray *pthis, int index);
 void (*change_size)(struct DArray *pthis, int newsize);
 int (*get_capacity)(struct DArray *pthis);
    void (*free)(struct DArray *pthis);

};                //结构体后面的分号一定不能再忘了..


void array_change_size(struct DArray *pthis, int newsize)
{
 int limit = 0;
 int i;
 if((newsize<=0) || (newsize==pthis->capacity))
 {
  printf("array_change_size error!: newsize <=0 || newsize == pthis->capacity \n");
  return;
 }
 DataType *pnew = (DataType*)malloc(sizeof(DataType)*newsize);
 if(pnew==NULL)
 {
  printf("memory exhaust!\n");
  exit(1);
 }
 limit = (newsize > pthis->capacity) ? pthis->capacity : newsize;
 for(i=0; i<limit; i++)
 {
  pnew[i] = (pthis->parray)[i];
 }
 free(pthis->parray);
 pthis->parray = pnew;
 pthis->capacity = newsize;
}

void array_insert(struct DArray *pthis, int index, DataType element)     //在添加元素时就是这样.
{
  #ifdef DEBUGARRAY                //用于对数组的索引进行调试
  if(index < 0)
  {
   printf("array_insert error : index < 0\n");
   exit(1);
  }
 #endif
 (pthis->parray)[index] = element;
 ++pthis->count;                 //记录数组中有效元素个数
}


DataType array_get_element(struct DArray *pthis, int index)
{
 #ifdef DEBUGARRAY                //用于对数组的索引进行调试
 if(index < 0)
 {
   printf("array_insert error : index < 0\n");
   exit(1);
 }
 #endif
 --pthis->count;
 return (pthis->parray)[index];
}

void array_free(struct DArray *pthis)
{
  free(pthis->parray);
  pthis->parray = NULL;          //别记了这步很关键
  pthis->capacity = 0;
  pthis->count = 0;
}

int array_get_capacity(struct DArray *pthis)
{
 return pthis->capacity;
}

void array_init_array(struct DArray *pthis, int size)
{
 int capacity;
 capacity = (size>1)?size:2;         //数组初始化时容量必须为2的倍数
 pthis->capacity = capacity;
 pthis->parray = (DataType *)malloc(sizeof(DataType)*capacity);
 if(pthis->parray == NULL)
 {
  printf("memory exhoust!\n");
  exit(1);
 }
 pthis->count = 0;
 pthis->init_array = array_init_array;      //初始化所有的函数指针.
 pthis->insert = array_insert;
 pthis->get_element = array_get_element;
 pthis->change_size = array_change_size;
    pthis->free = array_free;
 pthis->get_capacity = array_get_capacity;
}


int main()
{
  struct DArray array;
  array_init_array(&array,2);        //初始大小为2的倍数
  for(int i=0; i<1000; i++)
  {
   if(i == array.get_capacity(&array))
   {
    array.change_size(&array, i<<1);    //如果满了数组容量加大两倍
   }
   array.insert(&array, i, i);   
  }
  int trysize = array.get_capacity(&array);    //数组容量.
  int num = 0;
  cout<<"trysize:"<<trysize<<endl;
  for(int j=999; j>-1; j--)
  {
   num = j+1;          //元素个数,这种错误的原因是马虎吗?吗?吗?要不就是那个指针的位置没有加星,在进行代码copy时一定要注意,变量名问题,脑子一定要想着我在哪里用过这些变量.
   while(num<=trysize>>2 && trysize>2)
   {
    trysize >>=1;
    cout<<"newsize::"<<trysize<<endl;
   }
   if(trysize<array.get_capacity(&array))
   {
    //cout<<"newsize::"<<trysize<<endl;
    array.change_size(&array, trysize);
   }
   cout<<array.get_element(&array, j)<<"  ";
  }
  cout<<endl;
 return 0;
}

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载