极客时间数据结构与算法之美王峥05课C语言数组array算法解析源码解读

极客时间数据结构与算法之美王峥05课C语言数组array算法解析源码解读
https://github.com/wangzheng0822/algo/blob/master/c-cpp/05_array/array.c

#include 
//输入输出相关
#include 
//c 标准库
#include 
//字符串操作

struct array {
    int size;
    int used;
    int *arr;
};
//定义一种数据类型 叫做 array 大小是 size 已经用掉的空间是used 这个数据内存地址的首地址 arr

void dump(struct array *array)
//array 是 struct array * 类型的指针 指向存储数据的首地址
{
    int idx;

    for (idx = 0; idx < array->used; idx++)
        printf("[%02d]: %08d\n", idx, array->arr[idx]);
    //循环输出结构体数组里面的每一个值
}

void alloc(struct array *array)
{
    array->arr = (int *)malloc(array->size * sizeof(int));
    //malloc动态分配array->size * sizeof(int)大小的内存空间,返回这个空间的首地址
}

int insert(struct array *array, int elem)
{
    int idx;
    if (array->used >= array->size)
        //当使用的空间和申请好的空间大小大于或者相等时不能插入
        return -1;

    //当使用的空间小于申请好的空间时能插入
    for (idx = 0; idx < array->used; idx++) {
        if (array->arr[idx] > elem)
            //这个数据组时有序的数组,这条语句可以保证每个数据插入的同时时有序的
            break;
    }
    //当 array->arr[idx] <=  elem 的时候 就可以将数据存储到数组里面了
    if (idx < array->used)
        memmove(&array->arr[idx+1], &array->arr[idx],(array->used - idx) * sizeof(int));
        //这个函数的第一个参数&array->arr[idx+1]是目标数据存放起始地址,第二个参数&array->arr[idx]是原数据起始地址,(array->used - idx) * sizeof(int)是要移动数据总的字节数。
    array->arr[idx] = elem;
    //经过了上面层层筛选终于可以正常插入了
    array->used++;
    //更新数据已经使用的大小
    return idx;
}

int delete_c(struct array *array, int idx)
        //delete是关键字,要换成其他的,如:delete_c
{
    if (idx < 0 || idx >= array->used)
        //如果删除数据的下标idx 小于零,或者大于已经使用的值时,不能删除。
        return -1;
    memmove(&array->arr[idx], &array->arr[idx+1],(array->used - idx) * sizeof(int));
    //将删除位置之后的所有元素向前移动一个位置
    array->used--;
    //更新已经使用的空间值
    return 0;
}

int search(struct array *array, int elem)
{
    int idx;

    for (idx = 0; idx < array->used; idx++) {
        //从头开始遍历数组中每一个元素,
        if (array->arr[idx] == elem)
            //找到相等的值
            return idx;
        if (array->arr[idx] > elem)
            //因为数组是有序的所以不可能出现顺序遍历后已经存在的值大于要索引的值,不知到理解的对不对
            //更正理解 这里是作者想要实现实现的功能 不存在 就返回 -1 感觉应该加一个 小于的情况 哈哈
            return -1;
    }

    return -1;
}

int main()
{
    int idx;
    struct array ten_int = {10, 0, NULL};
    //创建结构体类型的数据 ten_int, 大小是10 已经使用的空间是0 ,存储的位置初始是null

    alloc(&ten_int);
    //在内存中分配空间 地址是&ten_int
    if (!ten_int.arr)
        //分配失败
        return -1;
    insert(&ten_int, 1);
    //插入1
    insert(&ten_int, 4);
    insert(&ten_int, 8);
    printf("=== insert 1, 3, 2\n");
    dump(&ten_int);
//顺序输出每个元素
    idx = search(&ten_int, 2);//查找元素2的下标
    printf("2 is at position %d\n", idx);
    idx = search(&ten_int, 9);
    printf("9 is at position %d\n", idx);

    printf("=== delete [6] element \n");
    delete_c(&ten_int, 6);
    dump(&ten_int);
    printf("=== delete [0] element \n");
    delete_c(&ten_int, 0);//删除下标为0的值
    dump(&ten_int);
    return 0;
}

编译器 clion 201803 MinGw 执行时 要去掉注释 才能运行 否则会报错

E:\CLionProjects\algo_c++\cmake-build-debug\algo_c__.exe
=== insert 1, 3, 2
[00]: 00000001
[01]: 00000002
[02]: 00000003
2 is at position 1
9 is at position -1
=== delete [6] element
[00]: 00000001
[01]: 00000002
[02]: 00000003
=== delete [0] element
[00]: 00000002
[01]: 00000003

Process finished with exit code 0

你可能感兴趣的:(数据结构,算法)