本文解釋為啥會有響應式編程,為什麼它在開發者中不太受歡迎,以及引入 Java 虛擬線程後它可能最終會消失。 命令式風格編程一直深受開發者喜愛,如 if-then-else、while 迴圈、函數和代碼塊等結構使代碼易理解、調試,異常易追蹤。然而,像所有好的東西一樣,通常也有問題。這種編程風格導致線程 ...
數據結構【動態數組】
在堆中申請數組空間,擴容時realloc,註意不可增刪改的情況並處理即可。
以下代碼不一定完全正確。
#include <stdio.h>
#include <stdlib.h>
/**
* 聲明動態數組,並提供相關的函數操作
*/
// 動態數組結構體
typedef struct Array
{
// 動態數組
int *elementData;
// 容量
size_t capacity;
// 長度
size_t size;
} DynamicArray;
// 初始化動態數組
void initDynamicArray(DynamicArray *array, size_t initialCapacity);
// 釋放動態數組記憶體
void destroyDynamicArray(DynamicArray *array);
// 調整動態數組記憶體大小
void resizeDynamicArray(DynamicArray *array, size_t newCapacity);
// 獲取動態數組長度(元素個數)
size_t getLength(const DynamicArray *array);
// 在指定位置插入新元素
void insertAt(DynamicArray *array, size_t index, int element);
// 在末尾插入新元素
void insertEnd(DynamicArray *array, int element);
// 刪除指定位置的元素並返回被刪除的元素
int deleteAt(DynamicArray *array, size_t index);
// 刪除末尾的元素並返回被刪除的元素
int deleteEnd(DynamicArray *array);
// 遍歷所有的元素
void print(DynamicArray *array);
/**
* 主函數
*/
int main(int argc, char const *argv[])
{
DynamicArray array;
initDynamicArray(&array, 2);
insertAt(&array, 0, 10);
insertAt(&array, 0, 20);
insertAt(&array, 0, 20);
print(&array);
getchar();
return 0;
}
// 初始化動態數組
void initDynamicArray(DynamicArray *array, size_t initialCapacity){
// 分配空間
if (initialCapacity > 0) {
array->elementData = (int *) malloc(initialCapacity * (sizeof(int)));
} else if (initialCapacity == 0) {
array->elementData = NULL;
} else {
printf("您輸入的長度不合法。");
return;
}
// 初始化capacity
array->capacity = initialCapacity;
// todo 初始化size
array->size = 0;
}
// 釋放動態數組記憶體
void destroyDynamicArray(DynamicArray *array){
free(array->elementData);
}
// 擴容
void resizeDynamicArray(DynamicArray *array, size_t newCapacity){
printf("1.5倍擴容啟動\n");
array->elementData = realloc(array->elementData, newCapacity*sizeof(int));
array->capacity += array->capacity>>1;
}
// 獲取動態數組長度(元素個數)
size_t getLength(const DynamicArray *array){
return array->size;
}
// 在指定位置插入新元素
void insertAt(DynamicArray *array, size_t index, int element){
// index 不符合規則的情況
if(index < 0 || index > array->size){
printf("無效的位置輸入\n");
return;
}
(array->size == array->capacity) ? resizeDynamicArray(array, array->capacity += array->capacity>>1) : 0;
//
for(int i = array->size; i>index; i--){
array->elementData[i] = array->elementData[i-1];
}
array->elementData[index] = element;
array->size++;
}
// 在末尾插入新元素
void insertEnd(DynamicArray *array, int element){
insertAt(array, array->size, element);
}
// 刪除指定位置的元素並返回被刪除的元素
int deleteAt(DynamicArray *array, size_t index){
if(index < 0 || index >= array->size){
printf("無效的元素刪除\n");
return -1;
}
int temp = array->elementData[index];
for(int i = index+1; i<array->size; i++){
array->elementData[i-1] = array->elementData[i];
}
array->size--;
return temp;
}
// 刪除末尾的元素並返回被刪除的元素
int deleteEnd(DynamicArray *array){
return deleteAt(array, array->size-1);
}
// 遍歷所有的元素
void print(DynamicArray *array){
for(int i = 0; i<array->size; i++){
printf("%d\n", array->elementData[i]);
}
printf("\n");
}