C++基于單鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
本文實(shí)例為大家分享了C++實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
/*程序說明:
? ? 程序是由單鏈表實(shí)現(xiàn)的學(xué)生成績(jī)管理系統(tǒng),主要功能有輸入/查找/刪除/修改/排序/顯示學(xué)生成績(jī);
? ? 輸入功能由帶頭結(jié)點(diǎn)的單鏈表實(shí)現(xiàn),并且使用前插法輸入學(xué)生信息;
? ? 輸入功能可以實(shí)現(xiàn)插入學(xué)生信息的功能,所以無需再專門寫一個(gè)插入的函數(shù);
? ? 刪除/修改學(xué)生信息要用到查找功能,所以將查找與刪除/修改功能寫到一起;
? ? 查找功能使用順序查找遍歷整個(gè)單鏈表;
? ? 使用直接插入法對(duì)學(xué)生信息排序;
? ? 程序主要復(fù)習(xí)對(duì)單鏈表的使用,所以并沒有完整的對(duì)錯(cuò)誤輸入的保護(hù)功能;
? ? 由于學(xué)過的是c++,但教科書是由c語(yǔ)言為主,所以寫的代碼是混合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];
? ? //成績(jī)
? ? 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***********************成績(jī)輸入入口***********************\n";
? ? cout << "請(qǐng)輸入你想輸入的學(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é)成績(jī):\n";
? ? ? ? cin >> p->Math;
? ? ? ? cout << "輸入學(xué)生英語(yǔ)成績(jī):\n";
? ? ? ? cin >> p->English;
? ? ? ? cout << "輸入學(xué)生語(yǔ)文成績(jī):\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***********************成績(jī)查改入口***********************\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 << "請(qǐng)輸入修正后的學(xué)生信息:\n";
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生學(xué)號(hào):\n";
? ? ? ? ? ? ? ? ? ? cin >> q->stuId;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生姓名:\n";
? ? ? ? ? ? ? ? ? ? cin >> q->name;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生數(shù)學(xué)成績(jī):\n";
? ? ? ? ? ? ? ? ? ? cin >> q->Math;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生英語(yǔ)成績(jī):\n";
? ? ? ? ? ? ? ? ? ? cin >> q->English;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生語(yǔ)文成績(jī):\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 << "請(qǐng)輸入修正后的學(xué)生信息:\n";
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生學(xué)號(hào):\n";
? ? ? ? ? ? ? ? ? ? cin >> q->stuId;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生姓名:\n";
? ? ? ? ? ? ? ? ? ? cin >> q->name;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生數(shù)學(xué)成績(jī):\n";
? ? ? ? ? ? ? ? ? ? cin >> q->Math;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生英語(yǔ)成績(jī):\n";
? ? ? ? ? ? ? ? ? ? cin >> q->English;
? ? ? ? ? ? ? ? ? ? cout << "輸入學(xué)生語(yǔ)文成績(jī):\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 << "查無此人";
? ? ? ? }
? ? }
}
//對(duì)學(xué)生信息排序
void Sort(LinkList llist)
{
? ? LinkList p, q, r;
? ? cout << "\n***********************成績(jī)排序入口***********************\n";
? ? if (llist->link == NULL)
? ? ? ? cout << "沒有學(xué)生信息記錄\n";
? ? else
? ? {
? ? ? ? cout << "選擇排序方式:\n"
? ? ? ? ? ? << "1.按學(xué)號(hào)\n2.按數(shù)學(xué)成績(jī)\n3.按英語(yǔ)成績(jī)\n4.按語(yǔ)文成績(jī)\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é)成績(jī)由高到低排列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? 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://按英語(yǔ)
? ? ? ? ? ? p = llist->link->link;
? ? ? ? ? ? llist->link->link = NULL;
? ? ? ? ? ? while (p != NULL)//英語(yǔ)成績(jī)由高到低排列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? 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://按語(yǔ)文
? ? ? ? ? ? p = llist->link->link;
? ? ? ? ? ? llist->link->link = NULL;
? ? ? ? ? ? while (p != NULL)//語(yǔ)文成績(jī)由高到低排列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? 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)//總分成績(jī)由高到低排列
? ? ? ? ? ? {
? ? ? ? ? ? ? ? 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***********************成績(jī)顯示入口***********************\n";
? ? if (llist->link == NULL)
? ? ? ? cout << "沒有學(xué)生信息記錄\n";
? ? else
? ? {
? ? ? ? cout << "學(xué)生信息如下:\n";
? ? ? ? cout << "學(xué)號(hào)\t 姓名\t 數(shù)學(xué)\t 英語(yǔ)\t 語(yǔ)文\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***********************成績(jī)管理系統(tǒng)***********************\n"
? ? ? ? ? ? << "請(qǐng)選擇你所需要的功能:\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();
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)BMP圖像細(xì)化處理
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像細(xì)化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
基于C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂系統(tǒng)
C++中的Beep 函數(shù)是一個(gè)發(fā)出嗡鳴聲的函數(shù),本文將利用這個(gè)函數(shù)實(shí)現(xiàn)制作一個(gè)簡(jiǎn)單的聲音系統(tǒng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12
C語(yǔ)言?使用qsort函數(shù)來進(jìn)行快速排序
排序方法有很多種:選擇排序,冒泡排序,歸并排序,快速排序等。?看名字都知道快速排序是目前公認(rèn)的一種比較好的排序算法。因?yàn)樗俣群芸欤韵到y(tǒng)也在庫(kù)里實(shí)現(xiàn)這個(gè)算法,便于我們的使用。?這就是qsort函數(shù)2022-02-02
在編程語(yǔ)言中怎樣定義隊(duì)列及其使用(C++)
這篇文章主要介紹了在編程語(yǔ)言中怎樣定義隊(duì)列,本文主要根據(jù)c++來介紹,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
C語(yǔ)言切割多層字符串(strtok_r strtok使用方法)
這篇文章主要介紹了C語(yǔ)言切割多層字符串的方法,說了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語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池的相關(guān)資料,設(shè)計(jì)內(nèi)存池的目標(biāo)是為了保證服務(wù)器長(zhǎng)時(shí)間高效的運(yùn)行,通過對(duì)申請(qǐng)空間小而申請(qǐng)頻繁的對(duì)象進(jìn)行有效管理,減少內(nèi)存碎片的產(chǎn)生,合理分配管理用戶內(nèi)存,需要的朋友可以參考下2021-08-08

