数据结构顺序表小应用——学生成绩管理查询

数据结构顺序表实用练习
都是基本的函数调用和排序,加了点小小的选项。就算对顺序表的结构熟悉练练手吧。。。。

#include<string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
struct stu
{
    string name;
    string num;
    int m,e,c;
};
typedef  stu ElemType;
#define LIST_INIT_SIZE 1000 // 线性表存储空间的初始分配量
#define LISTINCREMENT 1000 // 线性表存储空间的分配增量
struct SqList
{
    ElemType elem[1000]; // 存储空间基址
    int length; // 当前长度
    int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
};
int InitList(SqList &L)
{
    // 操作结果:构造一个空的顺序线性表
//    L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem) exit(OVERFLOW); // 存储分配失败
    L.length=0; // 空表长度为0
    L.listsize=LIST_INIT_SIZE; // 初始存储容量
    return OK;
}

int ListLength(SqList L)///返回线性表元素个数
{
    return L.length;
}

int LocateElem(SqList L,ElemType e,int(*compare)(ElemType,ElemType))///算法2.6 按compare()位序返回元素
{
    // 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
    // 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
    // 若这样的数据元素不存在,则返回值为0。
    int i=0;
    ElemType *p=L.elem;
    while(i<=L.length&&!(*compare)(*p++,e))++i;
    if(i<=L.length)return i;
    else return 0;
}

int ListDelete(SqList &L,int i,ElemType &e) /// 算法2.5 删除元素
{
    // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
    // 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
    if((i<1)||(i>L.length))return ERROR;
    ElemType *p=&(L.elem[i-1]);
    e=*p;
    ElemType *q=L.elem+L.length-1;
    for(++p; p<=q; ++p) *(p-1)=*p;
    L.length--;
    return OK;
}

int ListTraverse(SqList L,void(*vi)(ElemType&))///依次对L的每个数据元素调用函数vi()
{
    // 初始条件:顺序线性表L已存在
    // 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
    //           vi()的形参 加'&',表明可通过调用vi()改变元素的值
    ElemType *p;
    int i;
    p=L.elem;
    for(i=1; i<=L.length; i++)
        vi(*p++);
    cout<<endl;//相当于c语言里面的printf("
")
    return OK;
}

int EndInsert(SqList &L,ElemType e)///在顺序表L 尾部 插入新元素
{
    // 初始条件:顺序线性表L已存在。操作结果:在L的尾部插入新的数据元素e,L的长度加1。
    ElemType *p,*q,*newbase;
//    if(L.length>=L.listsize)
//    {
//        if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
//            exit(OVERFLOW);
//        L.elem=newbase;
//        L.listsize+=LISTINCREMENT;
//    }
    q=L.elem+L.length;
    *q=e;
    L.length++;
    return OK;
}

int DeleteElem_num(SqList &L,ElemType e)///按学号删除
{
    // 删除表中值为e的元素,并返回TRUE;如无此元素,则返回FALSE
    ElemType *p;
    int flag=0;
    for(p=L.elem; p<=L.elem+L.length-1; p++)
    {
        if((*p).num==e.num)
        {
            flag=1;
            ElemType *q=L.elem+L.length-1;
            ElemType *P=p;
            for(++P; P<=q; ++P) *(P-1)=*P;
            L.length--;
            p--;
        }
    }
    return flag?TRUE:FALSE;
}

