数据结构(结构体定义,typedef)

数据结构(结构体定义,typedef)



看了郝斌老师的数据结构,很有感触,所以就想写一个系列关于数据结构的文章——不论你是出于单纯学习数据结构,还是出于为考研数据结构的初试以及复试做准备的目的,我相信你都可以从本系列博文中获益。 

环境:windows xp(x86),vc++6.0

意图:要想学好数据结构,那么结构体、指针、typedef你一定要熟练的使用,所以博主在参考了郝斌老师的数据结构后,对他的练手程序进行了完善,希望能够在正式开始数据结构的链表学习前,将基础打好。

博主下面的程序主要是为了上述的目的服务的,希望大家能够获益,也希望大家能够给我留言、和我交流。

# include <stdio.h>
# include <malloc.h>

/*
简单说明:模拟当初始数组满时可以自增给定长度的int类型的数组
创作灵感:修改自郝斌老师数据结构,郝斌老师的int数组不能自增
作    者:leonard
书写时间:2014年3月23日
*/
typedef struct Arr
{
  int *pBase;//指向int数组首地址的指针
  int length;//当前的数组最大长度
  int cnt;//当前的元素个数
  int increment;//数组增长的步长
}Arr;

void init_arr(Arr *arr,int len);
void selfincrese_arr(Arr *arr);//当arr所指向的int类型数组满是,自增给定的长度
bool append_arr(Arr *arr,int value);//将value直接追加到数组尾部
bool insert_arr(Arr *arr,int pos,int value);//将value添加到数组指定pos位置的后面,pos从0开始
bool delete_arr(Arr *arr,int pos, int *dvalue);//删除数组指定pos位置上的数据,并将这个数据返回
bool isempty(Arr *arr);
bool isfull(Arr *arr);
void show_arr(Arr *arr);//顺序打印int类型数组的所有元素
void inverse_arr(Arr *arr);//对指定数组的所有元素进行头尾反转


int main(void)
{
  Arr arr;
  int dtemp;

  init_arr(&arr,6);
  append_arr(&arr,2);
  append_arr(&arr,5);
  append_arr(&arr,7);
  append_arr(&arr,4);
  append_arr(&arr,1);
  append_arr(&arr,10);
  append_arr(&arr,88);

  printf("插入之前的数组\n");
  show_arr(&arr);
  insert_arr(&arr,3,99);
  printf("插入之后的数组\n");
  show_arr(&arr);
  printf("删除一个元素之后的数组\n");
  delete_arr(&arr,5,&dtemp);
  printf("删除的数据为%d\n",dtemp);
  show_arr(&arr);
  inverse_arr(&arr);
  printf("数组反转后\n");
  show_arr(&arr);
  return 0;
}

void init_arr(Arr *arr,int len)
{
  if(arr->pBase = (int *)malloc(sizeof(int)*len))
  {
    printf("数组初始化成功...\n");
    arr->length = len;
    arr->increment = 5;
    arr->cnt=0;
  }
  else
    printf("动态分配内存失败...\n");
}

bool isfull(Arr *arr)
{
  if(arr->length==arr->cnt)
    return true;
  else
    return false;
}

bool isempty(Arr *arr)
{
  if(0==arr->cnt)
    return true;
  else
    return false;
}

void show_arr(Arr *arr)
{
  for(int i=0;i<arr->cnt;i++)
  {
    printf("a[%d]=%d\n",i,arr->pBase[i]);
  }
  printf("\n");
}

//将int型数组指向的内存按照事先的约定扩大
void selfincrese_arr(Arr *arr)
{
  int *temp = (int *)malloc(sizeof(int)*arr->length);
  for(int j = 0;j<arr->length;j++)
  {
    *(temp+j) = arr->pBase[j];
  }
  arr->pBase = (int *)malloc(sizeof(int)*(arr->length+=arr->increment));
  for(int k = 0;k<arr->length;k++)
  {
    arr->pBase[k] = *(temp+k);
  }
}

//在数组尾部直接插入新元素
bool append_arr(Arr *arr,int value)
{
  if(isfull(arr))
  {	
    selfincrese_arr(arr);
    printf("初始数组已满,现已添加了%d个空白位置,最大元素个数已扩充至%d\n",arr->increment,arr->length);
    append_arr(arr,value);
  }
  else
  {
    arr->pBase[arr->cnt] = value;
    (arr->cnt)++;
  }
  return true;
}

//在pos位置的后面加入一个值为value的元素,pos从0开始
bool insert_arr(Arr *arr,int pos,int value)
{
  if(pos<0||pos>arr->length||pos>arr->cnt)
  {
    printf("无法完成插入,因为位置参数不正确!\n");
    return false;
  }
  
  else
  {
    for(int l = arr->cnt;l>=pos+1;l--)
    {
      arr->pBase[l] = arr->pBase[l-1];
    }
    arr->pBase[pos+1] = value;
    (arr->cnt)++;
    return true;
  }
}

//删除pos位置上的那个元素,并将删除位置上元素的值返回pos从0开始
bool delete_arr(Arr *arr,int pos, int *dvalue)
{
  *dvalue = arr->pBase[pos];
  for(int m =pos;m<arr->cnt;m++)
    {
      arr->pBase[m] = arr->pBase[m+1];
    }
  arr->cnt--;
  return true;
}

//对指定的int类型数组进行反转
void inverse_arr(Arr *arr)
{
  int p=0,q=arr->cnt-1,itemp;
  while(p<q)
  {
  itemp = arr->pBase[q];
  arr->pBase[q] = arr->pBase[p];
  arr->pBase[p]=itemp;
  p++,q--;
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值