#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define moresize 5 //数组增加长度
//动态数组
//注意:bool是c++的数据类型,标准c语言没有(但可以定义宏)
struct Arry
{
int * pBase; //首地址
int size;
int cnt;
};
void init_arry(struct Arry * q,int len); //初始化数组
bool append(struct Arry * q,int val); //追加数组元素
bool is_empty(struct Arry * q); //判断数组是否为空
bool is_full(struct Arry * q); //判断数组是否满了
void show_arry(struct Arry * q); //遍历数组
//关键是删除、插入、倒序、排序等函数
bool insert_element(struct Arry * q,int pos,int val); //位置从1开始
bool delete_element(struct Arry * q,int pos,int * val); //位置从1开始
void invert_arry(struct Arry * q);
void sort_arry(struct Arry * q);
int main()
{
struct Arry arry;
init_arry(&arry,5);
/*
append(&arry,1);
append(&arry,2);
append(&arry,3);
append(&arry,4);
append(&arry,5);
append(&arry,6);
*/
/*
insert_element(&arry,1,1);
insert_element(&arry,2,2);
insert_element(&arry,3,3);
insert_element(&arry,4,4);
insert_element(&arry,5,5);
insert_element(&arry,6,6);
*/
/*
int i;
int * val=&i;
append(&arry,1);
append(&arry,2);
append(&arry,3);
show_arry(&arry);
delete_element(&arry,2,val);
printf("你删除的元素是:%d\n",i);
*/
/*
append(&arry,1);
append(&arry,2);
append(&arry,3);
append(&arry,4);
show_arry(&arry);
invert_arry(&arry);
*/
/*
append(&arry,1);
append(&arry,5);
append(&arry,2);
append(&arry,6);
append(&arry,3);
show_arry(&arry);
sort_arry(&arry);
*/
show_arry(&arry);
return 0;
}
void init_arry(struct Arry * q,int len)
{
q->pBase=(int *)malloc(sizeof(int) * len);
if(q->pBase==NULL)
{
printf("动态内存分配失败\n");
exit(-1);
}
q->size=len;
q->cnt=0;
return;
}
bool append(struct Arry * q,int val)
{
if(is_full(q))
{
printf("数组满了,%d追加失败\n",val);
return false;
}
//不满时追加
q->pBase[q->cnt]=val;
q->cnt++;
return true;
}
bool is_empty(struct Arry * q)
{
if(q->cnt==0)
{
return true;
}
else{
return false;
}
}
bool is_full(struct Arry * q)
{
if(q->cnt==q->size)
{
return true;
}
else{
return false;
}
}
void show_arry(struct Arry * q)
{
if(is_empty(q))
{
printf("数组为空!\n");
}
else
{
int i;
for(i=0;i<(q->cnt);i++)
{
printf(" %d",q->pBase[i]);
}
printf("\n");
}
}
bool insert_element(struct Arry * q,int pos,int val)
{
//位置不合理
if(pos<1||pos>q->size+1)
{
printf("插入位置不合法!\n");
return false;
}
//full 则扩展内存
if(is_full(q))
{
q->pBase=(int *)realloc(q->pBase,sizeof(int)*(moresize+q->size));
if(NULL==q->pBase)
{
//内存分配失败
exit(-1);
}
q->size+=moresize;
}
//先移动再插入
int i;
for(i=q->cnt;i>pos-1;i--)
{
q->pBase[i+1]=q->pBase[i];
}
q->pBase[pos-1]=val;
q->cnt++;
return true;
}
bool delete_element(struct Arry * q,int pos,int * val)
{
if(pos<1||pos>q->cnt)
{
printf("删除位置不合法!\n");
return false;
}
*val=q->pBase[pos-1];
int i;
for(i=pos-1;i<q->cnt;i++)
{
q->pBase[i]=q->pBase[i+1];
}
q->cnt--;
return true;
}
void invert_arry(struct Arry * q)
{
int i=0;
int j=q->cnt-1;
int temp;
while(i<j)
{
temp=q->pBase[i];
q->pBase[i]=q->pBase[j];
q->pBase[j]=temp;
i++;
j--;
}
return;
}
void sort_arry(struct Arry * q)
{
//冒泡排序(最大元素排最后)
/*
int i=0;
int j=0;
int temp;
for(i;i<q->cnt;i++)
{
for(j=i;j<(q->cnt-i-1);j++)
{
if((q->pBase[j])>(q->pBase[j+1]))
{
//交换
temp=q->pBase[j];
q->pBase[j]=q->pBase[j+1];
q->pBase[j+1]=temp;
}
}
}
*/
//选择排序
int i=0;
int j=0;
int temp;
for(i;i<q->cnt;i++)
{
for(j=i+1;j<q->cnt;j++)
{
if((q->pBase[i])>(q->pBase[j]))
{
//交换(内循环i不变)
temp=q->pBase[i];
q->pBase[i]=q->pBase[j];
q->pBase[j]=temp;
}
}
}
return;
}