📅  最后修改于: 2023-12-03 15:13:48.028000             🧑  作者: Mango
在 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