首页 > 编程知识 正文

c语言数组下标数据类型(c语言引用数组元素下标数据类型)

时间:2023-05-06 09:38:20 阅读:69017 作者:2985

c语言动态数组数据类型(动态数组库)动态数组库功能设计源文件,具体实现测试程序,执行结果

创建静态数组后,不能调整动态数组库功能的大小。 动态数组更灵活,可以在程序运行时根据需要指定数组大小。

用c语言实现抽象数据类型(ADT )的方法用c语言实现抽象数据类型(ADT ),实现动态数组数据类型。

此动态数组的功能如下:

从头部插入元素; 从尾部插入要素; 下标访问、插入、删除元素等。 可以使用回调函数遍历动态数组。 以下是头文件dynints.h

# ifndefdynints _ h # definedynints _ hstructdynints; 类型结构动态输入*动态输入; /*创建动态数组。 参数是数组元素的最大数量,返回动态数组指针*/pdynintscreate _ dyn ints (int capacity )。 /*头部有元素*/void insert _ head (pdynintsdi _ array,int element ); /*末尾为元素*/void insert _ tail (pdynintsdi _ array,int element ); 索引参数基于下标插入元素生成下标值*/void insert _ by _ index (pdynintsdi _ array,int element,int index ); /*返回数组元素的个数*/intarray _ length (pdynintsdi _ array ); /*判断是否为空,空返回1 */boolis _ empty (pdynintsdi _ array ); /*根据下标访问元素模拟c语言。 c语言没有引用,只能返回地址*/int * access _ by _ index (pdynintsdi _ array,int index )。 /*按照下标删除元素*/void delete _ by _ index (pdynintsdi _ array,int index ); /*数组复制(以数组名称和元素数为参数的常规数组array已存在。 */void duplicate _ array (pdynintsdi _ array,int * array,int count ); /*放弃动态数组*/void destroy _ array (pdynintsdi _ array ); /*/*func回调函数为动态数组*/void travel _ array (pdynintsdi _ array,void ) func ) int * data ); #endif源文件,具体实现在此使用memcpy内存复制函数更新动态数组。 请注意,该函数的原型为void*memcpy(void*destin、void *source、unsigned n ) ),并且参数填写正确。 我记得第一次写的时候,把函数指针运算的结果和地址的概念搞错了。 假设p是T *类型指针,n是整数变量或常量,则p n是T *类型的指针变量,其指向的地址是pnsizeof(t )。 memcpy的前两个参数可能会混淆指针、指针变量和地址,这取决于指针变量本,容易混淆。 指针可以等于地址,指针变量是存储地址的变量。 但是,经常把3358www.Sina.com/称为指针变量P指针P是一个好东西,它使用输出函数在测试程序中方便地测试回调函数遍历动态数组。 我在new和delete上写。 没有使用malloc、free。 在这里使用是分不清的。 new和delete在c对象上调用构造函数析构函数。 new和delete的基础也是通过malloc和free实现的。 malloc和free是函数,new和delete是运算符,可以重载new和delete以实现自己的内存管理策略。 dynints.cpp

# include iostream # include cstdio # include cstring # includecstdlib # include ' dyn ints.h ' usingnamespacestd; 结构dyn ints { int capacity; //最大容量int计数; //实际保存了多少个int *items; //动态数组指针bool modified; //数组是否已修改,这没有任何作用}; /*创建动态数组。 参数是数组元素的最大数量,动态数组指针*/pdynintscreate _ dyn ints (int capacity ) { PDYNINTS di_array=new DYNINTS; if(di_array==null ) { printf (动态内存分配失败! n '; 退出(1; } di_array-capacity=capacity; di_array-count=0; di_array-items=NULL; return di_array; }/*头部安装元素*/void insert_head (

