利用线性表实现学生信息的管理

1学生信息的储存
2学生信息的插入
3删除学生信息
4查找学生信息
5打印出学生的信息


#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 1000
#define OVERFLOW -1
using namespace std;



typedef struct{
    char num[8];//8位学号 
    char name[20];//学生姓名 
    int score;//学生成绩 
}Student;


typedef struct{
    Student *elem;//指向数据元素的基地址
    int length;//线性表的长度
}SqList;

SqList L;

//初始化顺序表
int InitList(SqList &L){
    L.elem=new Student[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间    
    if (!L.elem) exit(OVERFLOW);//存储分配失败推出
    L.length=0;//空表长度为0
    return 1;//成功返回1
}

//顺序表的取值
int GetElem(SqList L,int i,Student &s){
    if(i<1||i>L.length){
        return 0;//若i值不合理,返回0
    }else{
        s=L.elem[i-1];//取出第i个元素  存放在i里面  加&是让形参影响到实参 
        return 1;
    }
}

//按学生姓名进行学生信息的查找
int LocateElem(SqList L,Student &s){
    //在顺序表L中查找值e的数据元素,返回其序号
    for(int i=0;i<L.length;i++){
        if(!strcmp(L.elem[i].name,s.name))
        {
                s = L.elem[i];
        return 1;//查找成功
        }
    }
    return 0;//查找失败
}

//插入学生信息 
int ListInsert(SqList &L,int i,Student &s){
    if((i<1)||(i>L.length+1))
        return 0;
    if(L.length==MAXSIZE)
        return 0;//顺序表已达到最大长度 
    for(int j=L.length-1;j>=i-1;j--){
        L.elem[j+1]=L.elem[j];//插入位置及之后的元素全部后移
    }
    L.elem[i-1]=s;//将新元素s插入第i个位置
    ++L.length;//顺序表长度加1
    return 1;//插入成功,返回1 
}


//顺序表的删除
int ListDelete(SqList &L,int i){
    //在顺序表L中删除第i个元素,i值的合法范围是1<=i<=L.length
    if((i<1)||(i>L.length))
        return 0;
    for(int j=i;j<=L.length-1;j++){//被删除的元素是第i个元素,但是其下标i-1。j=i,此时j指向的是i后面的一个元素 
        L.elem[j-1]=L.elem[j];//被删除元素之后的元素前移(删除数据的真实操作其实是覆盖)
    }
    --L.length;//顺序表表长度减1
    return 1;//删除成功返回1
}


//输入学生表
void InputList(SqList &L,int i,Student e)
 {
     L.length+=1;
     L.elem[i]=e;
     
 }



//主函数
int main(){
    Student student;
    InitList(L);
    int a;
    while(1) {
        printf("------------学生信息系统------------\n");
        printf("1:输入学生信息\n");
        printf("2:显示所有学生信息\n");
        printf("3:根据学生姓名查找学生信息\n");
        printf("4:根据位置查找学生信息\n");
        printf("5:添加学生信息\n");
        printf("6:删除指定位置的学生记录;\n");
        printf("7:统计表中学生个数\n");
        printf("8:退出学生信息系统\n");
        printf("请输入您的选择:");
        scanf("%d",&a);
        printf("--------------------------------------------------------");
        printf("\n");        
        switch(a)//输入学生的信息;
        {
            case 1:
        {
            for(int i=0;i<5;i++)
            {
                printf("学号:");
                scanf("%s",&student.num);
                printf("姓名:");
                scanf("%s",&student.name);
                printf("成绩:");
                scanf("%d",&student.score);
                InputList(L,i,student);
                printf("\n");
            }
                printf("输入学生信息成功,请选择接下来的操作…………");
            printf("\n\n\n\n\n\n");
            break;
        }
            
            case 2://显示全部学生的信息;
        {
           printf("NO\t\tName\t\t\tScore\t\n");
           for(int i=1;i<=L.length;i++)
             {
                GetElem(L,i,student);
                printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
             }
             printf("\n\n\n\n\n\n");
            break;
        }
            case 3://根据学生姓名查找学生信息
        {
            int i;
            printf("请输入您要查找学生的名字:");
            scanf("%s",&student.name);
            i=LocateElem(L,student);
            if(!i)
            {
                printf("系统中无记录\n");
            }
            printf("学号:%s\t\t姓名:%s\t\t成绩:%3d\n",student.num,student.name,student.score);
            printf("\n\n\n\n\n\n");
            break;
        }
         case 4://根据位置查找学生信息
        {
            int local;
            printf("请输入要查询的位置:");
            scanf("%d",&local);
            GetElem(L,local,student);
            printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score);
            printf("\n\n\n\n\n\n");
            break;
        }
         case 5://给定一个学生信息,插入到表中指定位置;
        {
            int t,i;
            printf("请输入学生的学号:");
            scanf("%s",&student.num);
            printf("请输入学生的姓名:");
            scanf("%s",&student.name);
            printf("请输入学生的成绩:");
            scanf("%d",&student.score);
            printf("请输入插入的位置:");
            scanf("%d",&t);
            i = ListInsert(L,t,student);
            if(i)
        {
           printf("添加成功…………");
           printf("\n") ;
           printf("NO\t\tName\t\t\tScore\t\n");
           for(int i=1;i<=L.length;i++)
             {
                GetElem(L,i,student);
                printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
             }
        }
           else
               printf("插入失败,请选择正确的插入位置…………");
            printf("\n\n\n\n\n\n");
            break;
            
        }
        case 6://删除指定位置的学生信息;
        {
            int i;
            printf("请输入要删除的位置:");
            scanf("%d",&i);
            ListDelete(L,i);
            printf("删除成功…………");
            printf("\n");
            printf("NO\t\tName\t\t\tScore\t\n");
            for(int i=1;i<=L.length;i++)
             {
                GetElem(L,i,student);
                printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
             }
            printf("\n\n\n\n\n\n");
            break;
        }      
        case 7://统计系统中学生个数
        {
            printf("系统中学生个数:%d\n",L.length);
            printf("\n\n\n\n\n\n");
            break;
        }
        case 8://退出系统;
         {
            return 0;
         }
         default:
         {
            printf("输入错误,请重新输入");
            printf("\n\n\n\n\n\n");
         }
     }
  }
}




