我们下面建立的数组包括:
1.初始化
2.遍历
3.插入
4.添加
5.弹出(pop)
6.判断是否为空
7.判断是否为满
由于Dev C++的c语言项目中是没有布尔类型的,所以我们用整数0和1来代替False和True
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Array
{
int * pHead;//数组第一个元素的地址!
int len;//数组的最大长度
int cnt;//数组的现在的有效长度。
}arr,*parr;
void init_(parr);//要返回第一个元素的地址
void traverse(parr);
void insert(parr,int,int);//插入,在哪个数组中在哪个坐标插入一个什么数
void append(parr,int);//添加,数组末尾添加数据
int pop(parr,int);//删除在坐标X上的数据
void sort(parr);//进行排序
int isempty(parr);//判断是否为空
int isfull(parr);//判断是否为满
int main(void)
{
arr a;
init_(&a);
traverse(&a);
int b = pop(&a,2);
printf("%d\n",b);
int c = pop(&a,2);
printf("%d\n",c);
traverse(&a);
insert(&a,1,100);
traverse(&a);
sort(&a);
traverse(&a);
append(&a,1028);
traverse(&a);
}
void init_(parr p)//初始化
{
int len,i;//len用来接受数组最大长度的值
printf("请输入需要创立的数组的长度:\n");
scanf("%d",&len);
if(len == 0)
{
printf("数组长度为零无法继续建立\n");
return;
}
p->len = len;
p->cnt = 0;//还没加入元素,目前数组的有效长度为0
p->pHead = (int*)malloc(sizeof(int)*len);//分配内存空间,数组结构体的指针指向第一个元素地址
if (p->pHead != NULL)//如果分配内存成功
{
for(i=0;i<len;i++)
{
printf("请输入坐标为%d的数据的值:\n",i);
scanf("%d",(p->pHead + i));
p->cnt++;
}
}
else//如果分配内存失败
{
printf("分配内存失败,程序终止\n");
exit(-1);
}
}
void traverse(parr p)//遍历
{
int i;
for(i=0;i<p->cnt;i++)
{
printf("%d ",p->pHead[i]);
}
printf("\n");
}
int isempty(parr p)//判断是否为空
{
if (p->cnt == 0)
{
return 1;
}
else
{
return 0;
}
}
int isfull(parr p)//判断是否为满
{
if(p->len == p->cnt)
{
return 1;
}
else
{
return 0;
}
}
void insert(parr p,int ip,int val)//插入操作,第一个整数为要插入的坐标,第二个整数为要插入的值
{
int i;
if(isfull(p))//如果数组满了,就不能插入
{
printf("数组已满,无法进行插入操作!\n");
return;
}
else
{
if(ip<0 || ip > p->cnt)
{
printf("插入位置不符合规范!\n");
return;
}
else
{
for(i=p->cnt-1;i>=ip;i--)
{
p->pHead[i+1] = p->pHead[i];//对坐标ip之后的元素往后移动
}
p->pHead[ip] = val;
p->cnt++;//有效长度要加上一
}
}
}
int pop(parr p,int ip)//弹出,返回一个坐标为ip的值
{
int i,r_val;
if(ip<0 || ip>p->cnt-1)//如果弹出的坐标超出有效范围
{
printf("删除的位置不符合规范!\n");
return;
}
if(isempty(p))//如果数组为空,那么无法进行弹出操作
{
printf("列表为空无法进行pop操作!\n");
return;
}
else
{
r_val = p->pHead[ip];
for(i=ip;i<=p->cnt-2;i++)
{
p->pHead[i] = p->pHead[i+1];//把ip之后的元素往前移动
}
}
p->cnt--;//有效长度要减去一
return r_val;//返回值
}
void sort(parr p)//排序
{
int i,j,t;
for(i=0;i<=p->cnt-2;i++)//升序排列
{
for(j=i+1;j<=p->cnt-1;j++)//使得坐标ip上都是自ip之后的最小值
{
if(p->pHead[i]>p->pHead[j])
{
t = p->pHead[i];
p->pHead[i] = p->pHead[j];
p->pHead[j] = t;
}
}
}
}
void append(parr p,int val)//添加操作,只能在数组的尾部添加
{
if(isfull(p))
{
printf("数组已满,无法进行添加操作!\n");
return;
}
else
{
p->pHead[p->cnt] = val;
p->cnt++;//有效长度要加一
}
}