-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathlist.c
More file actions
132 lines (110 loc) · 2.87 KB
/
list.c
File metadata and controls
132 lines (110 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
* Copyright © https://github.com/microwind All rights reserved.
* @author: jarryli@gmail.com
* @version: 1.0
* @description: 列表数据结构 - C实现
*/
#include <stdio.h>
#include <stdlib.h>
#define INITIAL_CAPACITY 10
// 定义结构体 List
typedef struct {
int *data;
int size;
int capacity;
} List;
// 初始化 List
List* createList() {
List* list = (List*)malloc(sizeof(List));
list->capacity = INITIAL_CAPACITY;
list->data = (int*)malloc(list->capacity * sizeof(int));
list->size = 0;
return list;
}
// 扩展 List 容量
void resizeList(List* list, int newCapacity) {
// 只在新容量大于当前容量时才扩展
if (newCapacity > list->capacity) {
list->capacity = newCapacity;
list->data = (int*)realloc(list->data, list->capacity * sizeof(int));
}
}
// 添加元素
void addElement(List* list, int value) {
// 如果当前元素个数等于容量,扩展数组
if (list->size == list->capacity) {
resizeList(list, list->capacity * 2); // 容量翻倍
}
list->data[list->size] = value;
list->size++;
}
// 删除最后一个元素
void removeElement(List* list) {
if (list->size > 0) {
list->size--;
}
}
// 获取指定索引的元素
int getElement(List* list, int index) {
if (index < 0 || index >= list->size) {
printf("Index out of range\n");
exit(1);
}
return list->data[index];
}
// 打印所有元素
void printList(List* list) {
printf("List: ");
for (int i = 0; i < list->size; i++) {
printf("%d ", list->data[i]);
}
printf("\n");
}
// 获取 List 的大小
int getSize(List* list) {
return list->size;
}
// 获取 List 的容量
int getCapacity(List* list) {
return list->capacity;
}
// 释放 List 内存
void freeList(List* list) {
free(list->data);
free(list);
}
int main() {
// 创建 List
List* list = createList();
// 添加元素
addElement(list, 10);
addElement(list, 20);
addElement(list, 30);
addElement(list, 40);
// 打印列表
printList(list); // 输出:List: 10 20 30 40
// 获取元素
printf("Element at index 2: %d\n", getElement(list, 2)); // 输出:Element at index 2: 30
// 删除最后一个元素
removeElement(list);
printList(list); // 输出:List: 10 20 30
// 获取大小和容量
printf("Size: %d\n", getSize(list)); // 输出:Size: 3
printf("Capacity: %d\n", getCapacity(list)); // 输出:Capacity: 10
// 调整容量
resizeList(list, 20); // 设置新的容量为 20
printf("New Capacity: %d\n", getCapacity(list)); // 输出:New Capacity: 20
// 释放内存
freeList(list);
return 0;
}
/*
jarry@MacBook-Pro list % gcc list.c
jarry@MacBook-Pro list % ./a.out
List: 10 20 30 40
Element at index 2: 30
List: 10 20 30
Size: 3
Capacity: 10
New Capacity: 20
*/