1、动态增长数组
实现动态增长数组通常需要使用 malloc
或 realloc
函数来动态分配和重新分配内存。
#include <stdio.h> #include <stdlib.h> int main() { int *arr; int initial_size = 5; int new_size; int i; // 分配初始内存 arr = (int *)malloc(initial_size * sizeof(int)); if (arr == NULL) { perror("malloc"); return 1; } // 初始化数组元素 for (i = 0; i < initial_size; i++) { arr[i] = i; } // 增加数组大小 new_size = 10; arr = (int *)realloc(arr, new_size * sizeof(int)); if (arr == NULL) { perror("realloc"); return 1; } // 继续使用新的数组 for (i = initial_size; i < new_size; i++) { arr[i] = i; } // 打印数组元素 for (i = 0; i < new_size; i++) { printf("%d ", arr[i]); } // 释放内存 free(arr); return 0; }
2、使用链表结构模拟动态增长数组
可以使用链表来模拟动态增长数组。链表的一个好处是,它可以在运行时根据需要动态分配内存,不像数组那样固定大小。通过链表结构,我们可以在插入元素时动态增加内存,模拟一个“动态增长数组”的效果。
#include <stdio.h> #include <stdlib.h> // 定义链表节点 typedef struct Node { int data; struct Node* next; } Node; // 创建一个新节点并初始化 Node* createNode(int value) { Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode == NULL) { printf("内存分配失败!\n"); return NULL; } newNode->data = value; newNode->next = NULL; return newNode; } // 向链表末尾添加新节点 void appendNode(Node** head, int value) { Node* newNode = createNode(value); if (*head == NULL) { *head = newNode; } else { Node* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } } // 打印链表 void printList(Node* head) { Node* temp = head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n"); } // 释放链表内存 void freeList(Node* head) { Node* temp; while (head != NULL) { temp = head; head = head->next; free(temp); } } int main() { Node* dynamicArray = NULL; // 初始化为空链表 // 模拟动态增长数组 for (int i = 0; i < 10; i++) { appendNode(&dynamicArray, i); } // 打印链表(模拟动态增长数组) printf("链表中的元素:\n"); printList(dynamicArray); // 释放内存 freeList(dynamicArray); return 0; }