最近在学数据结构,涉及到动态数组。我自己总结了一下,把与动态数组有关的基本操作用c和c++分别写了一遍。下面把总结的成果记录一下。
动态数组之所以称之为动态,关键就在于其可以在程序运行过程中自动增加分配的内存大小。要实现这一点的关键又在于下面两点:
- 实时记录数组的元素个数和分配的内存的大小
- realloc()函数重新分配内存
数组中的数据是连续存放的,可以随机访问。在数组尾部增加删除元素效率很高,但是在中间插入和删除元素则效率低下。
C语言动态数组操作
要实现实时记录数组的元素个数和分配的内存的大小可以使用下面的一个结构体:
1 | typedef int ElementType; |
elems是数据所在地址块的首地址。size和capacity分别是所存储数据的个数和当前分配的容量,他们的值必须与当前数组的状况相对应。
初始化数组
1 | void init(DynamicArrayPtr DAP){ |
初始化的过程中我们为数据存储区域分配了初始的可以容纳100个元素的内存空间,所以当前的容量为100。此时数组中还没有数据,所以大小为0.
打印动态数组
1 | void print(DynamicArrayPtr DAP) { |
内存重新分配
1 | void dealOverflow(DynamicArrayPtr DAP){ |
内存重新分配的条件就是当前数组中的元素个数大于或等于当前分配的容量时.重新分配使用的函数是realloc(),在原来的容量的基础之上新分配了可以容纳20个元素的空间,分配完成之后需要将记录当前容量大小的变量更新一下。这个函数主要进行的是容量是否够用的检测,如果不够用则增加容量。在每增加一个元素之前就应该调用一次该函数。
尾部追加元素
1 | void append(DynamicArrayPtr DAP,ElementType e){ |
向尾部追加元素效率是比较高的。在追加之前首先要检测容量够不够用,追加之后要更新记录数组大小的变量的值。
插入元素
1 | void insert(DynamicArrayPtr DAP,int pos,ElementType e){ |
插入元素效率较低,在所插入位置的元素之后的所有元素都必须向后移动一个位置。
删除元素
1 | void myremove(DynamicArrayPtr DAP,int pos){ |
元素排序
1 | void sort(DynamicArrayPtr DAP,char rule='<'){ |
上面使用冒泡法则对元素进行排序,rule参数指定排序规则,默认按照从小到大排序。
合并两个数组并排序
1 | void mergeAndsort(DynamicArrayPtr DAP1,DynamicArrayPtr DAP2,char rule='<'){ |
两个有序数组合并排序
1 | /** |
DynamicArray.cpp的内容
1 | /** |
main.cpp(测试)的内容
1 | /** |
makefile
1 | main.exe:DynamicArray.o main.o |