数据结构:单链表:学生成绩管理系统

// 单链表.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;


int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}


typedef struct LNode{
int No;
char name[10];
int grade;
struct LNode *next;
}LNode,*LinkList;


LinkList CreateList_L(LinkList &L, int n) {
//正位序插入n个元素的值,建立带头结点的单链表L、
LNode *r; LNode *p;
L = new LNode;
L->next = NULL; //先建立一个带头结点的单链表
r = L; //尾指针r指向头结点
for (int i = 0; i < n; ++i) {
p = new LNode; //生成新结点
cin >> p->No;
cin >> p->name;
cin >> p->grade;                        //输入元素值
p->next = NULL; //插入到表尾
r->next = p;
r = p; //r指向新的尾结点
}
return L;
}


LinkList InitList_L(LinkList &L){
//构造一个空的单链表L
L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
if (!L) exit(OVERFLOW); //存储分配失败
L -> next = NULL; //头结点的指针域为空
return L;
}




LinkList ListInsert_L(LinkList &L, int i, ElemType e){
//在带头结点的单链表L中第i个位置前插入元素e
int j;
LinkList p, s;
p = L; j = 0;
while (p&&j < i - 1) { p = p->next; ++j; } //寻找第i-1个结点
if (!p || j>i - 1) return ERROR; //i大于表长+1或者小于1
s = new LNode; //生成新结点s
s->grade = e; //将结点s的数据域置为e
s->next = p->next; //将结点s插入L中
p->next = s;
return L;
}




Status GetElem_L(LinkList L, int i, ElemType &e){
//在带头结点的单链表L中查找第i个元素
LinkList p;
int j;
p = L->next; j = 1; //初始化,p指向第一个结点,j为计数器
while (p&&j < i){ //顺链域向后扫描,直到p指向第i个元素或p为空
p = p->next; ++j;
}
if (!p || j>i) return ERROR; //第i个元素不存在
e = p->grade; //取第i个元素
return OK;
}


LNode *LocateElem_t(LinkList L, ElemType &e){
//在带头结点的单链表L中查找值为e的元素
LinkList p;
p = L->next;
while (p && p->No != e)
p = p->next; //寻找满足条件的结点
return p; //返回L中值为e的数据元素的位置,查找失败返回NULL
}




LinkList ListDelete_L(LinkList &L, int i, ElemType &e){
//在带头结点的单链表L中删除第i个元素,并由e返回其值
LinkList p, q;
int j;
p = L; j = 0;
while (p->next && j < i - 1) { p = p->next; ++j; } //寻找第i-1个结点
if (!(p->next) || j>i - 1) return ERROR; //i大于表长+1或者小于1
q = p->next; //临时保存被删结点的地址以备释放
p->next = q->next;                                  //改变删除结点前驱结点的指针域
e = q->grade;     //保存删除结点的数据域
delete q; //释放删除结点的空间
return L;
}


LinkList OutPut_L(LinkList L)
{
LNode *p;
p = L->next;
while (p != NULL)
{
cout << p->No << " " << p->name << " " << p->grade << endl;
p = p->next;
}
return L;
}


void Fix_L(LinkList L)


{
int i, j = 1;
ElemType k;
ElemType e, m;
LinkList p = L->next;
cout << "请输入要修改成绩的同学的学号:";
cin >> i;
GetElem_L(L, i, e);
cout << "请从新输入成绩:" << e << endl;
cout << "修改后的成绩:";
cin >> k;
while (p&&j<i)
{
p = p->next;
++j;
}
m = p->grade;
p->grade = k;
cout << "修改后的单链表显示如下:" << endl;
OutPut_L(L);


}


int main()
{
LNode a1;
LinkList L=NULL,p=NULL;
ElemType res;
int a, b;
int c = 1;
L = InitList_L(L);
cout << "--------------------------------------------" << endl;
cout << "|        1------新建单链表                 |" << endl;
cout << "|        2------输入学生信息               |" << endl;
cout << "|        3------按成绩查找                 |" << endl;
cout << "|        4------按数值查找                 |" << endl;
cout << "|        5------插入学生                   |" << endl;
cout << "|        6------删除学生                   |" << endl;
cout << "|        7------修改成绩                   |" << endl;
cout << "|        8------显式全部学生信息           |" << endl;
cout << "|        0------退出程序                   |" << endl;
cout << "--------------------------------------------" << endl;
cout << " 请选择菜单号(0--8):" << endl;


unsigned i = 0;
while (c)
{
cin >> i;
switch (i)
{
case 1:
if (InitList_L(L))
cout << "单链表创建成功" << endl;
else
cout << "单链表创建失败" << endl;
break;
case 2:
cout << "请输入学号、姓名、成绩:" << endl;
cin >> a1.No >> a1.name >> a1.grade;
L = CreateList_L(L, 3);
break;
case 3:
cout << "请输入学号用于查找";
cin >> a;
if (GetElem_L(L, a, res))
cout << "查找成功!学号为" << a << "的同学成绩是" << res << endl;
else
cout << "查找失败" << endl;
break;
case 4:
cout << "请输入一个成绩用于查找" << endl;
cin >> b;
if (LocateElem_t(L, b) != NULL)
cout << "查找成功" << endl;
else
cout << "查找失败" << endl;
break;
case 5:
cout << "请输入两个数值,分别代表插入的位置和数值:" << endl;
cin >> a >> b;
if (ListInsert_L(L, a, b))
cout << "成功将" << b << "插在第" << a << "个位置";
else
cout << "插入失败";
break;
case 6:
cout << "请输入一个位置用来删除:" << endl;
cin >> a;
if (ListDelete_L(L, a, res))
cout << "删除成功!被删除的数是" << res << endl;
else
cout << "删除失败!" << endl;
break;
case 7:
Fix_L(L);
break;
case 8:
cout << "现在单链表里的数分别是:" << endl;
cout << OutPut_L(L);
cout << endl;
break;
}
}
system("pause");
return 0;
}
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值