數據結構(結構體定義,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--;
  }
}

發佈了1 篇原創文章 · 獲贊 26 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章