#include <stdio.h>
#include <malloc.h>
#include <stdlib.h> //包含exit函数;
struct Arr
{
int * pBase;
int len;
int cnt;
};
int init_arr(struct Arr *pArr, int length); //初始化一个数组
void show_arr (struct Arr *pArr); //显示数组内容
bool is_empty(struct Arr *pArr); //判断数组是否为空
bool is_full(struct Arr *pArr); //判断数组是否为满
bool append_arr(struct Arr *pArr,int val); //给数组追加元素值
bool insert(struct Arr * pArr,int pos, int val); //在第pos个元素位置前插入值val
bool delete_arr(struct Arr *pArr,int pos,int *pVal); //在这犯了个错误将函数名命名为delete与库函数重名;
void inversion(struct Arr *pArr); //将数组倒置
void sort_arr(struct Arr *pArr); //将数组中的元素排序
int main (void)
{
int val;
struct Arr arr;
init_arr (&arr,6);
show_arr (&arr);
append_arr(&arr,1);
append_arr(&arr,17);
append_arr(&arr,14);
show_arr (&arr);
insert(&arr,2,3);
show_arr (&arr);
delete_arr(&arr,3,&val);
show_arr (&arr);
inversion(&arr);
show_arr (&arr);
sort_arr(&arr);
show_arr (&arr);
return 0;
}
int 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;
}
return 0;
}
bool is_empty(struct Arr *pArr)
{
if(0 == pArr->cnt)
return true;
else
return false;
}
void show_arr(struct Arr *pArr)
{
if (is_empty(pArr))
{
printf("数组为空\n");
}
else
{
printf("数组元素显示如下\n");
for(int i =0; i< pArr->cnt; i++ )
{
printf("%d ", pArr->pBase[i]);
}
printf("\n");
}
}
bool is_full(struct Arr *pArr)
{
if(pArr->len == pArr->cnt)
return true;
else
return false;
}
bool append_arr(struct Arr *pArr,int val)
{
if (is_full(pArr))
{
printf("数组已满追加失败\n");
return false;
}
else
{
pArr->pBase[pArr->cnt] = val;
pArr->cnt++;
return true;
}
}
bool insert(struct Arr * pArr,int pos, int val) //在第pos个元素位置前插入值为val;
{
if(pos < 1||pos >((pArr->cnt)+1))
{
printf("在第%d个元素位置前插入值为%d失败\n",pos,val);
return false;
}
if(is_full(pArr))
{
printf("在第%d个元素位置前插入值为%d失败\n",pos,val);
return false;
}
else
{
int i;
for (i = (pArr->cnt)-1;i >= pos-1;i--)
{
pArr->pBase[i+1] = pArr->pBase[i]; //在这犯了个错误 pArri+1] = pArr[i]把结构体的地址当成了元素的地址;
}
pArr->pBase[pos-1] = val;
(pArr->cnt)++;
return true;
}
}
bool delete_arr(struct Arr *pArr,int pos,int *pVal) //删除第pos个位置的元素;
{
if(pos < 1||pos>pArr->cnt)
return false;
if(is_empty(pArr))
return false;
*pVal = pArr->pBase[pos-1];
for(int i = pos;i< pArr->cnt; i++)
pArr->pBase[i-1] = pArr->pBase[i];
pArr->cnt--;
printf("删除第%d位置元素%d成功\n",pos, *pVal);
return true;
}
void inversion(struct Arr *pArr)
{
int i = 0;
int j = pArr->cnt-1;
int t;
while(i < j)
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t; //把pArr->pBase[j]写成了pArr->pBase[pArr->cnt-1]谢谢小武发现
++i;
--j;
}
return;
}
void sort_arr(struct Arr *pArr) //运用的冒泡排序的思想;
{
int i;
int j;
int 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;
}
}
}
}
本文实现了数组连续存储的相关操作,具体实现参见以上程序设计。最后运行结果如下:
数组为空
数组元素显示如下
1 17 14
数组元素显示如下
1 3 17 14
删除第3位置元素17成功
数组元素显示如下
1 3 14
数组元素显示如下
14 3 1
数组元素显示如下
1 3 14
请按任意键继续. . .