数据结构(c语言)之动态数组

 

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define moresize 5  //数组增加长度
//动态数组
//注意:bool是c++的数据类型,标准c语言没有(但可以定义宏)
struct Arry
{
    int * pBase; //首地址
    int size;
    int cnt;

};
void init_arry(struct Arry * q,int len);  //初始化数组
bool append(struct Arry * q,int val);      //追加数组元素
bool is_empty(struct Arry * q);              //判断数组是否为空
bool is_full(struct Arry * q);              //判断数组是否满了
void show_arry(struct Arry * q);             //遍历数组
//关键是删除、插入、倒序、排序等函数
bool insert_element(struct Arry * q,int pos,int val); //位置从1开始
bool delete_element(struct Arry * q,int pos,int * val); //位置从1开始
void invert_arry(struct Arry * q);
void sort_arry(struct Arry * q);
int main()
{
    struct Arry arry;
    init_arry(&arry,5);
/*    
    append(&arry,1);
    append(&arry,2);
    append(&arry,3);
    append(&arry,4);
    append(&arry,5);
    append(&arry,6);
*/
/*    
    insert_element(&arry,1,1);
    insert_element(&arry,2,2);
    insert_element(&arry,3,3);
    insert_element(&arry,4,4);
    insert_element(&arry,5,5);
    insert_element(&arry,6,6);
*/
/*    
    int i;
    int * val=&i;
    append(&arry,1);
    append(&arry,2);
    append(&arry,3);
    show_arry(&arry);
    delete_element(&arry,2,val);
    printf("你删除的元素是:%d\n",i);
*/
/*    
    append(&arry,1);
    append(&arry,2);
    append(&arry,3);
    append(&arry,4);
    show_arry(&arry);
    invert_arry(&arry);
*/
/*    
    append(&arry,1);
    append(&arry,5);
    append(&arry,2);
    append(&arry,6);
    append(&arry,3);
    show_arry(&arry);
    sort_arry(&arry);
*/
    show_arry(&arry);
    return 0;
}
void init_arry(struct Arry * q,int len)
{
    q->pBase=(int *)malloc(sizeof(int) * len);
    if(q->pBase==NULL)
    {
        printf("动态内存分配失败\n");
        exit(-1);
    }
    q->size=len;
    q->cnt=0;
    return;
}
bool append(struct Arry * q,int val)
{
    if(is_full(q))
    {
        printf("数组满了,%d追加失败\n",val);
        return false;
    }
    //不满时追加
    q->pBase[q->cnt]=val;
    q->cnt++;
    return true;
}
bool is_empty(struct Arry * q)
{
    if(q->cnt==0)
    {
        return true;
    }
    else{
        return false;
    }
}
bool is_full(struct Arry * q)
{
    if(q->cnt==q->size)
    {
        return true;
    }
    else{
        return false;
    }
}
void show_arry(struct Arry * q)
{
    if(is_empty(q))
    {
        printf("数组为空!\n");
    }
    else
    {
        int i;
        for(i=0;i<(q->cnt);i++)
        {
            printf(" %d",q->pBase[i]);
        }
        printf("\n");
    }
}
bool insert_element(struct Arry * q,int pos,int val)
{
    //位置不合理
    if(pos<1||pos>q->size+1)
    {
        printf("插入位置不合法!\n");
        return false;
    }
    //full 则扩展内存
    if(is_full(q))
    {
        q->pBase=(int *)realloc(q->pBase,sizeof(int)*(moresize+q->size));
        if(NULL==q->pBase)
        {
            //内存分配失败
            exit(-1);
        }
        q->size+=moresize;
    }
    //先移动再插入
    int i;
    for(i=q->cnt;i>pos-1;i--)
    {
        q->pBase[i+1]=q->pBase[i];
    }
    q->pBase[pos-1]=val;
    q->cnt++;
    return true;
}
bool delete_element(struct Arry * q,int pos,int * val)
{
    if(pos<1||pos>q->cnt)
    {
        printf("删除位置不合法!\n");
        return false;
    }
    *val=q->pBase[pos-1];
    int i;
    for(i=pos-1;i<q->cnt;i++)
    {
        q->pBase[i]=q->pBase[i+1];

    }
    q->cnt--;
    return true;

}
void invert_arry(struct Arry * q)
{
    int i=0;
    int j=q->cnt-1;
    int temp;
    while(i<j)
    {
        temp=q->pBase[i];
        q->pBase[i]=q->pBase[j];
        q->pBase[j]=temp;
        i++;
        j--;
        
    }
    return;
}     
void sort_arry(struct Arry * q)
{
    //冒泡排序(最大元素排最后)
    /*
    int i=0;
    int j=0;
    int temp;
    for(i;i<q->cnt;i++)
    {
        for(j=i;j<(q->cnt-i-1);j++)
        {
            if((q->pBase[j])>(q->pBase[j+1]))
            {
                //交换
                temp=q->pBase[j];
                q->pBase[j]=q->pBase[j+1];
                q->pBase[j+1]=temp;
            }
        }
    }
    */
    //选择排序

    int i=0;
    int j=0;
    int temp;
    for(i;i<q->cnt;i++)
    {
        for(j=i+1;j<q->cnt;j++)
        {
            if((q->pBase[i])>(q->pBase[j]))
            {
                //交换(内循环i不变)
                temp=q->pBase[i];
                q->pBase[i]=q->pBase[j];
                q->pBase[j]=temp;
            }
        }

    }
    return;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值