C语言中,数组的大小通常在编译时确定,也就是在程序运行时,数组的大小是固定的。然而,有时可能需要一个动态增长的数组,这在处理不确定大小的数据时非常有用。为了实现动态增长的数组,通常需要使用 malloc()、realloc() 和 free() 来手动管理内存。malloc() 用于分配内存,realloc() 用于调整已分配内存的大小,而 free() 用于释放内存。

1、动态增长数组

实现动态增长数组通常需要使用 mallocrealloc 函数来动态分配和重新分配内存。

#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;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表