动态内存分配(2)——经典例题的讲解
发布人:shili8
发布时间:2024-12-24 08:20
阅读次数:0
**动态内存分配(2)——经典例题的讲解**
在前一篇文章中,我们讨论了动态内存分配的基本概念和原理。今天,我们将继续讨论这个主题,并通过一个经典的例题来演示如何使用动态内存分配。
**例题:学生信息管理系统**
假设我们要开发一个学生信息管理系统,需要能够添加、删除和修改学生信息。每个学生都有一个唯一的学号,姓名、年龄和成绩等信息。
为了实现这个功能,我们需要能够动态地分配内存来存储学生信息。下面是使用 C语言编写的例子代码:
c#include <stdio.h> #include <stdlib.h> // 定义学生结构体typedef struct { int id; // 学号 char name[20]; // 姓名 int age; // 年龄 float score; // 成绩} Student; // 函数声明void addStudent(Student **students, int *numStudents); void deleteStudent(Student **students, int *numStudents, int id); void modifyStudent(Student **students, int *numStudents, int id); int main() { int numStudents =0; // 当前学生数量 Student *students = NULL; // 学生信息数组 addStudent(&students, &numStudents); // 添加第一个学生 printf("添加成功! "); deleteStudent(&students, &numStudents,1); // 删除第一个学生 printf("删除成功! "); modifyStudent(&students, &numStudents,2); // 修改第二个学生的信息 printf("修改成功! "); return0; } // 添加学生函数void addStudent(Student **students, int *numStudents) { Student *newStudent = (Student *)malloc(sizeof(Student)); // 动态分配内存 if (newStudent == NULL) { printf("内存分配失败! "); return; } newStudent->id =1; // 学号 strcpy(newStudent->name, "张三"); // 姓名 newStudent->age =20; // 年龄 newStudent->score =90.0f; // 成绩 if (*numStudents ==0) { *students = newStudent; } else { Student *temp = *students; while (temp->next != NULL) { temp = temp->next; } temp->next = newStudent; } (*numStudents)++; } // 删除学生函数void deleteStudent(Student **students, int *numStudents, int id) { if (*numStudents ==0) { printf("没有学生! "); return; } Student *temp = *students; while (temp != NULL && temp->id != id) { temp = temp->next; } if (temp == NULL) { printf("找不到学生! "); return; } if (temp == *students) { *students = temp->next; } else { Student *prev = *students; while (prev->next != temp) { prev = prev->next; } prev->next = temp->next; } free(temp); //释放内存 (*numStudents)--; printf("删除成功! "); } // 修改学生函数void modifyStudent(Student **students, int *numStudents, int id) { if (*numStudents ==0) { printf("没有学生! "); return; } Student *temp = *students; while (temp != NULL && temp->id != id) { temp = temp->next; } if (temp == NULL) { printf("找不到学生! "); return; } // 修改学生信息 strcpy(temp->name, "李四"); // 姓名 temp->age =25; // 年龄 printf("修改成功! "); }
在这个例子中,我们定义了一个 `Student` 结构体来存储学生的信息。我们使用动态内存分配函数 `malloc()` 来分配内存来存储每个学生的信息。
当添加、删除或修改学生时,我们会根据需要重新分配内存来更新学生信息。
**注意**:在这个例子中,我们使用了一个链式结构来存储学生信息。每个学生都有一个 `next` 指针指向下一个学生。这使得我们可以方便地添加、删除和修改学生信息。
**总结**
通过这个经典的例题,我们演示了如何使用动态内存分配来实现学生信息管理系统。在这个例子中,我们定义了一个 `Student` 结构体来存储学生的信息,并使用动态内存分配函数 `malloc()` 来分配内存来存储每个学生的信息。
我们还演示了如何添加、删除和修改学生信息,包括重新分配内存来更新学生信息。