以下是一个基于线性表的学生信息管理系统的示例代码,包括学生信息的储存、插入、删除、查找和打印出学生信息的功能:

class Student:
    def __init__(self, name, age, gender, id):
        self.name = name
        self.age = age
        self.gender = gender
        self.id = id

class StudentList:
    def __init__(self):
        self.students = []

    def insert(self, student):
        self.students.append(student)

    def delete(self, id):
        for student in self.students:
            if student.id == id:
                self.students.remove(student)
                return True
        return False

    def find(self, id):
        for student in self.students:
            if student.id == id:
                return student
        return None

    def print_all(self):
        for student in self.students:
            print('Name: {}, Age: {}, Gender: {}, ID: {}'.format(student.name, student.age, student.gender, student.id))

在这个示例代码中,我们定义了一个 Student 类来存储学生的姓名、年龄、性别和学号等信息。我们还定义了一个 StudentList 类来管理学生信息,包括插入、删除、查找和打印学生信息等功能。具体实现如下:

  • 构造方法 __init__(self):初始化学生列表为空。
  • 插入方法 insert(self, student):将一个学生对象添加到学生列表中。
  • 删除方法 delete(self, id):根据学号删除一个学生对象。
  • 查找方法 find(self, id):根据学号查找一个学生对象。
  • 打印方法 print_all(self):打印出所有学生的信息。

使用示例:

# 创建一个学生列表对象
students = StudentList()

# 添加几个学生
students.insert(Student('Tom', 18, 'male', '1001'))
students.insert(Student('Jerry', 19, 'female', '1002'))
students.insert(Student('Bob', 20, 'male', '1003'))

# 打印出所有学生的信息
students.print_all()
# 输出:
# Name: Tom, Age: 18, Gender: male, ID: 1001
# Name: Jerry, Age: 19, Gender: female, ID: 1002
# Name: Bob, Age: 20, Gender: male, ID: 1003

# 查找学号为 1002 的学生
student = students.find('1002')
if student:
    print('Found student: Name: {}, Age: {}, Gender: {}, ID: {}'.format(student.name, student.age, student.gender, student.id))
else:
    print('Student not found')
# 输出:
# Found student: Name: Jerry, Age: 19, Gender: female, ID: 1002

# 删除学号为 1003 的学生
if students.delete('1003'):
    print('Student deleted')
else:
    print('Student not found')
# 输出:
# Student deleted

# 再次打印出所有学生的信息
students.print_all()
# 输出:
# Name: Tom, Age: 18, Gender: male, ID: 1001
# Name: Jerry, Age: 19, Gender: female, ID: 1002

希望这个示例代码可以帮助您理解如何利用线性表实现学生信息的管理。