#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义结构体
typedef struct {
int id;
char *name;
} Person;
// 定义指针数组,用于管理多个结构体数组
typedef Person** PersonArray;
// 添加新结构体元素到特定结构体数组
void addPerson(PersonArray *arr, int arrIndex, int id, const char *name) {
// 检查arrIndex是否越界
if (arrIndex < 0) {
printf("数组索引无效\n");
return;
}
// 如果arrIndex位置为空,初始化该位置
if (!(*arr)[arrIndex]) {
(*arr)[arrIndex] = (Person*)malloc(sizeof(Person));
if (!(*arr)[arrIndex]) {
printf("内存分配失败\n");
return;
}
(*arr)[arrIndex]->id = id;
(*arr)[arrIndex]->name = (char*)malloc(strlen(name) + 1);
if (!(*arr)[arrIndex]->name) {
printf("内存分配失败\n");
free(*arr)[arrIndex];
(*arr)[arrIndex] = NULL;
return;
}
strcpy((*arr)[arrIndex]->name, name);
return;
}
// 找到最后一个元素的位置
Person *current = (*arr)[arrIndex];
while (current->next) {
current = current->next;
}
// 分配新的结构体内存
Person *newPerson = (Person*)malloc(sizeof(Person));
if (!newPerson) {
printf("内存分配失败\n");
return;
}
newPerson->id = id;
newPerson->name = (char*)malloc(strlen(name) + 1);
if (!newPerson->name) {
printf("内存分配失败\n");
free(newPerson);
return;
}
strcpy(newPerson->name, name);
newPerson->next = NULL;
current->next = newPerson;
}
// 删除特定结构体数组中某个ID对应的元素
void deletePerson(PersonArray *arr, int arrIndex, int id) {
// 检查arrIndex是否越界
if (arrIndex < 0) {
printf("数组索引无效\n");
return;
}
if (!(*arr)[arrIndex]) {
printf("该数组为空\n");
return;
}
Person *current = (*arr)[arrIndex];
Person *prev = NULL;
while (current && current->id != id) {
prev = current;
current = current->next;
}
if (!current) {
printf("未找到ID为 %d 的元素\n", id);
return;
}
if (prev) {
prev->next = current->next;
} else {
(*arr)[arrIndex] = current->next;
}
free(current->name);
free(current);
}
// 释放所有动态分配内存
void freeAll(PersonArray arr, int size) {
for (int i = 0; i < size; i++) {
Person *current = arr[i];
Person *next;
while (current) {
next = current->next;
free(current->name);
free(current);
current = next;
}
}
free(arr);
}
int main() {
const int arraySize = 3;
PersonArray arr = (PersonArray)malloc(arraySize * sizeof(Person*));
if (!arr) {
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < arraySize; i++) {
arr[i] = NULL;
}
addPerson(&arr, 0, 1, "Alice");
addPerson(&arr, 0, 2, "Bob");
addPerson(&arr, 1, 3, "Charlie");
deletePerson(&arr, 0, 2);
freeAll(arr, arraySize);
return 0;
}
内存分配与释放过程说明:
addPerson
函数:
- 首先检查数组索引是否有效。如果
arrIndex
位置为空,为该位置分配Person
结构体内存。
- 为
name
成员分配内存,并复制名字。
- 如果
arrIndex
位置不为空,遍历链表找到最后一个元素,为新元素分配Person
结构体内存,再为name
成员分配内存并复制名字,最后将新元素连接到链表。
deletePerson
函数:
- 检查数组索引是否有效。如果该数组为空,直接返回。
- 遍历链表找到要删除的元素,释放
name
成员的内存,再释放Person
结构体的内存。
freeAll
函数:
- 遍历指针数组,对每个指针指向的链表,依次释放每个
Person
结构体的name
成员内存,再释放Person
结构体内存。
- 最后释放指针数组本身的内存。
main
函数:
- 为指针数组分配内存,并初始化为
NULL
。
- 调用
addPerson
添加元素,调用deletePerson
删除元素。
- 最后调用
freeAll
释放所有动态分配的内存。