/*
* 根据郝斌老师视频整理
* 编译环境:
* guo@linux:~$ gcc --version
* gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
*/
#include <stdio.h>
#include <malloc.h> /*malloc()*/
#include <stdlib.h> /*exit()*/
#define FALSE 0
#define TRUE 1
typedef struct Array
{
int *pBase; /*存储数组第一个元素的地址*/
int len; /*数组能容纳的有效元素的个数*/
int cnt; /*当前数组有效元素的个数*/
// int increment; /*自动增长因子,需要allocate()函数*/
}ARRAY;
/**************************声明*******************************/
/*初始化数组*/
void InitArray(ARRAY *, int );
/*数组追加元素*/
int AppendArray(ARRAY *, int );
/*数组插入元素*/
int InsertArray(ARRAY *, int , int );
/*数组删除元素*/
int DeleteArray(ARRAY *, int, int *);
/*获得元素*/
int get(ARRAY *,int , int *);
/*判断数组是否为空*/
int IsEmpty(ARRAY *);
/*判断数组是否已满*/
int IsFull(ARRAY *);
/*数组排序*/
void SortArray(ARRAY *);
/*显示数组*/
void ShowArray(ARRAY *);
/*倒置数组*/
void InversionArray(ARRAY *);
/*
* 函数名称:InitArray。
* 函数说明:初始化数组,为数组分配内存,并确定长度。
* 输入参数:pArr数组首地址,length数组长度。
* 输出参数:无。
*/
void InitArray(ARRAY *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;
}
/*
* 函数名称:IsEmpty。
* 函数说明:判断数组是否为空。
* 输入参数:pArr数组首地址。
* 输出参数:如果数组为空,返回TRUE;否则返回FALSE。
*/
int IsEmpty(ARRAY *pArr)
{
if (0==pArr->cnt)
return TRUE;
else
return FALSE;
}
/*
* 函数名称:IsFull。
* 函数说明:判断数组是否为满。
* 输入参数:pArr数组首地址。
* 输出参数:如果数组为满,返回TRUE;否则返回FALSE。
*/
int IsFull(ARRAY *pArr)
{
if (pArr->len == pArr->cnt)
return TRUE;
else
return FALSE;
}
/*
* 函数名称:AppendArray。
* 函数说明:数组追加元素。
* 输入参数:pArr数组首地址,val要追加的值。
* 输出参数:如果数组为满,返回FALSE;追加成功返回TRUE。
*/
int AppendArray(ARRAY *pArr,int val)
{
if ( IsFull(pArr) )
return FALSE;
pArr->pBase[pArr->cnt] = val;
pArr->cnt++;
return TRUE;
}
/*
* 函数名称:InsertArray。
* 函数说明:插入元素,如果数组只有3个元素,可以插入到第4个元素位置。
* 输入参数:pArr数组首地址;position要插入的位置,从1开始;val要插入的值。
* 输出参数:如果数组为满或下标越界或没有存储那么多元素,返回FALSE;插入成功返回TRUE。
*/
int InsertArray(ARRAY *pArr, int position, int val)
{
int i;
if ( IsFull(pArr) )
return FALSE; /*数组已满*/
if (position<1 || position>pArr->len)
return FALSE; /*下标越界*/
if (position>pArr->cnt+1)
return FALSE; /*没存储那么多元素*/
/*在位置position后的元素都向后移动一位*/
for (i=pArr->cnt;i>=position;--i)
{
pArr->pBase[i] = pArr->pBase[i-1];
}
pArr->pBase[position-1] = val;
pArr->cnt++;
return TRUE;
}
/*
* 函数名称:DeleteArray。
* 函数说明:删除元素。
* 输入参数:pArr数组首地址;position要删除的位置;val存储要删除的值。
* 输出参数:如果数组为满或下标越界或没有存储那么多元素,返回FALSE;删除成功返回TRUE。
* 删除成功前,先存储要删除的元素。
*/
int DeleteArray(ARRAY *pArr, int position, int *val)
{
int i;
if ( IsEmpty(pArr) )
return FALSE; /*数组为空*/
if (position<1 || position>pArr->len)
return FALSE; /*下标越界*/
if (position > pArr->cnt)
return FALSE; /*数组未存储那么多元素*/
*val = pArr->pBase[position-1];
for (i=position-1;i<pArr->cnt;++i)
{
pArr->pBase[i] = pArr->pBase[i+1];
}
pArr->cnt--;
return TRUE;
}
/*
*
*/
int get(ARRAY *pArr, int i, int *val)
{
if (i<1 || i>pArr->cnt)
return FALSE;
*val = pArr->pBase[i-1];
return TRUE;
}
/*
* 函数名称:InversionArray。
* 函数说明:倒置数组。
* 输入参数:pArr数组首地址。
* 输出参数:无。
*/
void InversionArray(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;
}
return;
}
/*
* 函数名称:SortArray。
* 函数说明:选择排序
* 1. 先取数组第一个元素,跟其他所有元素比较,放最小值
* 2. 再取数组第二个元素,跟其他除了第一个元素外的所有元素比较,放最小值
* 3. 依次进行,直到比较完
* 输入参数:pArr数组首地址。
* 输出参数:无。
*/
void SortArray(ARRAY *pArr)
{
int i, j, temp;
for (i=0;i<pArr->cnt-1;++i)
{
for (j=i+1;j<pArr->cnt;++j)
{
if (pArr->pBase[i] > pArr->pBase[j])
{
temp = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = temp;
}
}
}
return;
}
/*
* 函数名称:ShowArray。
* 函数说明:显示数组元素。
* 输入参数:pArr数组首地址。
* 输出参数:无。
*/
void ShowArray(ARRAY *pArr)
{
int i;
if ( IsEmpty(pArr) )
{
printf("Array is empty!\n");
}
else
{
for (i=0;i<pArr->cnt;++i)
{
printf("%d ",pArr->pBase[i]);
}
printf("\n");
}
}
int main(void)
{
int temp32;
int val;
ARRAY arr;
InitArray(&arr, 6);
printf("新建数组:\n");
printf("len=%d cnt=%d\n", arr.len, arr.cnt);
ShowArray(&arr);
printf("追加后,数组元素为:\n");
AppendArray(&arr,11);
AppendArray(&arr,22);
AppendArray(&arr,33);
AppendArray(&arr,44);
/* AppendArray(&arr,55);
AppendArray(&arr,66);
AppendArray(&arr,77);
AppendArray(&arr,88); */
ShowArray(&arr);
printf("插入后,数组元素为:\n");
temp32 = InsertArray(&arr,5,99);
if (TRUE == temp32)
{
ShowArray(&arr);
}
else
{
printf("插入错误!\n");
}
printf("删除后,数组元素为:\n");
temp32 = DeleteArray(&arr, 3, &val);
if (TRUE == temp32)
{
ShowArray(&arr);
printf("删除的元素是%d\n", val);
}
else
{
printf("删除错误!\n");;
}
temp32 = get(&arr, 5, &val);
if (temp32)
{
printf("第%d个元素是%d.\n", 5, val);
}
else
{
printf("获取元素错误!\n");
}
printf("数组倒置后为:\n");
InversionArray(&arr);
ShowArray(&arr);
printf("数组按升序排列后为:\n");
SortArray(&arr);
ShowArray(&arr);
return 0;
}
|