日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法:动态数组(利用万能指针实现任意类型数组操作)

發(fā)布時(shí)間:2025/3/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法:动态数组(利用万能指针实现任意类型数组操作) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原理介紹

我們利用萬(wàn)能指針來(lái)實(shí)現(xiàn)動(dòng)態(tài)數(shù)組,數(shù)組元素類(lèi)型可以是任意類(lèi)型,因?yàn)槲覀冎痪S護(hù)用戶(hù)提供的數(shù)據(jù)的地址,所以可以用萬(wàn)能指針來(lái)接受,這樣就實(shí)現(xiàn)了類(lèi)似C++中的模板功能了

先說(shuō)說(shuō)動(dòng)態(tài)數(shù)組和靜態(tài)數(shù)組靜態(tài)數(shù)組一旦建立它的空間是不可變的,比如我們?cè)跅I祥_(kāi)辟的空間,一旦開(kāi)辟,長(zhǎng)度就不可變。如果我們用malloc在堆區(qū)開(kāi)辟的數(shù)組,如果當(dāng)我們檢測(cè)到數(shù)組已經(jīng)滿(mǎn)了,我們可以重新開(kāi)辟一塊更大的空間,將原有的數(shù)據(jù)拷貝到新的空間,這樣就實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的效果了

實(shí)現(xiàn)算法預(yù)覽

DynamicArray.h

#pragma once #ifndef __DYNAMICARRAY_H__ #define __DYNAMICARRAY_H__ #define _CRT_SECURE_NO_WARNINGS //動(dòng)態(tài)數(shù)組 typedef struct DynamicArray {void** pArr;//數(shù)組元素具體存儲(chǔ)位置,由于不知道用戶(hù)存儲(chǔ)的數(shù)據(jù)類(lèi)型和數(shù)據(jù)位置統(tǒng)一用void*來(lái)指向用戶(hù)存儲(chǔ)的每一個(gè)元素int m_size;//數(shù)組大小int m_capacity;//數(shù)組容量 }DynamicArray;//初始化動(dòng)態(tài)數(shù)組 DynamicArray* Init_DynamicArray(int capacity);//動(dòng)態(tài)數(shù)組插入數(shù)據(jù) //模擬數(shù)組pos范圍0 ~ arr->m_size - 1 int InsertByIndex_DynamicArray(DynamicArray* arr, void * data, int pos);//動(dòng)態(tài)數(shù)組進(jìn)行遍歷 void Foreach_DynamicArray(DynamicArray* arr, void(*Foreach_Function)(void*));//動(dòng)態(tài)數(shù)組刪除元素根據(jù)元素下標(biāo) int RemoveByIndex_DynamicArray(DynamicArray* arr, int pos);//動(dòng)態(tài)數(shù)組刪除元素根據(jù)元素的值 int RemoveByValue_DynamicArray(DynamicArray* arr, void* data, int(*compare)(void* data1, void* data2));//動(dòng)態(tài)數(shù)組銷(xiāo)毀 int Destroy_DynamictArray(DynamicArray* arr);#endif // !__DYNAMICARRAY_H__

實(shí)現(xiàn)代碼展示

DynamicArray.c

