#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
struct Student{
char name[32];//学生姓名
double score;//学生成绩
};
struct List{
Student *list;
int size;//线性表长度
int MaxSize;//数组长度
};
//打印功能函数
void function(){
cout << "----------------------" << endl;
cout << "输入'1',添加元素" << endl;
cout << "输入'2',删除元素" << endl;
cout << "输入'3',遍历元素" << endl;
cout << "输入'0',退出程序" << endl;
cout << "----------------------" << endl;
}
//初始化函数
void InitList(List& L){
L.MaxSize = 25;
L.list = new Student[L.MaxSize];
//如果内存不足,则给空指针,现在的电脑基本不会出现这种情况
if(L.list == NULL){
cout << "动态可分配的存储空间用完,退出运行" << endl;
exit(1);
}
//赋初值
char temName[10][32] = {{"M1"},{"M2"},{"M4"},{"M5"},{"M7"},{"M8"},{"M10"},{"M12"},{"M13"},{"M14"}};
double temScore[10] = {68.0,70.0,73.0,76.0,78.0,80.0,83.0,85.0,86.0,87.0};
for(int i = 0; i < 10; i++){
strcpy(L.list[i].name,temName[i]);
L.list[i].score = temScore[i];
}
L.size = 10;
}
//添加函数
bool InsertList(List& L, char name[32], double item){
cout << "正在添加......" << endl;
//按顺序查找要添加的合适的位置
int i;
for(i = 0; i < L.size; i++){
if(item < L.list[i].score){
break;
}
}
int pos = i + 1;
//如果长度不足,则扩充
if(L.size == L.MaxSize){
int k = sizeof(Student);
L.list = (Student*) realloc (L.list, 2 * L.MaxSize * k);
if(L.list == NULL){
cout << "动态可分配的存储空间用完,退出运行" << endl;
exit(1);
}
L.MaxSize = 2 * L.MaxSize;
}
//添加进线性表里面
for(i = L.size - 1; i >= pos - 1; i--){
strcpy(L.list[i + 1].name,L.list[i].name);
L.list[i + 1].score = L.list[i].score;
}
L.list[pos - 1].score = item;
strcpy(L.list[pos - 1].name,name);
L.size++;
return true;
}
//删除函数
bool DeleteList(List& L, char name[32], double item){
cout << "正在删除......" << endl;
if(L.size == 0){
cout << "线性表为空,删除无效!" << endl;
return false;
}
//查找两项数据匹配的位置
int i = 0;
int pos;
for(i = 0; i < L.size; i++){
if(strcmp(L.list[i].name,name) == 0 && item == L.list[i].score){
break;
}
}
if(i == L.size){
return false;
}
//开始删除
pos = i + 1;
for(i = pos; i < L.size; i++){
L.list[i - 1] = L.list[i];
}
L.size--;
//如果占用内存过大,则删除一半,节约节约
if(float(L.size) / L.MaxSize < 0.4 && L.MaxSize > 10){
int k = sizeof(Student);
L.list = (Student*) realloc (L.list, L.MaxSize * k / 2);
L.MaxSize = L.MaxSize / 2;
}
return true;
}
//遍历函数
void TraverseList(List& L){
//简单for循环遍历线性表
cout << "即将遍历线性表......" << endl;
for(int i = 0; i < L.size; i++){
cout << L.list[i].name << " " << L.list[i].score << endl;
}
cout << "遍历结束" << endl;
}
int main(){
int t;//功能
char name[32];
double item;
List L;//定义一个List类型L
InitList(L);//初始化L
while(1){
function();//调用功能函数
cout << "输入指令:" << endl;
cin >> t;
switch(t){
case 1:cout << "输入学生姓名:" <<endl;
cin >> name;
cout << "输入学生成绩:" <<endl;
while(1){
cin >> item;
if(item < 0 || item > 100){
cout << "数据错误,请重新输入" << endl;
}else{
break;
}
}
if(InsertList(L, name, item)){
cout << "添加成功" << endl;
}break;
case 2:cout << "输入学生姓名:" <<endl;
cin >> name;
cout << "输入学生成绩:" <<endl;
while(1){
cin >> item;
if(item < 0 || item > 100){
cout << "数据错误,请重新输入" << endl;
}else{
break;
}
}if(DeleteList(L, name, item)){
cout << "删除成功" << endl;
}else{
cout << "删除失败" << endl;
};break;
case 3:TraverseList(L);break;
case 0:exit(1);
default:cout << "指令错误,请重新输入" << endl;
}
}
return 0;
}
分享存放学生元素的有序顺序表
于 2023-03-25 19:56:29 首次发布