📜  c 尖锐列表长度 - C# (1)

📅  最后修改于: 2023-12-03 15:13:48.028000             🧑  作者: Mango

C 尖锐列表长度 - C#

在 C 语言中,可以使用指针来实现尖锐列表。尖锐列表就是一个没有固定长度的数组,可以按需动态增长,常用于数据结构中。

实现

常用的尖锐列表实现方式是使用指针动态分配内存。每当需要插入一个元素时,先检查当前列表空间是否足够,如果不足则重新分配更大的内存,将旧数据复制到新内存中,并释放旧内存。

具体实现可以参考下面的代码:

#include <stdio.h>
#include <stdlib.h>

#define INIT_CAPACITY 10

typedef struct {
    int* data;          // 保存数据的指针
    int size;           // 当前列表长度
    int capacity;       // 当前内存容量
} List;

List* new_list() {
    List* list = (List*) malloc(sizeof(List));
    list->data = (int*) malloc(INIT_CAPACITY * sizeof(int));
    list->size = 0;
    list->capacity = INIT_CAPACITY;
    return list;
}

void free_list(List* list) {
    free(list->data);   // 释放内存
    free(list);
}

void check_capacity(List* list, int new_size) {
    if (new_size > list->capacity) {
        int new_capacity = list->capacity * 2;   // 新容量翻倍
        int* new_data = (int*) malloc(new_capacity * sizeof(int));
        // 将旧数据复制到新内存中
        for (int i = 0; i < list->size; i++) {
            new_data[i] = list->data[i];
        }
        free(list->data);   // 释放旧内存
        list->data = new_data;
        list->capacity = new_capacity;
        printf("List resized: capacity=%d\n", new_capacity);
    }
}

void add(List* list, int value) {
    check_capacity(list, list->size + 1);
    list->data[list->size] = value;
    list->size++;
}

void print_list(List* list) {
    printf("List size=%d, capacity=%d: [ ", list->size, list->capacity);
    for (int i = 0; i < list->size; i++) {
        printf("%d ", list->data[i]);
    }
    printf("]\n");
}

int main() {
    List* list = new_list();
    for (int i = 0; i < 20; i++) {
        add(list, i);
        print_list(list);
    }
    free_list(list);
    return 0;
}
示例

以下是一个简单的示例程序,演示了如何使用尖锐列表保存用户输入的数字,并在最后求出它们的平均值。

#include <stdio.h>
#include <stdlib.h>

#define INIT_CAPACITY 10

typedef struct {
    int* data;          // 保存数据的指针
    int size;           // 当前列表长度
    int capacity;       // 当前内存容量
} List;

List* new_list() {
    List* list = (List*) malloc(sizeof(List));
    list->data = (int*) malloc(INIT_CAPACITY * sizeof(int));
    list->size = 0;
    list->capacity = INIT_CAPACITY;
    return list;
}

void free_list(List* list) {
    free(list->data);   // 释放内存
    free(list);
}

void check_capacity(List* list, int new_size) {
    if (new_size > list->capacity) {
        int new_capacity = list->capacity * 2;   // 新容量翻倍
        int* new_data = (int*) malloc(new_capacity * sizeof(int));
        // 将旧数据复制到新内存中
        for (int i = 0; i < list->size; i++) {
            new_data[i] = list->data[i];
        }
        free(list->data);   // 释放旧内存
        list->data = new_data;
        list->capacity = new_capacity;
        printf("List resized: capacity=%d\n", new_capacity);
    }
}

void add(List* list, int value) {
    check_capacity(list, list->size + 1);
    list->data[list->size] = value;
    list->size++;
}

void print_list(List* list) {
    printf("List size=%d, capacity=%d: [ ", list->size, list->capacity);
    for (int i = 0; i < list->size; i++) {
        printf("%d ", list->data[i]);
    }
    printf("]\n");
}

int main() {
    List* nums = new_list();
    int x;
    printf("Enter some numbers (end with -1):\n");
    while (1) {
        scanf("%d", &x);
        if (x == -1) {
            break;
        }
        add(nums, x);
    }
    printf("Numbers entered: ");
    print_list(nums);
    double avg = 0.0;
    for (int i = 0; i < nums->size; i++) {
        avg += nums->data[i];
    }
    avg /= nums->size;
    printf("Average: %.2f\n", avg);
    free_list(nums);
    return 0;
}

输出如下:

Enter some numbers (end with -1):
1 2 3 -1
Numbers entered: List size=3, capacity=10: [ 1 2 3 ]
Average: 2.00