需求分析
管理 10 位學生成績,功能:輸入、顯示、查找、最高分、插入、排序、退出。界面為多級菜單確認機制。
數據結構設計
struct Student {
int id; // 學號/序號
char name[20]; // 姓名
float score; // 成績
Student* next; // 鏈表指針
};
class GradeSystem {
Student* head; // 鏈表頭
int count; // 當前節點數
// 功能方法...
};
核心功能實現框架
| 功能 | 關鍵邏輯 | 時間複雜度 |
| 輸入成績 | 尾插法建立鏈表,驗證輸入合法性 | O(n) |
| 顯示成績 | 遍歷鏈表格式化輸出 | O(n) |
| 查找成績 | 按姓名/學號遍歷比對,或排序後二分查找 | O(n) / O(log n) |
| 最高成績 | 遍歷記錄最大值節點 | O(n) |
| 插入成績 | 指定位置/有序插入,修改指針 | O(n) |
| 排序(降序) | 鏈表歸併排序或轉數組快排再重建 | O(n log n) |
菜單驅動主循環
void run() {
while (true) {
printMainMenu(); // 1.輸入 2.顯示 3.查找 4.最高 5.插入 6.排序 0.退出
int choice = getChoice();
if (choice == 0) break;
if (!confirmChoice(choice)) continue; // 二級確認菜單
switch (choice) {
case 1: inputScores(); break;
case 2: displayScores(); break;
case 3: queryScore(); break;
case 4: showMaxScore(); break;
case 5: insertScore(); break;
case 6: sortScores(); break;
}
pause(); // 按任意鍵繼續
}
}
關鍵難點:鏈表排序
// 歸併排序(適合鏈表,穩定、O(n log n)、O(log n)棧空間)
Student* mergeSort(Student* head) {
if (!head || !head->next) return head;
// 1. 快慢指針找中點分割
Student *slow = head, *fast = head->next;
while (fast && fast->next) { slow = slow->next; fast = fast->next->next; }
Student* mid = slow->next; slow->next = nullptr;
// 2. 遞歸排序左右半部
Student* left = mergeSort(head);
Student* right = mergeSort(mid);
// 3. 合併兩有序鏈表(降序)
return mergeDesc(left, right);
}
Student* mergeDesc(Student* a, Student* b) {
Student dummy; Student* tail = &dummy;
while (a && b) {
if (a->score >= b->score) { tail->next = a; a = a->next; }
else { tail->next = b; b = b->next; }
tail = tail->next;
}
tail->next = a ? a : b;
return dummy.next;
}
擴展建議
- 文件持久化:退出時序列化鏈表到二進制文件,啟動時反序列化
- 動態內存檢查:`new` 失敗處理、退出時完整釋放鏈表內存
- 單元測試:每個功能函數編寫獨立測試用例
- 上一篇文章: Java Servlet Cookie生命周期控制:會話級與持久化Cookie的設置與刪除
- 下一篇文章: C語言三層循環死循環排查:循環變量誤用導致程序卡死
Copyright ©
程式碼之家 All Rights Reserved