使用链表存储学生绩点,删除低于平均绩点的节点

需积分: 10 0 下载量 98 浏览量 更新于2024-08-05 收藏 7KB TXT 举报
"第九次作业123456789" 在本次作业中,我们需要创建一个链表来存储学生的信息,包括姓名、学号和绩点。链表的结构设计如下: ```c struct Student { char name[20]; int num; float gpa; // 绩点(gradepointaverage) struct Student* next; }; ``` 这个结构体定义了一个学生节点,包含了学生的姓名(`name`)、学号(`num`)、绩点(`gpa`)以及指向下一个学生节点的指针(`next`)。`LEN`宏定义为结构体`Student`的大小,方便内存分配。 在`main()`函数中,我们首先初始化两个指针`p1`和`p2`,然后通过循环读取用户输入的一组学生数据。数据输入格式是:姓名、学号、绩点,其中用星号('*')作为输入结束的标志。数据读取过程中,`sum`用于累加所有学生的绩点,`n`记录学生数量,`average`则是计算平均绩点。 链表的构建是通过动态内存分配实现的,每次读取完一个学生的信息后,都会将新节点添加到链表中。如果当前读取的是第一个学生,那么`head`指向新节点;否则,将前一个节点的`next`指针指向新节点。 在数据输入结束后,我们需要删除链表中绩点低于平均绩点的学生。这里通过遍历链表,对每个节点进行判断: 1. 如果当前节点的绩点大于平均绩点,保持指针不变,继续检查下一个节点。 2. 如果当前节点的绩点小于平均绩点且它是头节点,需要更新头指针为下一个节点,并释放当前节点的内存。 3. 如果当前节点的绩点小于平均绩点但不是头节点,需要找到它的前一个节点(`p2`),更新`p2->next`为当前节点的下一个节点,然后释放当前节点的内存。 这个过程确保了链表中只保留了绩点大于或等于平均绩点的学生信息。在遍历完成后,新的链表结构就形成了,其中不包含绩点低于平均值的学生。 这个程序示例展示了基本的链表操作,包括链表的创建、遍历以及节点的插入和删除。对于初学者来说,理解这个代码可以帮助深入理解链表数据结构及其操作方法。同时,这个例子也强调了动态内存管理的重要性,特别是在处理结构体数组或链表时,需要正确地分配和释放内存。