功能:數組的創建及基本操作函數
運行環境:VS2010
參考:郝斌老師的數據結構視頻
#include <stdio.h>
#include <malloc.h>//malloc()
#include <stdlib.h>//exit(-1)
//結構體類型 複合數據類型
struct Arr{
int * pBase;//array 的第一個元素地址
int len;//數組最大長度
int cnt;//當前數組有效元素的個數
};
void init_arr(struct Arr *pArr,int length);//初始化
void show_arr(struct Arr *pArr);//遍歷元素
bool append_arr(struct Arr *pArr,int val);//追加
bool insert_arr(struct Arr *pArr,int pos,int val);//插入
bool delete_arr(struct Arr *pArr,int pos);//刪除
void get(struct Arr *pArr,int element); //得到元素
bool is_empty(struct Arr *pArr);//判斷爲空
bool is_full(struct Arr *pArr);//判斷爲滿
void sort_arr(struct Arr *pArr);//排序
void inversion_arr(struct Arr *pArr);//倒置
int main()
{
struct Arr arr;//定義結構體Arr類型 的變量
int length;
printf("請輸入要創建數組的長度\n");
scanf("%d",&length);
init_arr(&arr,length);
printf(" The array addr is %p \n the length is %d\n 有效元素是%d\n",arr.pBase,arr.len,arr.cnt);//數組的初始地址
show_arr(&arr);
is_full(&arr);
append_arr(&arr,10);
append_arr(&arr,20);
append_arr(&arr,25);
append_arr(&arr,4);
insert_arr(&arr,3,1000);
/*
if(!append_arr(&arr,5))
{
printf("append failed out of the length\n");
}
else
{
printf("append success\n");
}
*/
//delete_arr(&arr,2);
//inversion_arr(&arr);
show_arr(&arr);
get(&arr,3);
sort_arr(&arr);
show_arr(&arr);
return 0;
}
void init_arr(struct Arr *pArr,int length)
{
pArr->pBase=(int *)malloc(sizeof(int)*length);
if(NULL==pArr->pBase)
{
printf("申請內存失敗\n");
exit(-1);
}
else
{
pArr->len=length;
pArr->cnt=0;
}
}
bool is_empty(struct Arr *pArr)//判斷爲空 爲空爲真,否則爲假
{
if(0==pArr->cnt)
{
printf("【is_empty】The array is empty\n");
return true;
}
else
{
printf("【is_empty】The array is not empty\n");
return false;
}
}
void show_arr(struct Arr *pArr)
{
if(is_empty(pArr))
{
printf("【show_arr】The array is empty can not show\n");
}
else
{
for(int i=0;i<pArr->cnt;i++)
{
printf("【show_arr】arr[%d] = %d\n",i,pArr->pBase[i]);//我準備寫成 【*(pArr+i) 或者pArr[i]】重點
}
}
}
bool is_full(struct Arr *pArr)
{
if(pArr->cnt==pArr->len)
{
printf("【is_full】The array is full\n");
return true;
}
else
{
printf("【is_full】The array is not full.you can add elenment \n");
return false;
}
}
bool append_arr(struct Arr *pArr,int val)
{
if(is_full(pArr))
{
printf("【append_arr】The array length is %d and it is full can not append\n",pArr->len);
return false;
}
else
{
*(pArr->pBase+pArr->cnt)=val;//pArr->pBase[pArr->cnt];
pArr->cnt++;
return true;
}
}
void get(struct Arr *pArr,int element)//得到第幾個元素
{
printf("【get】The element is %d\n",pArr->pBase[element-1]);
}
bool insert_arr(struct Arr *pArr,int pos,int val)//插入 向第pos個元素中插入val值
{
//特殊情況1 不能插入的情況
if(is_full(pArr))
return false;
//特殊情況2 不能隨意插入,位置不能大於有效數組元素個數
if(pos<1||pos>pArr->cnt+1)
return false;
for(int i=pArr->cnt-1;i>=pos-1;i--)
{
pArr->pBase[i+1]=pArr->pBase[i];
}
pArr->pBase[pos-1]=val;//向pos位置放入val值
pArr->cnt++;
return true;
}
bool delete_arr(struct Arr *pArr,int pos)//刪除第pos個元素
{
//特殊情況 爲空不能刪除
if(is_empty(pArr))
return false;
if(pos<1||pos>pArr->cnt)
return false;
for(int i=pos;i<pArr->cnt;i++)
{
pArr->pBase[i-1]=pArr->pBase[i];
}
pArr->cnt--;
return true;
}
void inversion_arr(struct Arr *pArr)
{
int i=0;
int j=pArr->cnt-1;
while(i<j)
{
int temp;
temp=pArr->pBase[i];
pArr->pBase[i]=pArr->pBase[j];
pArr->pBase[j]=temp;
i++;
j--;
}
}
void sort_arr(struct Arr *pArr)
{
int i,j,t;
for(i=0;i<pArr->cnt;++i)
{
for(j=i+1;j<pArr->cnt;++j)
{
if(pArr->pBase[i]>pArr->pBase[j])
{
t=pArr->pBase[i];
pArr->pBase[i]=pArr->pBase[j];
pArr->pBase[j]=t;
}
}
}
}