连续存储数组的算法演示

上课不仔细听讲的兔期末前的看课学习

通过学习郝斌老师的数据结构视频课,悲惨的兔终于有了点进步

这里分享一个老师演示的一串代码(兔跟着敲了好久,头秃了QAQ)

#include <stdio.h>
#include <stdbool.h>//bool的头文件
#include <malloc.h>//malloc的头文件
#include <string.h>//sizeof的头文件
#include <stdlib.h>//exit的头文件

//定义一个数据类型,有三个成员
struct Arr //数组
{
    int * pBase;//存储的数组第一个元素地址
    int len;//数组所能容纳的最大元素个数
    int cnt;//有效元素个数
};

//分号不能省略
void init_arr(struct Arr * pArr,int length);//初始化
bool append_arr(struct Arr * pArr,int val);//追加
bool insert_arr(struct Arr * pArr,int pos,int val);//插入  pos从1开始   且在第pos前插入一个元素
bool delete_arr(struct Arr * pArr,int pos,int * pVal);//删除
int get(struct Arr * pArr,int pos,int * pVal);//获取下标为啥的值
bool is_empty(struct Arr * pArr);//判断是否空
bool is_full(struct Arr * pArr);//判断是否满
void sort_arr(struct Arr * pArr);//排序
void show_arr(struct Arr * pArr);//显示
void inversion_arr(struct Arr * pArr);//倒置

int main()
{
    struct Arr arr;

    int val;

    int kk;

    init_arr(&arr,10);

    printf("刚分好内存后显示数组:\n");
    show_arr(&arr);
   // printf("%d",arr.len);

    append_arr(&arr,1);
    append_arr(&arr,6);
    append_arr(&arr,8);
    append_arr(&arr,4);
    append_arr(&arr,3);
    append_arr(&arr,5);
    append_arr(&arr,7);
    append_arr(&arr,9);
    append_arr(&arr,10);

    printf("显示数组元素:\n");
    show_arr(&arr);

    printf("测试删除数组元素有:\n");
    if(delete_arr(&arr,2,&val))
    {
        printf("删除成功!\n");
        printf("您删除的元素是:%d\n",val);
    }
    else
    {
        printf("删除失败!\n");
    }


   /* append_arr(&arr,2);
    append_arr(&arr,3);
    append_arr(&arr,4);
    append_arr(&arr,5);
    append_arr(&arr,6);
    append_arr(&arr,7);

    insert_arr(&arr,7,99);

    /*if(append_arr(&arr,8))
    {
        printf("追加成功!\n");
    }
    else
    {
        printf("追加失败!\n");
    }
    */

    printf("显示删除后的数组元素:\n");
    show_arr(&arr);

    printf("get到的位置的数为:\n");
    printf("%d\n",get(&arr,6,&kk));

    inversion_arr(&arr);
    printf("倒置是:\n");
    show_arr(&arr);

    printf("get到的位置的数为:\n");
    printf("%d\n",get(&arr,6,&kk));

    sort_arr(&arr);
    printf("排序有:\n");
    show_arr(&arr);

    printf("get到的位置的数为:\n");
    printf("%d\n",get(&arr,6,&kk));

    return 0;
}

void init_arr(struct Arr * 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;
}

bool is_empty(struct Arr * pArr)
{
    if(0 == pArr->cnt)
        return true;
    else
        return false;
}

bool is_full(struct Arr * pArr)
{
    if(pArr->cnt == pArr->len)
        return true;
    else
        return false;
}

bool append_arr(struct Arr * pArr,int val)
{
    //满时返回false
    if(is_full(pArr))
        return false;

    //不满时追加
    pArr->pBase[pArr->cnt] = val;
    (pArr->cnt)++;
    return true;
}

void show_arr(struct Arr * pArr)
{
    if( is_empty(pArr))//pArr已经就是地址
    {
        printf("数组为空!\n");
    }
    else
    {
        for(int i = 0;i < pArr->cnt; ++i)
            printf("%d ",pArr->pBase[i]);//pArr是结构体变量的名字\地址,pArr->pbase才是
            printf("\n");
    }
}

bool insert_arr(struct Arr * pArr,int pos,int val)
{
    int i;

    if(is_full(pArr))
        return false;

    if(pos < 1 || pos > pArr->cnt + 1)  //在pos前插入
        return false;

    for(i = pArr->cnt - 1;i >= pos - 1;--i)
    {
        pArr->pBase[i +1] = pArr->pBase[i];
    }
    pArr->pBase[pos - 1] = val;
    (pArr->cnt)++;
    return true;
}

bool delete_arr(struct Arr * pArr,int pos,int * pVal)
{
    if(is_empty(pArr))
        return false;

     *pVal = pArr->pBase[pos - 1];
    if(pos < 1 || pos > pArr->cnt)
        return false;

    for(int i = pos;i < pArr->cnt;++i)
    {
        pArr->pBase[i - 1] = pArr->pBase[i];
    }
    (pArr->cnt)--;
    return true;
}

void inversion_arr(struct Arr * pArr)
{
    int i = 0;
    int j = pArr->cnt - 1;
    int t;

    if(i < j)
    {
        t = pArr->pBase[i];
        pArr->pBase[i] = pArr->pBase[j];
        pArr->pBase[j] = t;
        ++i;
        --j;
    }
    return;
}

void sort_arr(struct Arr * pArr)
{
    int i,j;
    int t;

    for(i = 0;i < pArr->cnt;i++)
    {
           for(j = i + 1;j < pArr->cnt;j++)
        {
            if(pArr->pBase[i] > pArr->pBase[j])
            {
                t = pArr->pBase[i];
                pArr->pBase[i] = pArr->pBase[j];
                pArr->pBase[j] = t;
            }
        }
    }

}

int get(struct Arr * pArr,int pos,int * pVal)
{
    if(is_empty(pArr))
        return false;

    if(pos < 1 || pos > pArr->cnt)
        return false;

     * pVal = pArr->pBase[pos - 1];

    return * pVal;

}

下图是兔在codeblock上编译的结果

 兔学到了很多,也非常感谢郝斌老师

兔会继续努力的!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值