C++基于單鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)
更新時(shí)間:2022年05月30日 17:18:25 作者:昭昭霜影
這篇文章主要為大家詳細(xì)介紹了C++基于單鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了C++實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
/*程序說明:
? ? 程序是由單鏈表實(shí)現(xiàn)的學(xué)生成績管理系統(tǒng),主要功能有輸入/查找/刪除/修改/排序/顯示學(xué)生成績;
? ? 輸入功能由帶頭結(jié)點(diǎn)的單鏈表實(shí)現(xiàn),并且使用前插法輸入學(xué)生信息;
? ? 輸入功能可以實(shí)現(xiàn)插入學(xué)生信息的功能,所以無需再專門寫一個(gè)插入的函數(shù);
? ? 刪除/修改學(xué)生信息要用到查找功能,所以將查找與刪除/修改功能寫到一起;
? ? 查找功能使用順序查找遍歷整個(gè)單鏈表;
? ? 使用直接插入法對學(xué)生信息排序;
? ? 程序主要復(fù)習(xí)對單鏈表的使用,所以并沒有完整的對錯(cuò)誤輸入的保護(hù)功能;
? ? 由于學(xué)過的是c++,但教科書是由c語言為主,所以寫的代碼是混合c與c++;
? ? 編譯環(huán)境:visual studio 2017
? ? 2017.5.13
*/
#include<iostream>
using namespace std;
struct Node;
typedef struct Node* PNode;
struct Node
{
? ? long int stuId;
? ? char name[30];
? ? //成績
? ? float Math;
? ? float English;
? ? float Chinese;
? ? float sum;//總分
? ? PNode link;
};
typedef struct Node* LinkList;
//輸入學(xué)生信息
LinkList Input(LinkList llist)
{
? ? LinkList p;
? ? long int n;
? ? cout << "\n***********************成績輸入入口***********************\n";
? ? cout << "請輸入你想輸入的學(xué)生信息個(gè)數(shù):\n";
? ? cin >> n;
? ? for (int i = n; i > 0; i--)//前插法插入信息
? ? {
? ? ? ? p = (LinkList)malloc(sizeof(struct Node));
? ? ? ? cout << "輸入學(xué)生學(xué)號(hào):\n";
? ? ? ? cin >> p->stuId;
? ? ? ? cout << "輸入學(xué)生姓名:\n";
? ? ? ? cin >> p->name;
? ? ? ? cout << "輸入學(xué)生數(shù)學(xué)成績:\n";
? ? ? ? cin >> p->Math;
? ? ? ? cout << "輸入學(xué)生英語成績:\n";
? ? ? ? cin >> p->English;
? ? ? ? cout << "輸入學(xué)生語文成績:\n";
? ? ? ? cin >> p->Chinese;
? ? ? ? p->sum = p->Math + p->English + p->Chinese;//總分
? ? ? ? //使用含有頭結(jié)點(diǎn)的單鏈表實(shí)現(xiàn)信息的輸入
? ? ? ? p->link = llist->link;
? ? ? ? llist->link = p;
? ? }
? ? return llist;
}
//查找/修正學(xué)生的信息
void Check(LinkList llist)
{
? ? LinkList p, q;
? ? long int id;
? ? char sName[30];
? ? cout << "\n***********************成績查改入口***********************\n";
? ? if (llist->link == NULL)
? ? ? ? cout << "沒有學(xué)生信息記錄\n";
? ? else
? ? {
? ? ? ? cout << "輸入查找方式:\n"
? ? ? ? ? ? << "1.按學(xué)號(hào)查找\n2.按姓名查找\n";
? ? ? ? int a;
? ? ? ? cin >> a;
? ? ? ? if (a == 1)//按學(xué)號(hào)查找
? ? ? ? {
? ? ? ? ? ? p = llist;
? ? ? ? ? ? q = p->link;
? ? ? ? ? ? cout << "輸入學(xué)生學(xué)號(hào):\n";
? ? ? ? ? ? cin >> id;
? ? ? ? ? ? while (q->stuId != id&&q->link != NULL)//從單鏈表表頭順序查找
? ? ? ? ? ? {
? ? ? ? ? ? ? ? p = q;
? ? ? ? ? ? ? ? q = q->link;
? ? ? ? ? ? }
? ? ? ? ? ? if (q->stuId == id)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cout << "學(xué)生信息如下:\n";
? ? ? ? ? ? ? ? cout << q->stuId << "\t" << q->name << "\t" << q->Math << "\t"
? ? ? ? ? ? ? ? ? ? << q->English << "\t" << q->Chinese << "\t" << q->sum << endl;
? ? ? ? ? ? ? ? cout << "輸入功能序號(hào):\n"
? ? ? ? ? ? ? ? ? ? << "1.修改學(xué)生信息\n2.刪除學(xué)生信息\n0.退出\n";
? ? ? ? ? ? ? ? int b;
? ? ? ? ? ? ? ? cin >> b;
? ? ? ? ? ? ? ? if (b == 1)//修改學(xué)生信息
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? cout << "請輸入修正后的學(xué)生信息:\n";
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生學(xué)號(hào):\n";
? ? ? ? ? ? ? ? ? ? cin >> q->stuId;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生姓名:\n";
? ? ? ? ? ? ? ? ? ? cin >> q->name;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生數(shù)學(xué)成績:\n";
? ? ? ? ? ? ? ? ? ? cin >> q->Math;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生英語成績:\n";
? ? ? ? ? ? ? ? ? ? cin >> q->English;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生語文成績:\n";
? ? ? ? ? ? ? ? ? ? cin >> q->Chinese;
? ? ? ? ? ? ? ? ? ? q->sum = q->Math + q->English + q->Chinese;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else if (b == 2)//刪除學(xué)生信息
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? p->link = q->link;
? ? ? ? ? ? ? ? ? ? free(q);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? ? ? cout << "查無此人\n";
? ? ? ? }
? ? ? ? else if (a == 2)//按姓名查找
? ? ? ? {
? ? ? ? ? ? p = llist;
? ? ? ? ? ? q = p->link;
? ? ? ? ? ? cout << "輸入學(xué)生姓名:\n";
? ? ? ? ? ? cin >> sName;
? ? ? ? ? ? while (strcmp(sName, q->name) != 0 && q->link != NULL)//從單鏈表表頭順序查找
? ? ? ? ? ? {
? ? ? ? ? ? ? ? p = q;
? ? ? ? ? ? ? ? q = q->link;
? ? ? ? ? ? }
? ? ? ? ? ? if (strcmp(sName, q->name) == 0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cout << "學(xué)生信息如下:\n";
? ? ? ? ? ? ? ? cout << q->stuId << "\t" << q->name << "\t" << q->Math << "\t"
? ? ? ? ? ? ? ? ? ? << q->English << "\t" << q->Chinese << "\t" << q->sum << endl;
? ? ? ? ? ? ? ? cout << "輸入功能序號(hào):\n"
? ? ? ? ? ? ? ? ? ? << "1.修改學(xué)生信息\n2.刪除學(xué)生信息\n0.退出\n";
? ? ? ? ? ? ? ? int b;
? ? ? ? ? ? ? ? cin >> b;
? ? ? ? ? ? ? ? if (b == 1)//修改學(xué)生信息
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? cout << "請輸入修正后的學(xué)生信息:\n";
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生學(xué)號(hào):\n";
? ? ? ? ? ? ? ? ? ? cin >> q->stuId;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生姓名:\n";
? ? ? ? ? ? ? ? ? ? cin >> q->name;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生數(shù)學(xué)成績:\n";
? ? ? ? ? ? ? ? ? ? cin >> q->Math;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生英語成績:\n";
? ? ? ? ? ? ? ? ? ? cin >> q->English;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生語文成績:\n";
? ? ? ? ? ? ? ? ? ? cin >> q->Chinese;
? ? ? ? ? ? ? ? ? ? q->sum = q->Math + q->English + q->Chinese;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else if (b == 2)//刪除學(xué)生信息
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? p->link = q->link;
? ? ? ? ? ? ? ? ? ? free(q);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? else
? ? ? ? ? ? ? ? cout << "查無此人";
? ? ? ? }
? ? }
}
//對學(xué)生信息排序
void Sort(LinkList llist)
{
? ? LinkList p, q, r;
? ? cout << "\n***********************成績排序入口***********************\n";
? ? if (llist->link == NULL)
? ? ? ? cout << "沒有學(xué)生信息記錄\n";
? ? else
? ? {
? ? ? ? cout << "選擇排序方式:\n"
? ? ? ? ? ? << "1.按學(xué)號(hào)\n2.按數(shù)學(xué)成績\n3.按英語成績\n4.按語文成績\n5.按總分\n";
? ? ? ? int a;
? ? ? ? cin >> a;
? ? ? ? //使用直接插入法進(jìn)行排序
? ? ? ? switch (a)
? ? ? ? {
? ? ? ? case 1://按學(xué)號(hào)
? ? ? ? ? ? p = llist->link->link;
? ? ? ? ? ? llist->link->link = NULL;
? ? ? ? ? ? while (p != NULL)//學(xué)號(hào)由小到大排列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? r = p->link;
? ? ? ? ? ? ? ? q = llist;
? ? ? ? ? ? ? ? while (q->link != NULL&&q->link->stuId < p->stuId)//查找插入位置
? ? ? ? ? ? ? ? ? ? q = q->link;
? ? ? ? ? ? ? ? //插入
? ? ? ? ? ? ? ? p->link = q->link;
? ? ? ? ? ? ? ? q->link = p;
? ? ? ? ? ? ? ? p = r;
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case 2://按數(shù)學(xué)
? ? ? ? ? ? p = llist->link->link;
? ? ? ? ? ? llist->link->link = NULL;
? ? ? ? ? ? while (p != NULL)//數(shù)學(xué)成績由高到低排列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? r = p->link;
? ? ? ? ? ? ? ? q = llist;
? ? ? ? ? ? ? ? while (q->link != NULL&&q->link->Math > p->Math)//查找插入位置
? ? ? ? ? ? ? ? ? ? q = q->link;
? ? ? ? ? ? ? ? //插入
? ? ? ? ? ? ? ? p->link = q->link;
? ? ? ? ? ? ? ? q->link = p;
? ? ? ? ? ? ? ? p = r;
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case 3://按英語
? ? ? ? ? ? p = llist->link->link;
? ? ? ? ? ? llist->link->link = NULL;
? ? ? ? ? ? while (p != NULL)//英語成績由高到低排列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? r = p->link;
? ? ? ? ? ? ? ? q = llist;
? ? ? ? ? ? ? ? while (q->link != NULL&&q->link->English > p->English)//查找插入位置
? ? ? ? ? ? ? ? ? ? q = q->link;
? ? ? ? ? ? ? ? //插入
? ? ? ? ? ? ? ? p->link = q->link;
? ? ? ? ? ? ? ? q->link = p;
? ? ? ? ? ? ? ? p = r;
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case 4://按語文
? ? ? ? ? ? p = llist->link->link;
? ? ? ? ? ? llist->link->link = NULL;
? ? ? ? ? ? while (p != NULL)//語文成績由高到低排列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? r = p->link;
? ? ? ? ? ? ? ? q = llist;
? ? ? ? ? ? ? ? while (q->link != NULL&&q->link->Chinese > p->Chinese)//查找插入位置
? ? ? ? ? ? ? ? ? ? q = q->link;
? ? ? ? ? ? ? ? //插入
? ? ? ? ? ? ? ? p->link = q->link;
? ? ? ? ? ? ? ? q->link = p;
? ? ? ? ? ? ? ? p = r;
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? case 5://按總分
? ? ? ? ? ? p = llist->link->link;
? ? ? ? ? ? llist->link->link = NULL;
? ? ? ? ? ? while (p != NULL)//總分成績由高到低排列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? r = p->link;
? ? ? ? ? ? ? ? q = llist;
? ? ? ? ? ? ? ? while (q->link != NULL&&q->link->sum > p->sum)//查找插入位置
? ? ? ? ? ? ? ? ? ? q = q->link;
? ? ? ? ? ? ? ? //插入
? ? ? ? ? ? ? ? p->link = q->link;
? ? ? ? ? ? ? ? q->link = p;
? ? ? ? ? ? ? ? p = r;
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? }
? ? }
}
//顯示學(xué)生的信息
void Display(LinkList llist)
{
? ? LinkList p;
? ? p = llist->link;
? ? cout << "\n***********************成績顯示入口***********************\n";
? ? if (llist->link == NULL)
? ? ? ? cout << "沒有學(xué)生信息記錄\n";
? ? else
? ? {
? ? ? ? cout << "學(xué)生信息如下:\n";
? ? ? ? cout << "學(xué)號(hào)\t 姓名\t 數(shù)學(xué)\t 英語\t 語文\t 總分\n";
? ? ? ? while (p)//輸出學(xué)生信息
? ? ? ? {
? ? ? ? ? ? cout << p->stuId << "\t" << p->name << "\t" << p->Math << "\t"
? ? ? ? ? ? ? ? << p->English << "\t" << p->Chinese << "\t" << p->sum<<endl;
? ? ? ? ? ? p = p->link;
? ? ? ? }
? ? }
}
//程序主體
int main()
{
? ? LinkList llist= (LinkList)malloc(sizeof(struct Node));
? ? llist->link = NULL;
? ? int a, b=1;
? ? while (b)//循環(huán)使用菜單
? ? {
? ? ? ? cout << "\n***********************成績管理系統(tǒng)***********************\n"
? ? ? ? ? ? << "請選擇你所需要的功能:\n"
? ? ? ? ? ? << "1.輸入學(xué)生信息\n2.查找/修正學(xué)生信息\n3.排序?qū)W生信息\n4.顯示學(xué)生信息\n5.退出\n";
? ? ? ? cin >> a;
? ? ? ? switch (a)
? ? ? ? {
? ? ? ? case 1:
? ? ? ? ? ? llist=Input(llist);
? ? ? ? ? ? break;
? ? ? ? case 2:
? ? ? ? ? ? Check(llist);
? ? ? ? ? ? break;
? ? ? ? case 3:
? ? ? ? ? ? Sort(llist);
? ? ? ? ? ? break;
? ? ? ? case 4:
? ? ? ? ? ? Display(llist);
? ? ? ? ? ? break;
? ? ? ? case 5:
? ? ? ? ? ? b = 0;
? ? ? ? ? ? break;
? ? ? ? }
? ? }
? ? cout << "\n***********************感謝您的使用***********************\n";
? ? cin.get(); cin.get();
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于C++實(shí)現(xiàn)一個(gè)簡單的音樂系統(tǒng)
C++中的Beep 函數(shù)是一個(gè)發(fā)出嗡鳴聲的函數(shù),本文將利用這個(gè)函數(shù)實(shí)現(xiàn)制作一個(gè)簡單的聲音系統(tǒng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12
C語言?使用qsort函數(shù)來進(jìn)行快速排序
排序方法有很多種:選擇排序,冒泡排序,歸并排序,快速排序等。?看名字都知道快速排序是目前公認(rèn)的一種比較好的排序算法。因?yàn)樗俣群芸?,所以系統(tǒng)也在庫里實(shí)現(xiàn)這個(gè)算法,便于我們的使用。?這就是qsort函數(shù)2022-02-02
C語言切割多層字符串(strtok_r strtok使用方法)
這篇文章主要介紹了C語言切割多層字符串的方法,說了strtok的弱點(diǎn),使用strtok_r的方法2013-11-11
C++學(xué)習(xí)之Lambda表達(dá)式的用法詳解
Lambda?表達(dá)式(lambda?expression)是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名。本文就來為大家詳細(xì)講講C++中Lambda表達(dá)式的使用,需要的可以參考一下2022-07-07
詳解利用C語言如何實(shí)現(xiàn)簡單的內(nèi)存池
這篇文章主要給大家介紹了關(guān)于C語言如何實(shí)現(xiàn)簡單的內(nèi)存池的相關(guān)資料,設(shè)計(jì)內(nèi)存池的目標(biāo)是為了保證服務(wù)器長時(shí)間高效的運(yùn)行,通過對申請空間小而申請頻繁的對象進(jìn)行有效管理,減少內(nèi)存碎片的產(chǎn)生,合理分配管理用戶內(nèi)存,需要的朋友可以參考下2021-08-08

