C语言数据结构学习笔记(2)--数组

/*
数组
@liuxinquan
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
//定义数组
struct Arr
{
    int len;    //数组长度
    int cnt;    //有效个数
    int *pBase; //数组首地址
};
//初始化
void init_arr(struct Arr *array, int length)
{
    array->pBase = (int *)malloc(sizeof(int)*length);
    if(NULL == array->pBase)
    {
        printf("分配为空\n");
        exit(-1);
    }
    else
    {
        array->cnt = 0;
        array->len = 100;//自由指定长度
    }
    return;
}
//判断是否为空
bool is_empty(struct Arr *pArr)
{
    if(pArr->cnt == 0)
        return true;
    else
        return false;
}
//判断是否为满
bool is_full(struct Arr *pArr)
{
    if(pArr->len == pArr->cnt)
        return true;
    else
        return false;
}
//输出数组
int show_arr(struct Arr *pArr)
{
    int i;
    if(is_empty(pArr))
    {
        printf("数组为空\n");
    }
    else
    {
        for(i=0; i<pArr->cnt; i++)
            printf("%d  ", pArr->pBase[i]);

    }
    printf("\n");
    return;
}
//追加元素
bool append_arr(struct Arr *pArr, int val)
{
    if(is_full(pArr))
    {
        printf("追加失败\n");
        return false;
    }
    else
    {
        pArr->pBase[pArr->cnt] = val;   //数组末尾赋值
        (pArr->cnt)++;  //长度加1
        return true;
    }

}
//在指定位置的前面插入元素 
bool insert_arr(struct Arr *pArr, int pos, int val)
{
    int i;

    if(is_full(pArr))
    {
         printf("数组已满\n");
         return false;
    }


    if(pos<1 || pos>pArr->cnt+1)
    {
        printf("插入失败\n");
        return false;
    }

    //最后一位到插入位置元素往后移
    for(i=pArr->cnt; i>=pos; i--)
    {
        pArr->pBase[i] = pArr->pBase[i-1];

    }
        
    pArr->pBase[pos-1] = val;
    pArr->cnt++;
    return true;
}
bool del_arr(struct Arr *pArr, int pos, int *pVal)
{
    int i;

    if(is_empty(pArr))
    {
        return false;
    }
    if(pos<1 || pos>pArr->cnt)
    {
        return false;
    }
    *pVal = pArr->pBase[pos-1]; //储存删除的元素
    //删除位置到最后一位往前移动
    for(i=pos; i<pArr->cnt; i++)
    {
        pArr->pBase[i-1] = pArr->pBase[i];

    }
     pArr->cnt--;
     return true;
}
//把数组元素倒过来
void inver_arr(struct Arr *pArr)
{
    int i = 0;
    int j = pArr->cnt-1;
    int t;
    while(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;
    int j;
    int t;
    for(j=1; j<pArr->cnt; j++)
    {
        for(i=0; i<pArr->cnt-j; i++)
        {
            if(pArr->pBase[i]>pArr->pBase[i+1])
            {
                t =pArr->pBase[i];
                pArr->pBase[i] = pArr->pBase[i+1];
                pArr->pBase[i+1] = t;
            }
        }
    }
    return ;
}
//主程序测试
int main(void)
{
    int val;
    struct Arr arr;

    init_arr(&arr, 5);
    show_arr(&arr);
    append_arr(&arr, 1);
    append_arr(&arr, 2);
    append_arr(&arr, 3);
    append_arr(&arr, 4);
    append_arr(&arr, 5);
    show_arr(&arr);
    insert_arr(&arr, 5, 88);
    show_arr(&arr);
    if(del_arr(&arr, 2, &val))
    {
         printf("删除成功\n");
         printf("你删除的元素是:%d\n", val);
    }
    else
    {
        printf("删除失败\n");
    }
    show_arr(&arr);
    inver_arr(&arr);
    show_arr(&arr);
    sort_arr(&arr);
    show_arr(&arr);

    return;

}


你可能感兴趣的:(数据结构,算法,冒泡排序,数组,学习笔记)