分享存放学生元素的有序顺序表

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值