zoukankan      html  css  js  c++  java
  • 动态数组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("
    ");
    }
    
    //释放动态数组的内存
    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 
    ",arr->capacity, arr->size);
    	//插入元素
    	for(int i = 0; i < 10; i++){
    		PushBack_Array(arr, i);
    	}
    
    	//打印
    	printf("插入10个元素后 
    ");
    	Print_Array(arr);
    
    	//插入元素
    
    	for(int i = 0; i < 30; i++){
    		PushBack_Array(arr, i);
    	}
    	//打印
    	printf("重新插入30个元素后 
    ");
    	Print_Array(arr);
    
    	//删除
    	RemoveByPos_Array(arr, 0);
    	RemoveByValue_Array(arr, 5);
    	//
    	printf("删除两个元素后 
    ");
    	Print_Array(arr);
    
    
    	//查找
    	int pos = Find_Array(arr, 30);
    	printf("位置 5查找到  pos: %d  value: %d 
    ",pos, At_Array(arr, pos));
    	//销毁
    	FreeSpace_Array(arr);
    
    }
    
    int main(){
    	printf("动态数组  
    ");
    	test01();
    	system("pause");
    	return 0;
    }
    
    
  • 相关阅读:
    HTML学习 day04
    HTML学习 day03
    HTML学习 day02
    原生Js监听普通dom尺寸变化
    JavaScript-获取地址栏参数
    Window 下 MySQL 环境的安装
    JavaScript 中的12种循环遍历方法
    前端PS常用切图技巧
    requirejs教程(一):基本用法
    seajs教程(一):基本用法
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/11229387.html
Copyright © 2011-2022 走看看