学生成绩管理系统V2.0(单链表LinkNode)

#include
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;

//输入学生信息
LinkList Input(LinkList llist)
{
LinkList p;
long int n;
cout << “\n成绩输入入口\n”;
cout << “请输入你想输入的学生信息个数:\n”;
cin >> n;
for (int i = n; i > 0; i–)//前插法插入信息
{
p = (LinkList)malloc(sizeof(struct Node));
cout << “输入学生学号:\n”;
cin >> p->stuId;
cout << “输入学生姓名:\n”;
cin >> p->name;
cout << “输入学生数学成绩:\n”;
cin >> p->Math;
cout << “输入学生英语成绩:\n”;
cin >> p->English;
cout << “输入学生语文成绩:\n”;
cin >> p->Chinese;

    p->sum = p->Math + p->English + p->Chinese;//总分

    //使用含有头结点的单链表实现信息的输入
    p->link = llist->link;
    llist->link = p;
}
return llist;

}

//查找/修正学生的信息
void Check(LinkList llist)
{
LinkList p, q;
long int id;
char sName[30];
cout << “\n成绩查改入口\n”;
if (llist->link == NULL)
cout << “没有学生信息记录\n”;
else
{
cout << “输入查找方式:\n”
<< “1.按学号查找\n2.按姓名查找\n”;
int a;
cin >> a;
if (a == 1)//按学号查找
{
p = llist;
q = p->link;
cout << “输入学生学号:\n”;
cin >> id;
while (q->stuId != id&&q->link != NULL)//从单链表表头顺序查找
{
p = q;
q = q->link;
}
if (q->stuId == id)
{
cout << “学生信息如下:\n”;
cout << q->stuId << “\t” << q->name << “\t” << q->Math << “\t”
<< q->English << “\t” << q->Chinese << “\t” << q->sum << endl;
cout << “输入功能序号:\n”
<< “1.修改学生信息\n2.删除学生信息\n0.退出\n”;
int b;
cin >> b;
if (b == 1)//修改学生信息
{
cout << “请输入修正后的学生信息:\n”;
cout << “输入学生学号:\n”;
cin >> q->stuId;
cout << “输入学生姓名:\n”;
cin >> q->name;
cout << “输入学生数学成绩:\n”;
cin >> q->Math;
cout << “输入学生英语成绩:\n”;
cin >> q->English;
cout << “输入学生语文成绩:\n”;
cin >> q->Chinese;

                q->sum = q->Math + q->English + q->Chinese;
            }
            else if (b == 2)//删除学生信息
            {
                p->link = q->link;
                free(q);
            }
        }
        else
            cout << "查无此人\n";
    }

    else if (a == 2)//按姓名查找
    {
        p = llist;
        q = p->link;
        cout << "输入学生姓名:\n";
        cin >> sName;
        while (strcmp(sName, q->name) != 0 && q->link != NULL)//从单链表表头顺序查找
        {
            p = q;
            q = q->link;
        }
        if (strcmp(sName, q->name) == 0)
        {
            cout << "学生信息如下:\n";
            cout << q->stuId << "\t" << q->name << "\t" << q->Math << "\t"
                << q->English << "\t" << q->Chinese << "\t" << q->sum << endl;
            cout << "输入功能序号:\n"
                << "1.修改学生信息\n2.删除学生信息\n0.退出\n";
            int b;
            cin >> b;
            if (b == 1)//修改学生信息
            {
                cout << "请输入修正后的学生信息:\n";
                cout << "输入学生学号:\n";
                cin >> q->stuId;
                cout << "输入学生姓名:\n";
                cin >> q->name;
                cout << "输入学生数学成绩:\n";
                cin >> q->Math;
                cout << "输入学生英语成绩:\n";
                cin >> q->English;
                cout << "输入学生语文成绩:\n";
                cin >> q->Chinese;

                q->sum = q->Math + q->English + q->Chinese;
            }
            else if (b == 2)//删除学生信息
            {
                p->link = q->link;
                free(q);
            }
        }
        else
            cout << "查无此人";
    }
}

}

//对学生信息排序
void Sort(LinkList llist)
{
LinkList p, q, r;
cout << “\n成绩排序入口\n”;

if (llist->link == NULL)
    cout << "没有学生信息记录\n";
else
{
    cout << "选择排序方式:\n"
        << "1.按学号\n2.按数学成绩\n3.按英语成绩\n4.按语文成绩\n5.按总分\n";
    int a;
    cin >> a;
    //使用直接插入法进行排序
    switch (a)
    {
    case 1://按学号
        p = llist->link->link;
        llist->link->link = NULL;
        while (p != NULL)//学号由小到大排列
        {
            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://按数学
        p = llist->link->link;
        llist->link->link = NULL;
        while (p != NULL)//数学成绩由高到低排列
        {
            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;
    }
}

}

//显示学生的信息
void Display(LinkList llist)
{
LinkList p;
p = llist->link;
cout << “\n成绩显示入口\n”;
if (llist->link == NULL)
cout << “没有学生信息记录\n”;
else
{
cout << “学生信息如下:\n”;
cout << “学号\t 姓名\t 数学\t 英语\t 语文\t 总分\n”;
while §//输出学生信息
{
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)//循环使用菜单
{
cout << “\n成绩管理系统\n”
<< “请选择你所需要的功能:\n”
<< “1.输入学生信息\n2.查找/修正学生信息\n3.排序学生信息\n4.显示学生信息\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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值