C语言实现动态数组

数据结构及接口(Dynamic_Array.h):

#ifndef DYNAMIC_ARRAY_H_INCLUDED
#define DYNAMIC_ARRAY_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Dynamic_Array{
    int *pAddr;
    int Asize;
    int capacity;
}Dynamic_Array;

typedef Dynamic_Array DArray;

/* 初始化 销毁 增删(改)查  */
DArray* Create_Array();  //创建一个空的动态数组,申请内存
void Destroy_Array(DArray *arr);  //销毁动态数组,释放内存

void PushBack_Array(DArray *arr,int val);     //增:插入元素到尾部
void RemoveByPos_Array(DArray *arr,int pos);  //删:根据位置删
void RemoveByVal_Array(DArray *arr,int val);  //根据值删(第一次出现的位置)
void Clear_Array(DArray *arr);                //清空数组
int FindByPos_Array(DArray *arr,int pos);    //返回val在数组中的下标
int FindByVal_Array(DArray *arr,int val);    //返回arr->pAddr[pos]的值
void Print_Array(DArray *arr);

int GetSize_Array(DArray *arr);
int GetCapacity_Array(DArray *arr);


#endif // DYNAMIC_ARRAY_H_INCLUDED

功能实现(Dynamic_Array.c):

#include "Dynamic_Array.h"

#define CAPACITY_INIT_VALUE 20

DArray* Create_Array(){
    DArray *arr = (DArray*)malloc(sizeof(DArray));
    arr->Asize = 0;
    arr->capacity = CAPACITY_INIT_VALUE;
    arr->pAddr = (int*)malloc(sizeof(int)*arr->capacity);

    return arr;
}

void Destroy_Array(DArray *arr)
{
    if(arr->pAddr == NULL){
        fprintf(stderr,"The array doesn't exist,can't destroy it.\n");
        return ;
    }

    else
    {
        free(arr->pAddr);
        arr->Asize = 0;
        arr->capacity = 0;
    }
}

void PushBack_Array(DArray *arr,int val)
{
    if(arr == NULL){
        fprintf(stderr,"The array doesn't exist,can't push back.\n");
        return ;
    }

    else
    {
        if(arr->Asize == arr->capacity){    //若空间不足,重开一块内存
            int* newspace = (int*)malloc(sizeof(int)*arr->capacity*2);
            memcpy(newspace,arr->pAddr,sizeof(int)*arr->Asize);
            free(arr->pAddr);
            arr->pAddr = newspace;
            arr->capacity *= 2;
        }

        arr->pAddr[arr->Asize] = val;
        arr->Asize++;
    }
}

void RemoveByPos_Array(DArray *arr,int pos)
{

    if(arr == NULL){
        fprintf(stderr,"The array doesn't exist,can't remove by pos.\n");
        return ;
    }

    if(pos < 0 || pos > arr->Asize){
        fprintf(stderr,"Invalid pos to remove.\n");
        return ;
    }

    for(int i=pos;i<arr->Asize-1;i++){
        arr->pAddr[i] = arr->pAddr[i+1];
    }
    arr->Asize --;
}

void RemoveByVal_Array(DArray *arr,int val)
{
    if(arr == NULL){
        fprintf(stderr,"The array doesn't exist,can't remove by val.\n");
        return ;
    }

    int pos = FindByVal_Array(arr,val);

    if(pos == -1){
        fprintf(stderr,"Failed to remove by val,element not found.\n");
        return ;
    }

    RemoveByPos_Array(arr,pos);
}

void Clear_Array(Dynamic_Array *arr)
{

    if(arr == NULL)
        fprintf(stderr,"The array doesn't exist,can't clear it.\n");
    else
        arr->Asize = 0;
}

int FindByPos_Array(DArray *arr,int pos)
{

    if(arr == NULL){
        fprintf(stderr,"The array doesn't exist,can't find by POS.\n");
        return 0x7FFFFFFF;
    }

    if(pos < 0 || pos > arr->Asize){
        fprintf(stderr,"Invalid pos to find.\n");
        return 0x7FFFFFFF;
    }

    return arr->pAddr[pos];
}

int FindByVal_Array(DArray *arr,int val)
{

    if(arr == NULL){
        fprintf(stderr,"The array doesn't exist,can't find by VAL.\n");
        return -1;
    }

    int pos = -1;

    for(int i=0;i<arr->Asize;i++)
    {
        if(val == arr->pAddr[i]){
            pos = i;
            break;
        }
    }                     //Let i indicate the index of val

    if(pos == -1){
        fprintf(stderr,"%d is not found in the array!\n",val);
        return -1;
    }

    return pos;
}

void Print_Array(DArray *arr)
{

    if(arr == NULL)
        fprintf(stderr,"The array doesn't exist,can't print it.\n");

    else{
        for(int i=0;i<arr->Asize;i++)
            printf("%d\t",arr->pAddr[i]);
        printf("\n");
    }
}

int GetSize_Array(Dynamic_Array *arr)
{
    if(arr == NULL){
        fprintf(stderr,"The array doesn't exist,can't get size.\n");
        return -1;
    }

    else
        return arr->Asize;
}

int GetCapacity_Array(Dynamic_Array *arr)
{
    if(arr == NULL){
        fprintf(stderr,"The array doesn't exist,can't get capacity.\n");
        return -1;
    }

    else
        return arr->capacity;
}

功能测试(main.c):

#include "Dynamic_Array.h"

void test_Array(int Asize) // Asize小于80,大于0
{
    //int Asize = 10;

    DArray *arr = Create_Array();
    for(int i=0;i<Asize;i++)
        PushBack_Array(arr,i);

    printf("The array now is:\n");
    Print_Array(arr);
    printf("The size is %d\n",GetSize_Array(arr));
    printf("The capacity is %d\n",GetCapacity_Array(arr));

    int pos = arr->Asize/2;
    printf("arr->pAddr[%d] = %d\n",pos,FindByPos_Array(arr,pos));
    pos --;
    printf("arr->pAddr[%d] = %d\n",pos,FindByPos_Array(arr,pos));

    RemoveByPos_Array(arr,Asize-1);
    RemoveByVal_Array(arr,Asize-3);
    printf("\n\tAfter remove,the array is:\n");
    Print_Array(arr);

    Clear_Array(arr);
    printf("\n\tAfter Clear:\n\n");
    printf("The size is %d\n",GetSize_Array(arr));
    printf("The capacity is %d\n\n",GetCapacity_Array(arr));

}

int main()
{
    test_Array(2);
    system("pause");
    system("cls");
    test_Array(30);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值