C++栈存储学生信息如何实现按分数展示Top3学生功能
问题修复方案
核心问题原因
- 你编写的
shortStack冒泡排序仅完成了分数大小判断,缺少相邻学生数据交换的逻辑 top方法中调用shortStack的代码被注释,执行选项4时不会触发排序逻辑- 缺少学生总数不足3人的边界判断,极端情况会触发空指针访问崩溃
修复代码
1. 完善shortStack排序逻辑
这里选择直接交换相邻节点存储的学生数据,相比修改链表指针更易理解:
void shortStack( ) { // 边界判断:节点数小于2无需排序 if (sizeOfStack < 2) return; for ( std::size_t i = 0; i < sizeOfStack; ++i ) { Student* ptr = headStudent; // 冒泡排序优化:已排序的末尾部分无需重复判断 for ( std::size_t j = 0; j < sizeOfStack - 1 - i; ++j ) { if ( ptr->getMarks( ) < ptr->getNextStudent( )->getMarks( ) ) { // 交换姓名 string tempName = ptr->getName(); ptr->setName(ptr->getNextStudent()->getName()); ptr->getNextStudent()->setName(tempName); // 交换分数 int tempMark = ptr->getMarks(); ptr->setMarks(ptr->getNextStudent()->getMarks()); ptr->getNextStudent()->setMarks(tempMark); } ptr = ptr->getNextStudent( ); } } }
2. 修复top方法
打开排序调用,添加边界判断避免越界:
void top( ) { if ( !isEmpty( ) ) { // 启用排序逻辑 shortStack(); cout << "\n\n" << "Top Positions:" << '\n'; cout << '\n' << "Name\t\tMarks"; Student* ptr = headStudent; // 取3和总人数的最小值,避免学生不足3人时访问空指针 std::size_t showCount = min(static_cast<std::size_t>(3), sizeOfStack); for( std::size_t idx = 0; idx < showCount; ++idx ) { cout << '\n' << ptr->getName( ) << "\t\t" << ptr->getMarks( ); ptr = ptr->getNextStudent( ); } cout << "\n\n"; } }
额外说明
你当前实现的栈是链表尾插尾删的结构,符合栈后进先出的特性,排序逻辑仅调整存储顺序满足取高分的需求,不会破坏栈的基础功能。
内容的提问来源于stack exchange,提问作者luziamas
相关产品推荐
相关产品推荐