PDYNINTS di_array, int element){ if (di_array->count >= di_array->capacity) { printf("数组已达到最大容量。n"); exit(2); } int *temp = new int[(di_array->count + 1) * sizeof(int)]; if (temp == NULL) { printf("动态内存分配失败!n"); exit(1); } memcpy(temp, &element, sizeof(int)); memcpy(temp + 1, di_array->items, di_array->count * sizeof(int)); if (!Is_empty(di_array)) delete [] di_array->items;//if用来防止数组原来就是空的。 di_array->count++; di_array->items = temp; di_array->modified = true;}/*在尾部插入元素*/void insert_tail(PDYNINTS di_array, int element){ if (di_array->count >= di_array->capacity) { printf("数组已达到最大容量。n"); exit(2); } int *temp = new int[(di_array->count + 1) * sizeof(int)]; if (temp == NULL) { printf("动态内存分配失败!n"); exit(1); } memcpy(temp, di_array->items, di_array->count * sizeof(int)); memcpy(temp + di_array->count, &element, sizeof(int)); if (!Is_empty(di_array)) delete [] di_array->items; di_array->count++; di_array->items = temp; di_array->modified = true;}/*根据下标插入元素,index参数为下标值*/void insert_by_index(PDYNINTS di_array, int element, int index){ if (di_array->count >= di_array->capacity) { printf("数组已达到最大容量。n"); exit(2); } if (index < 0 || index >= di_array->count) { printf("下标值非法。n"); exit(3); } int *temp = new int[(di_array->count + 1) * sizeof(int)]; if (temp == NULL) { printf("动态内存分配失败!n"); exit(1); } memcpy(temp, di_array->items, index * sizeof(int)); memcpy(temp + index, &element, sizeof(int)); memcpy(temp + (index + 1), di_array->items + index, (di_array->count - index) * sizeof(int)); if (!Is_empty(di_array)) delete [] di_array->items; di_array->count++; di_array->items = temp; di_array->modified = true;}/*返回数组元素个数*/int array_length(PDYNINTS di_array){ return di_array->count;}/*判断是否为空,空返回1*/bool Is_empty(PDYNINTS di_array){ return di_array->count == 0 && di_array->items == NULL;}/*根据下标访问元素,模拟C语言,C语言没有引用,只能返回地址*/int * access_by_index(PDYNINTS di_array, int index){ if (index < 0 || index >= di_array->count) { printf("下标值非法。n"); exit(3); } return di_array->items + index;}/*根据下标删除元素*/void delete_by_index(PDYNINTS di_array, int index){ if (index < 0 || index >= di_array->count) { printf("下标值非法。n"); exit(3); } int * temp = new int[(di_array->count - 1) * sizeof(int)]; if (temp == NULL) { printf("动态内存分配失败!n"); exit(1); } memcpy(temp, di_array->items, index * sizeof(int)); memcpy(temp + index, di_array->items + (index + 1), (di_array->count - 1 - index) * sizeof(int)); delete [] di_array->items; di_array->count--; di_array->items = temp; di_array->modified = true;}/*数组的复制(已有一个普通数组),参数有数组名称和数组个数。*/void duplicate_array(PDYNINTS di_array, int * array, int count){ if (di_array->capacity < count) { printf("超过了数组最大容量。n"); exit(2); } if (!Is_empty(di_array)) { delete [] di_array->items; di_array->count = 0; } di_array->items = new int[count * sizeof(int)]; if (di_array->items == NULL) { printf("动态内存分配失败!n"); exit(1); } memcpy(di_array->items, array, count * sizeof(int)); di_array->count = count; di_array->modified = true;}/*销毁动态数组*/void destroy_array(PDYNINTS di_array){ delete di_array->items; delete di_array; di_array = NULL;}/*func回调函数遍历动态数组*/void travel_array(PDYNINTS di_array, void (*func)(int * data)){ for (int i = 0; i < di_array->count; ++i) func(di_array->items + i);}
测试程序和运行结果

main.cpp

#include <iostream>#include <cstdio>#include "dynints.h"using namespace std;void print_array(int * data)//回调函数{ printf("%d ", *data);}int main(void){ int ARRAY[5] = {1,2,3,4,5}; PDYNINTS my_array = create_dynints(9); printf("把【1,2,3,4,5】复制到动态数组:n"); int count = (int) (sizeof(ARRAY) / sizeof(ARRAY[0])); duplicate_array(my_array, ARRAY, count); travel_array(my_array, print_array); printf("n"); printf("在头部插入0:n"); insert_head(my_array, 0); travel_array(my_array, print_array); printf("n"); printf("在尾部插入6:n"); insert_tail(my_array, 6); travel_array(my_array, print_array); printf("n"); printf("在下标为5的元素插入7:n"); insert_by_index(my_array, 7, 5); travel_array(my_array, print_array); printf("n"); printf("Now the dynamic array has %d elements.n", array_length(my_array)); printf("把下标为2的元素改成10:n"); int * p_element = access_by_index(my_array, 2); *p_element = 10; travel_array(my_array, print_array); printf("n"); printf("把下标为4的元素删除:n"); delete_by_index(my_array, 4); travel_array(my_array, print_array); printf("n"); destroy_array(my_array); return 0;}

运行结果:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。