自学第一天,茫茫然一头雾水,不过对于连续储存数组的算法判断,插入,删除,排序这些比较基本的东西了解了许多。
吃饭去了,不bb,上代码
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//定义一个结构体
struct array
{
int* pBase; //数组首地址
int cnt; //有效个数
int len; //数组长度
};
void initialize_array(struct array *, int len); //初始化数组函数
bool is_empty(struct array *); //判断数组是否为空
bool is_full(struct array*); //判断数组是否已满
bool append_array(struct array*, int); //追加元素
bool insert_array(struct array*, int pos, int); //插入元素,pos指的是第pos个元素
bool delete_array(struct array*, int pos, int *);//删除元素,bool函数要返回一个值需要用指针
void inversion_array(struct array*); //倒置数组
void sort_array (struct array*); //排序
void out_array(struct array *); //输出数组
int main()
{
struct array Array;
initialize_array(&Array, 9);
out_array(&Array);
append_array(&Array, 1);
append_array(&Array, 21);
append_array(&Array, 3);
append_array(&Array, 48);
append_array(&Array, 56);
append_array(&Array, 62);
append_array(&Array, 7);
append_array(&Array, 87);
out_array(&Array);
insert_array(&Array, 1, 5);
out_array(&Array);
int val;
delete_array(&Array, 5, &val);
out_array(&Array);
printf("the %d is deleted\n", val);
inversion_array(&Array);
out_array(&Array);
sort_array (&Array);
out_array(&Array);
return 0;
}
void initialize_array(struct array * pArray, int len)
{
//确定长度动态分配空间并返回首地址
pArray->pBase = (int*)malloc(sizeof(int)*len);
if (NULL == pArray->pBase)
{
printf("Allocation failed");
exit(-1);//exit(0) 表示程序正常退出,exit⑴/exit(-1)表示程序异常退出。
}
else
{
pArray->len=len;
pArray->cnt=0;
}
return;
}
bool is_empty(struct array * pArray)
{
if (0 == pArray->cnt)
return true;
else
return false;
}
bool is_full(struct array* pArray)
{
if (pArray->cnt == pArray->len)
{
printf("Array is full.\n");
return false;
}
else
return true;
}
bool append_array(struct array* pArray, int val)
{
if ( is_full(pArray) == true)
{
pArray->pBase[pArray->cnt]=val;
pArray->cnt++;
}
else
{
return false;
}
return true;
}
bool insert_array(struct array* pArray, int pos, int val)
{
if ( is_full(pArray) ==false)
return false;
else if (pos<0 || pos > pArray->cnt)
return false;
else
{
for (int i = pArray->cnt; i>=pos; i-- )
//视屏中for (int i = pArray->cnt-1; i>=pos; i-- ) pArray->pBase[i+1] = pArray->pBase[i];但是如果这样写的话,输出的结果第pos+1个没有改变。
//是因为当i=3时,结束了,但是pArray->pBase[3+1] = pArray->pBase[3];即pArray->pBase[4] = pArray->pBase[3]是没有的,被漏掉了
//mb看错了视屏里的for是i>=pos-1。。。for (int i = pArray->cnt-1; i>=pos-1; i-- ) pArray->pBase[i+1] = pArray->pBase[i];是正确的
//i是下标,pos-1是数组最后一个元素的下标,思维就是后一个下标的元素等于这个下标的元素达到后移的目的,第七个等于第六个,第六个等于第五个
//本程序是第i个元素等于第i-1个元素达到后移的目的
//我还是喜欢我这个
{
pArray->pBase[i] = pArray->pBase[i-1];
}
pArray->pBase[pos-1] = val;
pArray->cnt ++;
return true;
}
}
bool delete_array(struct array* pArray, int pos, int* val)
{
if (pos<0 || pos>pArray->cnt)
{
printf("pos isn't in the pArray.\n");//bool函数中的printf是有效的
return false;
}
else if ( is_empty(pArray) )
{
printf("The array is empty");
return 0;
}
*val = pArray->pBase[pos-1];
for (int i=pos; i<pArray->cnt; i++)
pArray->pBase[i-1] = pArray->pBase[i];
pArray->cnt--;
return 1;
}
void inversion_array(struct array* pArray)//独立思考完成,礼貌合掌
{
int i=0, t, n;
n = pArray->cnt-1;
if ( is_empty(pArray) )
{
printf ("The array is empty");
}
while(n > i)
{
t = pArray->pBase[n];
pArray->pBase[n] = pArray->pBase[i];
pArray->pBase[i] = t;
n--;
i++;
};
return;
}
void sort_array (struct array*pArray)
{
int i, j, k;
if ( is_empty(pArray) )
{
printf ("The array is empty");
}
for (i=0; i<pArray->cnt; i++)
for(j=i+1;j<pArray->cnt; j++)
if(pArray->pBase[i]<pArray->pBase[j])
{
k=pArray->pBase[j];
pArray->pBase[j]=pArray->pBase[i];
pArray->pBase[i]=k;
}
return;
}
void out_array(struct array * pArray)
{
if(is_empty(pArray))
printf("The array is empty\n");
else
for (int i=0; i<pArray->cnt; i++)
{
printf("Number %d is %d\n", i+1,pArray->pBase[i]);
}
printf("Valid number is %d \n\n", pArray->cnt);
return;
}