#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Arr
{
int * pBase;//保存数组第一个元素的地址
int len;//数组的长度
int cnt;//数组的有效个数
}Array;
typedef int bool;
#define true 0
#define false 1
void init_arr(Array *);//数组初始化
void show_arr(Array *);//输出
bool is_empty(Array *);//判断是否为空
bool is_full(Array *);//判断是否为满
bool append_arr(Array *, int);//追加数组
bool insert_arr(Array *, int, int);//插入数组
bool delete_arr(Array *, int);
void sort(Array *, int, int);//数组快排
void sort2(Array *);//数组冒泡排序
void invision(Array *);//数组倒置
int main(void)
{
Array arr;
printf("请输入数组的长度:");
scanf("%d",&arr.len);
printf("\n");
init_arr(&arr);
show_arr(&arr);
append_arr(&arr,49);
append_arr(&arr,38);
append_arr(&arr,76);
append_arr(&arr,54);
append_arr(&arr,97);
append_arr(&arr,20);
append_arr(&arr,19);
append_arr(&arr,66);
printf("------------------------------------追加数组------------------------------------\n");
printf("\n");
show_arr(&arr);
printf("\n");
printf("------------------------------------插入数组------------------------------------\n");
printf("\n");
insert_arr(&arr,2,88);
insert_arr(&arr,3,99);
show_arr(&arr);
printf("------------------------------------快速排序------------------------------------\n");
printf("\n");
sort(&arr,0,arr.cnt-1);
show_arr(&arr);
printf("------------------------------------冒泡排序------------------------------------\n");
printf("\n");
sort2(&arr);
show_arr(&arr);
printf("------------------------------------倒置数组------------------------------------\n");
printf("\n");
invision(&arr);
show_arr(&arr);
printf("------------------------------------删除数组------------------------------------\n");
printf("\n");
delete_arr(&arr,3);
show_arr(&arr);
return 0;
}
void init_arr(Array * pArr)
{
pArr->pBase=(int *)malloc(sizeof(int)*pArr->len);
if(pArr->pBase==NULL)
{
printf("内存分配失败!\n");
exit(-1);
}
else
pArr->cnt=0;
return;
}
bool is_empty(Array * pArr)
{
if(pArr->cnt==0)
return true;
else
return false;
}
void show_arr(Array * pArr)
{
int i;
if( !is_empty(pArr) )
printf("数组为空!\n");
else
{
for(i=0;i<pArr->cnt;++i)
printf("%d\t",pArr->pBase[i]);
}
printf("\n");
return;
}
bool is_full(Array * pArr)
{
if(pArr->cnt>pArr->len-1)
return false;
else
return true;
}
bool append_arr(Array * pArr,int val)
{
//pArr->pBase[0]=23;cnt=1;
//pArr->pBase[1]=46;cnt=2;
if( !is_full(pArr) )
{
pArr->pBase[pArr->cnt]=val;
++pArr->cnt;
//printf("cnt=%d\n",pArr->cnt);
return true;
}
else
{
printf("数组已满,其余的无法追加!\n");
return false;
}
}
bool insert_arr(Array * pArr, int pos, int val)
{
int i;
if( is_full(pArr) )
return false;
else
{
for(i=pArr->cnt-1;i>=pos-1;--i)//pos下标从1开始
{
pArr->pBase[i+1]=pArr->pBase[i];
}
pArr->pBase[pos-1]=val;
++pArr->cnt;
return true;
}
}
//快速排序
void sort(Array * pArr, int left, int right)
{
int i=left;
int j=right;
int key=pArr->pBase[left];
if(left>=right)
return;
while(i<j)
{
while(i<j && pArr->pBase[j]>key)
--j;
//temp=key;
//key=pArr->pBase[j];
//pArr->pBase[j]=temp;
pArr->pBase[i]=pArr->pBase[j];
while(i<j && key>pArr->pBase[i] )
++i;
pArr->pBase[j]=pArr->pBase[i];
}
pArr->pBase[i]=key;
sort(pArr,left,i-1);
sort(pArr,i+1,right);
}
//冒泡排序
void sort2(Array * pArr)
{
int i,j,temp;
for(i=0;i<pArr->cnt-1;++i)//i是排序多少次
{
for(j=0;j<pArr->cnt-i-1;++j)//j是用来前后排序的
{
if(pArr->pBase[j]>pArr->pBase[j+1])
{
temp=pArr->pBase[j];
pArr->pBase[j]=pArr->pBase[j+1];
pArr->pBase[j+1]=temp;
}
}
}
}
//倒置数组
void invision(Array * pArr)
{
int i=0;
int j=pArr->cnt-1;
int temp;
while(i<j)
{
temp=pArr->pBase[i];
pArr->pBase[i]=pArr->pBase[j];
pArr->pBase[j]=temp;
++i;
--j;
}
}
bool delete_arr(Array * pArr, int pos)//pos下标从1开始
{
int i;
if(pos-1>=pArr->cnt)
return false;
for(i=pos-1;i<=pArr->cnt-1;++i)
pArr->pBase[i]=pArr->pBase[i+1];
--pArr->cnt;
return true;
}