学生顺序表

#include<iostream>
#include<string>
#define Maxsize 100
using namespace std;

// 学生结构体:包含学号、姓名、分数
typedef struct {
    int id;       // 学号
    string name;  // 姓名
    float score;  // 分数
} Student;

// 学生顺序表结构体:包含学生数组和当前长度
typedef struct {
    Student data[Maxsize];  // 存储学生信息的数组
    int length;             // 当前表长度
} StuSqList;
// 初始化学生顺序表
void InitList(StuSqList *&L) {
    L = new StuSqList;  // 动态分配内存
    L->length = 0;      // 初始长度为0
}
// 创建学生顺序表:将学生数组data中的n个学生导入顺序表L
void CreateList(StuSqList *&L, Student data[], int n) {
    InitList(L);  // 先初始化
    for (int i = 0; i < n; i++) {
        L->data[i] = data[i];
        L->length++;
    }
}
// 在第pos个位置插入学生元素e(pos从1开始)
bool ListInsert(StuSqList *&L, int pos, Student e) {
    if (pos < 1 || pos > L->length + 1 || L->length >= Maxsize) {
        return false;  // 位置不合法或表已满,插入失败
    }
    // 从后往前移动元素,腾出插入位置
    for (int i = L->length; i >= pos; i--) {
        L->data[i] = L->data[i - 1];
    }
    L->data[pos - 1] = e;  // 插入元素
    L->length++;           // 长度加1
    return true;
}
// 删除第pos个位置的学生元素,并用e返回被删除的学生信息(pos从1开始)
bool ListDelete(StuSqList *&L, int pos, Student &e) {
    if (pos < 1 || pos > L->length) {
        return false;  // 位置不合法,删除失败
    }
    e = L->data[pos - 1];  // 保存被删除的学生信息
    // 从前往后移动元素,覆盖被删除位置
    for (int i = pos; i < L->length; i++) {
        L->data[i - 1] = L->data[i];
    }
    L->length--;  // 长度减1
    return true;
}
 // 遍历并打印所有学生信息
void PrintList(StuSqList *L) {
    cout << "学号\t姓名\t分数" << endl;
    for (int i = 0; i < L->length; i++) {
        cout << L->data[i].id << "\t" 
             << L->data[i].name << "\t" 
             << L->data[i].score << endl;
    }
}
// 销毁学生顺序表
void DestroyList(StuSqList *&L) {
    if (L != NULL) {
        delete L;
        L = NULL;
    }
}
//主函数测试 
int main() {
    StuSqList *L = NULL;
    
    // 测试1:初始化并创建学生表
    Student stuArr[3] = {
        {1001, "张三", 85.5},
        {1002, "李四", 92.0},
        {1003, "王五", 78.5}
    };
    CreateList(L, stuArr, 3);
    cout << "初始学生表:" << endl;
    PrintList(L);

    // 测试2:插入学生
    Student newStu = {1004, "赵六", 90.0};
    if (ListInsert(L, 2, newStu)) {
        cout << "\n插入学生后:" << endl;
        PrintList(L);
    }

    // 测试3:删除学生
    Student delStu;
    if (ListDelete(L, 3, delStu)) {
        cout << "\n删除学号为" << delStu.id << "的学生后:" << endl;
        PrintList(L);
    }

    // 销毁表,释放内存
    DestroyList(L);
    return 0;
}

 

posted @ 2025-09-17 14:41  ouyeye  阅读(12)  评论(0)    收藏  举报