int comp_num(ElemType c1,ElemType c2)
{
    if(c1.num==c2.num)
        return TRUE;
    else
        return FALSE;
}
int comp_name(ElemType c1,ElemType c2)
{
    if(c1.name==c2.name)
        return TRUE;
    else
        return FALSE;
}
void output(SqList L,int local)
{
    cout<<L.elem[local].num<<"-----"<<L.elem[local].name<<"-----"<<L.elem[local].c<<"-----"<<L.elem[local].m<<"-----"<<L.elem[local].e<<endl;
    return;
}
void add_or_del(SqList &L)
{
    printf("1.增加学生信息
");
    printf("2.删除学生信息
");
    printf("请输入要执行的操作:");
    int work,n;
    ElemType tmp;
    scanf("%d",&work);
    if(work==1)
    {
        printf("请输入增加学生个数:
");
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            printf("请依次输入增加学生的姓名、学号:
",i);
            cin>>tmp.name;
            cin>>tmp.num;
            printf("请依次输入增加学生的语文、数学、英语成绩:
");
            scanf("%d%d%d",&tmp.c,&tmp.m,&tmp.e);
            EndInsert(L,tmp);
        }
        printf("增加完毕
");
    }
    else
    {
        printf("请输入删除学生个数:
");
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            printf("请输入要删除学生的学号:
");
            cin>>tmp.num;
            DeleteElem_num(L,tmp);
        }
        printf("删除完毕
");
    }
}

void check_stu(SqList &L)
{
    int work,n;
    ElemType tmp;
    printf("1.输入学号查找
");
    printf("2.输入姓名查找
");
    printf("请输入操作类型:
");
    scanf("%d",&work);
    printf("请输入要查找的学生个数:");
    scanf("%d",&n);
    if(work==1)
    {
        for(int i=0; i<n; i++)
        {
            printf("请输入要查找的学号:");
            cin>>tmp.num;
            int local=LocateElem(L,tmp,comp_num);
            if(local<=L.length)
                output(L,local);
            else printf("查无此人
");
        }
    }
    else
    {
        for(int i=0; i<n; i++)
        {
            printf("请输入要查找的姓名:");
            cin>>tmp.name;
            int local=LocateElem(L,tmp,comp_name);
            if(local<=L.length)
                output(L,local);
            else printf("查无此人
");
        }
    }
}
void check_mark(SqList &L)
{
    int work,low,high;
    ElemType tmp;
    printf("1.语文
");
    printf("2.数学
");
    printf("3.英语
");
    printf("请输入要查找的科目:");
    scanf("%d",&work);
    printf("请输入要查找的分数段:
");
    scanf("%d%d",&low,&high);
    if(work==1)
    {
        for(int i=0; i<L.length; i++)
            if(L.elem[i].c>=low&&L.elem[i].c<=high)
                output(L,i);
    }
    else if(work==2)
    {
        for(int i=0; i<L.length; i++)
            if(L.elem[i].m>=low&&L.elem[i].m<=high)
                output(L,i);
    }
    else
    {
        for(int i=0; i<L.length; i++)
            if(L.elem[i].e>=low&&L.elem[i].e<=high)
                output(L,i);
    }
}
bool c_up(ElemType a,ElemType b)
{
    return a.c<b.c;
}
bool c_down(ElemType a,ElemType b)
{
    return a.c>b.c;
}
bool m_up(ElemType a,ElemType b)
{
    return a.m<b.m;
}
bool m_down(ElemType a,ElemType b)
{
    return a.m>b.m;
}
bool e_up(ElemType a,ElemType b)
{
    return a.e<b.e;
}
bool e_down(ElemType a,ElemType b)
{
    return a.e>b.e;
}
void Sort(SqList &L)
{
    int work,up_down;
    ElemType tmp;
    printf("1.语文
");
    printf("2.数学
");
    printf("3.英语
");
    printf("请输入排序作为关键字的科目:");
    scanf("%d",&work);
    printf("1.升序
");
    printf("2.降序
");
    printf("请输入升序或降序操作:");
    scanf("%d",&up_down);
    if(work==1)
    {
        if(up_down==1)sort(L.elem,L.elem+L.length,c_up);
        else sort(L.elem,L.elem+L.length,c_down);
        for(int i=0; i<L.length; i++)output(L,i);
    }
    else if(work==2)
    {
        if(up_down==1)sort(L.elem,L.elem+L.length,m_up);
        else sort(L.elem,L.elem+L.length,m_down);
        for(int i=0; i<L.length; i++)output(L,i);
    }
    else
    {
        if(up_down==1)sort(L.elem,L.elem+L.length,e_up);
        else sort(L.elem,L.elem+L.length,e_down);
        for(int i=0; i<L.length; i++)output(L,i);
    }
}
int main()
{
    SqList La;
    InitList(La);
    int n;
    printf("请输入学生个数:");
    scanf("%d",&n);
    ElemType tmp;
    for(int i=1; i<=n; i++)
    {
        printf("请依次输入第%d个学生的姓名、学号:
",i);
        cin>>tmp.name;
        cin>>tmp.num;
        printf("请依次输入第%d个学生的语文、数学、英语成绩:
",i);
        scanf("%d%d%d",&tmp.c,&tmp.m,&tmp.e);
        EndInsert(La,tmp);
    }
    int work;
    printf("1.增加、删除学生信息
");
    printf("2.输入学号或姓名查询学生信息
");
    printf("3.统计课程分数段信息
");
    printf("4.将学生信息按课程分数进行排序
");
    printf("请输入要执行的操作:");
    while(scanf("%d",&work)!=EOF)
    {
        switch(work)
        {
        case 1:
            add_or_del(La);
            break;
        case 2:
            check_stu(La);
            break;
        case 3:
            check_mark(La);
            break;
        case 4:
            Sort(La);
            break;
        default:
            printf("输入错误,请重新输入
");
        }
    }
}
/*
6
zhangruida 1604010901 23 56 89
aldjfjajo 1604010978 78 78 19
alkjdfiadf 160488405 78 98 29
wwwwwww 1604010902 56 73 45
eeeeeoooo 1604019013 79 48 15
qqqqqqppppp 1604018098 78 98 56
*/
原文地址:https://www.cnblogs.com/kuronekonano/p/11135820.html