動態數組C語言實現

/*
 * DynamicArray.h
 *
 *  Created on: 2019年7月22日
 *      Author: Jarvis
 */

#ifndef SRC_DYNAMICARRAY_H_
#define SRC_DYNAMICARRAY_H_

//動態增加內存 策略 將數據放到堆上
//動態數組 若是5個元素 申請內存 拷貝數據 釋放內存
// 容量 capacity 表示個人這塊內存空間一共能夠存放多少個元素
// size  記錄當前數組中具體的元素個數

//定義動態數組的結構體
typedef struct DYNAMICARRAY {
    int *pAddr;// 存放數據的地址
    int size;//當前有多少個元素
    int capacity;//容量, 容器當前能容納多少個元素
}Dynamic_Array;

//操做函數
//初始化
Dynamic_Array *Init_Array();

//插入
void PushBack_Array(Dynamic_Array *arr, int value);

//根據位置刪除
void RemoveByPos_Array(Dynamic_Array *arr, int pos);

//根據值刪除
void RemoveByValue_Array(Dynamic_Array *arr, int value);

//查找
int Find_Array(Dynamic_Array *arr, int value);

//打印
void Print_Array(Dynamic_Array *arr);

//釋放動態數組的內存
void FreeSpace_Array(Dynamic_Array *arr);

//清空數組
void Clear_Array(Dynamic_Array *arr);

//得到動態數組的容量
int Capacity_Array(Dynamic_Array *arr);

//得到動態數組當前元素的個數
int Size_Array(Dynamic_Array *arr);

//根據位置得到某個位置的元素
int At_Array(Dynamic_Array *arr, int pos);






#endif /* SRC_DYNAMICARRAY_H_ */
/*
 * DynamicArray.c
 *
 *  Created on: 2019年7月22日
 *      Author: Administrator
 */

#include <stdlib.h>



#include "DynamicArray.h"
Dynamic_Array *Init_Array() {
    Dynamic_Array *myArray = (Dynamic_Array *)malloc(sizeof(Dynamic_Array));
    myArray->size = 0;
    myArray->capacity = 20;
    myArray->pAddr = (int *)malloc(sizeof(int)*myArray->capacity);
    return myArray;
}

//插入
void PushBack_Array(Dynamic_Array *arr, int value) {
    if(arr == NULL){
        return;
    }
    //判斷控件是否足夠
    if(arr->size  == arr->capacity){
        //第一步 申請一塊更大的內存空間 ,新空間是舊空間的2倍
        int *newSpace = malloc(sizeof(int) * arr->capacity*2);
        //第二步 拷貝數據到新的空間
        memcpy(newSpace, arr->pAddr, arr->capacity  * sizeof(int));
        //第三步 釋放舊空間
        free(arr->pAddr);

        //更新容量
        arr->capacity = arr->capacity * 2;
        arr->pAddr = newSpace;
    }

    //插入新元素
    arr->pAddr[arr->size] = value;
    arr->size++;
}

//根據位置刪除
void RemoveByPos_Array(Dynamic_Array *arr, int pos) {
    if(arr == NULL){
        return;
    }
    if(pos < 0 || pos >= arr->size){
        return;
    }

    //刪除元素
    for(int i = pos; i < arr->size - 1; i++){
        arr->pAddr[i] = arr->pAddr[i+1];
    }
    arr->size--;

}

//根據值刪除
void RemoveByValue_Array(Dynamic_Array *arr, int value) {
    if(arr == NULL){
        return;
    }
    //找到值的位置
    int pos = -1;
    for(int i = 0; i< arr->size; i++){
        if(arr->pAddr[i] == value){
            pos = i;
            break;
        }
    }
    //根據位置 刪除值
    RemoveByPos_Array(arr, pos);
}

//查找
int Find_Array(Dynamic_Array *arr, int value) {
    if(arr == NULL){
            return -1;
        }
        //找到值的位置
        int pos = -1;
        for(int i = 0; i< arr->size; i++){
            if(arr->pAddr[i] == value){
                pos = i;
                break;
            }
        }
    return pos;
}

//打印
void Print_Array(Dynamic_Array *arr) {
    for(int i = 0; i < arr->size; i++){
        printf("%d ",arr->pAddr[i]);
    }
    printf("\n");
}

//釋放動態數組的內存
void FreeSpace_Array(Dynamic_Array *arr) {
    if(arr == NULL){
        return;
    }
    if(arr->pAddr != NULL){
        free(arr->pAddr);
    }
    free(arr);

}
//清空數組
void Clear_Array(Dynamic_Array *arr) {
    if(arr == NULL){
        return;
    }
    arr->size = 0;
}

//得到動態數組的容量
int Capacity_Array(Dynamic_Array *arr) {
    if(arr == NULL){
        return -1;
    }
    return arr->capacity;
}


//得到動態數組當前元素的個數
int Size_Array(Dynamic_Array *arr) {
    if(arr == NULL){
        return 0;
    }
    return arr->size;
}

//根據位置得到某個位置的元素
int At_Array(Dynamic_Array *arr, int pos) {
    return arr->pAddr[pos];
}
/*
 * mian.c
 *
 *  Created on: 2019年7月22日
 *      Author: Administrator
 */


#include "DynamicArray.h"

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

void test01(){
    //初始化動態數組
    Dynamic_Array *arr = Init_Array();

    //打印 capacity size
    printf("after create arr, capacity: %d, size: %d \n",arr->capacity, arr->size);
    //插入元素
    for(int i = 0; i < 10; i++){
        PushBack_Array(arr, i);
    }

    //打印
    printf("插入10個元素後 \n");
    Print_Array(arr);

    //插入元素

    for(int i = 0; i < 30; i++){
        PushBack_Array(arr, i);
    }
    //打印
    printf("從新插入30個元素後 \n");
    Print_Array(arr);

    //刪除
    RemoveByPos_Array(arr, 0);
    RemoveByValue_Array(arr, 5);
    //
    printf("刪除兩個元素後 \n");
    Print_Array(arr);


    //查找
    int pos = Find_Array(arr, 30);
    printf("位置 5查找到  pos: %d  value: %d \n",pos, At_Array(arr, pos));
    //銷燬
    FreeSpace_Array(arr);

}

int main(){
    printf("動態數組  \n");
    test01();
    system("pause");
    return 0;
}
相關文章
相關標籤/搜索