#include <stdio.h> #include <stdlib.h> #include "DynamicArray.h"//初始化動(dòng)態(tài)數(shù)組 DynamicArray* Init_DynamicArray(int capacity) {DynamicArray* arr = (DynamicArray*)malloc(sizeof(DynamicArray));if (NULL == arr){return NULL;}arr->m_capacity = capacity;arr->pArr = malloc(sizeof(void*)*capacity);arr->m_size = 0;return arr; } //動(dòng)態(tài)數(shù)組插入數(shù)據(jù) //模擬數(shù)組pos范圍0 ~ arr->m_size - 1 int InsertByIndex_DynamicArray(DynamicArray* arr, void * data, int pos) {if (NULL == arr || NULL == data){return 0;}//位置非法 進(jìn)行尾插if (pos < 0 || pos >= arr->m_size){pos = arr->m_size;}//判斷數(shù)組是否滿(mǎn)載if (arr->m_size >= arr->m_capacity){//進(jìn)行擴(kuò)容int newCapacity = arr->m_capacity * 2;//arr->pArr = (void**)realloc((void*)arr->pArr, newCapacity);//數(shù)據(jù)復(fù)制有問(wèn)題 error//手動(dòng)復(fù)制void** pArr = malloc(sizeof(void*)*newCapacity);for (int i = 0; i < arr->m_capacity; i++){pArr[i] = arr->pArr[i];}if (arr->pArr != NULL){free(arr->pArr);arr->pArr = NULL;}arr->pArr = pArr;arr->m_capacity = newCapacity;}//將插入位置以及其后的數(shù)組元素往后移動(dòng)一位for (int i = arr->m_size - 1; i >= pos; i--){arr->pArr[i + 1] = arr->pArr[i];}//將新元素進(jìn)行插入arr->pArr[pos] = data;arr->m_size++;return 1; } //動(dòng)態(tài)數(shù)組進(jìn)行遍歷 void Foreach_DynamicArray(DynamicArray* arr, void(*Foreach_Function)(void*)) {if (NULL == arr){return;}for (int i = 0; i < arr->m_size; i++){//并不知道用戶(hù)的數(shù)據(jù)類(lèi)型,讓用戶(hù)自己提供遍歷數(shù)組元素的回調(diào)函數(shù)Foreach_Function(arr->pArr[i]);}return; } //動(dòng)態(tài)數(shù)組刪除元素根據(jù)元素下標(biāo) int RemoveByIndex_DynamicArray(DynamicArray* arr, int pos) {//arr 為NULL 和傳入位置非法 返回if (NULL == arr || pos<0 || pos>arr->m_size - 1){return 0;}//將刪除位置后面的所有元素往前移一位進(jìn)行覆蓋for (int i = pos; i < arr->m_size - 1; i++){arr->pArr[i] = arr->pArr[i + 1];}arr->m_size--;return 1; } //動(dòng)態(tài)數(shù)組刪除元素根據(jù)元素的值 int RemoveByValue_DynamicArray(DynamicArray* arr, void* data, int(*compare)(void* data1, void* data2)) {//arr 為NULL 和傳入位置非法 返回if (NULL == arr || NULL == arr){return 0;}for (int i = 0; i < arr->m_size; i++){if (compare(arr->pArr[i], data)){RemoveByIndex_DynamicArray(arr, i);break;}}return 1; } //動(dòng)態(tài)數(shù)組銷(xiāo)毀 int Destroy_DynamictArray(DynamicArray* arr) {if (NULL == arr){return 0;}if (arr->pArr != NULL){free(arr->pArr);arr->pArr = NULL;}free(arr);arr = NULL;return 1; }

Main.c

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> #include <string.h> #include "DynamicArray.h"//使用結(jié)構(gòu)體數(shù)據(jù)類(lèi)型 測(cè)試動(dòng)態(tài)數(shù)組 typedef struct Hero {char name[64];int age; }Hero;int Compare_Hero(void* hero1, void* hero2) {Hero* h1 = (Hero*)hero1;Hero* h2 = (Hero*)hero2;return h1->age == h2->age && strcmp(h1->name, h2->name) == 0; } void Print_Hero(Hero* hero) {if (NULL == hero){return;}printf("name:%s,age:%d\n",hero->name,hero->age);return; } int main(int argc, char *argv[]) {Hero h1 = { "關(guān)羽",38 };Hero h2 = { "張飛",39 };Hero h3 = { "趙云",29 };Hero h4 = { "許褚",19 };Hero h5 = { "魯肅",25 };Hero h6 = { "周瑜",27 };DynamicArray* arr = Init_DynamicArray(5);printf("插入數(shù)據(jù)前動(dòng)態(tài)數(shù)組容量:%d\n", arr->m_capacity);InsertByIndex_DynamicArray(arr, &h1, 0);InsertByIndex_DynamicArray(arr, &h2, 0);InsertByIndex_DynamicArray(arr, &h3, 0);InsertByIndex_DynamicArray(arr, &h4, 2);InsertByIndex_DynamicArray(arr, &h5, 100);InsertByIndex_DynamicArray(arr, &h6, 1);Foreach_DynamicArray(arr, Print_Hero);//正確順序:趙云 周瑜 張飛 許褚 關(guān)羽 魯肅printf("插入數(shù)據(jù)后動(dòng)態(tài)數(shù)組容量:%d\n", arr->m_capacity);printf("刪除index = 3的元素\n");RemoveByIndex_DynamicArray(arr, 3);Foreach_DynamicArray(arr, Print_Hero);printf("刪除趙云\n");RemoveByValue_DynamicArray(arr, &h3, Compare_Hero);Foreach_DynamicArray(arr, Print_Hero);Destroy_DynamictArray(arr);return 0; }

運(yùn)行結(jié)果檢測(cè)


總結(jié)

以上是生活随笔為你收集整理的数据结构与算法:动态数组(利用万能指针实现任意类型数组操作)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。