从c小白开始自学数据结构——第一天【数组及其简单算法】

自学第一天,茫茫然一头雾水,不过对于连续储存数组的算法判断,插入,删除,排序这些比较基本的东西了解了许多。

吃饭去了,不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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值