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