数组插入,删除,增加,排序等程序

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Arr
{
    int * pBase;//保存数组第一个元素的地址
    int len;//数组的长度
    int cnt;//数组的有效个数
}Array;
typedef int bool;
#define true 0
#define false 1
void init_arr(Array *);//数组初始化
void show_arr(Array *);//输出
bool is_empty(Array *);//判断是否为空
bool is_full(Array *);//判断是否为满
bool append_arr(Array *, int);//追加数组
bool insert_arr(Array *, int, int);//插入数组
bool delete_arr(Array *, int);
void sort(Array *, int, int);//数组快排
void sort2(Array *);//数组冒泡排序
void invision(Array *);//数组倒置
int main(void)
{
    Array arr;
    printf("请输入数组的长度:");
    scanf("%d",&arr.len);
    printf("\n");
    init_arr(&arr);
    show_arr(&arr);

    append_arr(&arr,49);
    append_arr(&arr,38);
    append_arr(&arr,76);
    append_arr(&arr,54);
    append_arr(&arr,97);
    append_arr(&arr,20);
    append_arr(&arr,19);
    append_arr(&arr,66);
    printf("------------------------------------追加数组------------------------------------\n");
    printf("\n");
    show_arr(&arr);
    printf("\n");
    printf("------------------------------------插入数组------------------------------------\n");
    printf("\n");
    insert_arr(&arr,2,88);
    insert_arr(&arr,3,99);
    show_arr(&arr);
    printf("------------------------------------快速排序------------------------------------\n");
    printf("\n");
    sort(&arr,0,arr.cnt-1);
    show_arr(&arr);
    printf("------------------------------------冒泡排序------------------------------------\n");
    printf("\n");
    sort2(&arr);
    show_arr(&arr);
    printf("------------------------------------倒置数组------------------------------------\n");
    printf("\n");
    invision(&arr);
    show_arr(&arr);
    printf("------------------------------------删除数组------------------------------------\n");
    printf("\n");
    delete_arr(&arr,3);
    show_arr(&arr);
    return 0;
}
void init_arr(Array * pArr)
{
    pArr->pBase=(int *)malloc(sizeof(int)*pArr->len);
    if(pArr->pBase==NULL)
    {
        printf("内存分配失败!\n");
        exit(-1);
    }
    else
        pArr->cnt=0;
    return;
}
bool is_empty(Array * pArr)
{
    if(pArr->cnt==0)
        return true;
    else
        return false;
}
void show_arr(Array * pArr)
{
    int i;
    if( !is_empty(pArr) )
        printf("数组为空!\n");
    else
    {
        for(i=0;i<pArr->cnt;++i)
            printf("%d\t",pArr->pBase[i]);
    }
    printf("\n");
        return;
}
bool is_full(Array * pArr)
{
    if(pArr->cnt>pArr->len-1)
        return false;
    else
        return true;

}
bool append_arr(Array * pArr,int val)
{
    //pArr->pBase[0]=23;cnt=1;
    //pArr->pBase[1]=46;cnt=2;
    if( !is_full(pArr) )
    {
        pArr->pBase[pArr->cnt]=val;
        ++pArr->cnt;
        //printf("cnt=%d\n",pArr->cnt);
        return true;
    }
    else
    {
        printf("数组已满,其余的无法追加!\n");
        return false;
    }
        
}
bool insert_arr(Array * pArr, int pos, int val)
{
    int i;
    if( is_full(pArr) )
        return false;
    else
    {
        for(i=pArr->cnt-1;i>=pos-1;--i)//pos下标从1开始
        {
            pArr->pBase[i+1]=pArr->pBase[i];
        }
        pArr->pBase[pos-1]=val; 
        ++pArr->cnt;
        return true;
    }
}
//快速排序
void sort(Array * pArr, int left, int right)
{
    
    int i=left;
    int j=right;
    int key=pArr->pBase[left];
    if(left>=right)
        return;
    while(i<j)
    {
        while(i<j && pArr->pBase[j]>key)
            --j;
            //temp=key;
            //key=pArr->pBase[j];
            //pArr->pBase[j]=temp;
        pArr->pBase[i]=pArr->pBase[j];

        while(i<j && key>pArr->pBase[i] )
            ++i;
        pArr->pBase[j]=pArr->pBase[i];

    }
    pArr->pBase[i]=key;
    sort(pArr,left,i-1);
    sort(pArr,i+1,right);
}
//冒泡排序
void sort2(Array * pArr)
{
    int i,j,temp;
    for(i=0;i<pArr->cnt-1;++i)//i是排序多少次
    {
        for(j=0;j<pArr->cnt-i-1;++j)//j是用来前后排序的
        {
            if(pArr->pBase[j]>pArr->pBase[j+1])
            {
                temp=pArr->pBase[j];
                pArr->pBase[j]=pArr->pBase[j+1];
                pArr->pBase[j+1]=temp;
            }
        }
    }
}
//倒置数组
void invision(Array * pArr)
{
    int i=0;
    int j=pArr->cnt-1;
    int temp;
    while(i<j)
    {
        temp=pArr->pBase[i];
        pArr->pBase[i]=pArr->pBase[j];
        pArr->pBase[j]=temp;
        ++i;
        --j;
    }
}
bool delete_arr(Array * pArr, int pos)//pos下标从1开始
{
    int i;
    if(pos-1>=pArr->cnt)
        return false;
    for(i=pos-1;i<=pArr->cnt-1;++i)
        pArr->pBase[i]=pArr->pBase[i+1];
    --pArr->cnt;
    return true;
}

 

posted @ 2016-11-30 09:09  feng_kui  阅读(724)  评论(0编辑  收藏  举报