数组采取连续存储,代码定义了一个结构体,里面包含数组的信息,实现代码如下:
#include <stdio.h>
#include <malloc.h>
void init(struct array *arr, int length); //初始化
int add(struct array *arr, int item); //添加元素
int remove(struct array *arr, int address, int *removeItem); //删除元素
void sort(struct array *arr); //排序(升序)
void show(struct array *arr); //显示所有元素
int insert(struct array *arr, int address, int item); 插入元素
int reverse(struct array *arr); //倒序
struct array
{
int *pBase; //第一个元素的地址
int len; //数组的总长度
int allnum; //数组当前元素的个数
};
void main()
{
struct array arr;
int bo = 1;
int choose;
int length;
int item;
int address;
int removeItem;
while(bo == 1)
{
printf("对此数组提供以下功能:\n");
printf("1. 初始化\n");
printf("2. 添加元素\n");
printf("3. 插入元素\n");
printf("4. 删除元素\n");
printf("5. 倒序\n");
printf("6. 排序\n");
printf("7. 显示所有元素\n");
printf("请选择要进行的操作(选0退出):");
scanf("%d", &choose);
switch(choose)
{
case 1:
printf("请输入要初始化的长度:");
scanf("%d", &length);
init(&arr, length);
printf("初始化成功!\n\n");
break;
case 2:
printf("请输入要添加的元素:");
scanf("%d", &item);
add(&arr, item);
break;
case 3:
while(1)
{
printf("请输入要插入的位置: ");
scanf("%d", &address);
if(address > arr.allnum+1 || address <=0)
{
printf("不在范围内, 请重新输入!\n");
continue;
}
break;
}
printf("请输入要插入的元素: ");
scanf("%d", &item);
insert(&arr, address, item);
break;
case 4:
printf("请输入要删除的元素的位置:");
scanf("%d", &address);
if(address > arr.allnum || address <= 0)
{
printf("要删除的元素不在范围内!");
}
else
{
remove(&arr, address, &removeItem);
printf("成功删除数字%d\n\n", removeItem);
}
break;
case 5:
reverse(&arr);
break;
case 6:
sort(&arr);
break;
case 7:
show(&arr);
break;
default:
exit(-1);
}
}
}
//初始化
void init(struct array *arr, int length)
{
arr->pBase = (int*)malloc(sizeof(int) * length);
arr->len = length;
arr->allnum = 0;
}
//添加元素
int add(struct array *arr, int item)
{
if(arr->allnum < arr->len)
{
arr->pBase[arr->allnum] = item;
arr->allnum++;
printf("添加成功!\n\n");
return 1;
}
else
{
printf("数组已满,无法添加!\n\n");
return 0;
}
}
//插入元素
int insert(struct array *arr, int address, int item)
{
int i;
if(arr->allnum < arr->len)
{
for(i=arr->allnum; i>=address; i--)
{
arr->pBase[i] = arr->pBase[i-1];
}
arr->pBase[address-1] = item;
printf("插入成功!\n\n");
arr->allnum++;
return 1;
}
else
{
printf("数组已满,无法插入!\n\n");
return 0;
}
}
//倒序
int reverse(struct array *arr)
{
int i;
int temp;
int index = arr->allnum/2;
if(arr->allnum == 0)
{
printf("数组为空!\n\n");
return 0;
}
for(i=0; i<index; i++)
{
temp = arr->pBase[i];
arr->pBase[i] = arr->pBase[arr->allnum-(i+1)];
arr->pBase[arr->allnum-(i+1)] = temp;
}
printf("倒序成功!\n\n");
return 1;
}
//排序
void sort(struct array *arr)
{
int i, j, temp;
if(arr->allnum == 0)
{
printf("数组为空!\n\n");
return;
}
else
{
for(i=0; i<arr->allnum; i++)
{
for(j=i+1; j<arr->allnum; j++)
{
if(arr->pBase[i] > arr->pBase[j])
{
temp = arr->pBase[i];
arr->pBase[i] = arr->pBase[j];
arr->pBase[j] = temp;
}
}
}
printf("排序成功!\n\n");
}
}
//删除元素
int remove(struct array *arr, int address, int *removeItem)
{
int i;
if(arr->allnum == 0)
{
printf("数组为空!\n\n");
return 0;
}
else
{
*removeItem = arr->pBase[address-1]; //将被删除的数保存在removeItem中
for(i=address; i<arr->allnum; i++)
{
arr->pBase[i-1] = arr->pBase[i];
}
arr->allnum--;
return 1;
}
}
//查看所有元素
void show(struct array *arr)
{
int i;
for(i=0; i<arr->allnum; i++)
{
printf("%d ", arr->pBase[i]);
}
printf("\n\n");
}