数据结构》实验二:
线性表综合实验
一.实验目的
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
二.实验时间
准备时间为第3周到第4周,具体集中实验时间为第4周第2次课。2个学时。
三..实验内容
1.建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。
要求如下:
1)用顺序表来实现。
2)用单链表来实现。
3)用双链表实现。
4)用静态链表实现。
5)用间接寻址实现。
分开写程序,可以一个方法分别写一博客文章上交作业。
2.实现两个集合的相等判定、并、交和差运算。要求:
1)自定义数据结构
2)自先存储结构,并设计算法。在VC中实现。
以上三题,第1题必须完成。第2和第3题可以作为选做题。
四.实验报告
1.在博客中先写上实习目的和内容,画出主要操作运算算法图,然后分别上传程序代码。插入调试关键结果截图。
2.单独写一个博文,比较总结线性表的几种主要存储结果。
五.实验思路
本项目以顺序表为原型修改而成的学生成绩管理系统。创建三个文件,分别为头文件StuSeqList.h、源文件StuSeqList.cpp和StuSeqList_Main.cpp。头文件包含一个学生信息的结构体和一个StuSeqList类,包含学生成绩录入、删除、修改、查询等功能操作函数的声明以及存放学生信息的数组,和顺序表的长度。两个源文件分别包含头文件函数的定义、功能选择操作菜单语句。
六.源代码
#ifndef StuSeqList_H // 避免重复包含StuSeqList.h头文件
#define StuSeqList_H
#include<string>
using namespace std;
const int MaxSize = 100;//最多录入条学生信息
struct StuInfo
{
string Name;
string No;
float Chinese;
float English;
float Math;
};
class StuSeqList
{
public:
StuSeqList(){length=0;} //无参构造函数,创建一个空表
~StuSeqList(){} //析构函数
void Insert(); //录入一条或多条学生信息
void Delete(); //删除学号为No的学生信息记录,返回学生学号
void Get(); //按学号查找学生信息,获取学生信息记录
void Modify();//修改学号为No的学生记录
int Length(){return length;};//获取学生记录数量
void PrintList(); //按序号依次输出学生信息记录
private:
StuInfo Stu[MaxSize]; //存放学生信息记录的数组
int length;
};
#endif
#include <iostream>
#include<iomanip>
#include "StuSeqList.h"
using namespace std;
void StuSeqList::Insert()
{
system("cls");
int a;//要录入学生的数量
if(length>=MaxSize)throw"学生成绩表已满";
cout<<"请输入要录入的学生记录数量:"<<endl;
cin>>a;
if(a+length>=MaxSize)throw"添加人数超出限制";
for(int j=0;j<a;j++)
{
cout<<"请输入第"<<j+1<<"个学生的学号:"<<endl;
cin>>Stu[j].No;
cout<<"请输入第"<<j+1<<"个学生的姓名:"<<endl;
cin>>Stu[j].Name;
cout<<"请输入第"<<j+1<<"个学生的语文成绩:"<<endl;
cin>>Stu[j].Chinese;
cout<<"请输入第"<<j+1<<"个学生的英语成绩:"<<endl;
cin>>Stu[j].English;
cout<<"请输入第"<<j+1<<"个学生的数学成绩:"<<endl;
cin>>Stu[j].Math;
length++;
}
cout<<"学生成绩录入成功"<<endl;
}
void StuSeqList::Delete()
{
int m;
string b;
if(length==0)throw"下溢";
cout<<"请输入要删除记录学生的学号:"<<endl;
cin>>b;
for(int i=0;i<length;i++)
if (Stu[i].No==b) m=i;
for(int j=m;j<length-1;j++)
Stu[j]=Stu[j+1];//此处j已经是元素所在的数组下标
length--;
cout<<"该学生记录已删除"<<endl;
}
void StuSeqList::Get()
{
string c;
cout<<"请输入要查询记录学生的学号:"<<endl;
cin>>c;
for(int i=0;i<length;i++)
{
if (Stu[i].No==c)
{
cout<<"学号"<<setw(20)<<"姓名"<<setw(15)<<"语文成绩"<<setw(15)<<"英语成绩"<<setw(15)<<"数学成绩"<<endl;
cout<<Stu[i].No<<setw(14)<<Stu[i].Name<<setw(7)<<Stu[i].Chinese<<setw(15)<<Stu[i].English<<setw(17)<<Stu[i].Math<<endl;
}//下标为i的元素其序号为i+1
else cout<<"查找失败"<<endl;//退出循环,说明查找失败
}
}
void StuSeqList::PrintList()
{
cout<<"学号"<<setw(20)<<"姓名"<<setw(15)<<"语文成绩"<<setw(15)<<"英语成绩"<<setw(15)<<"数学成绩"<<endl;
for(int i=0;i<length;i++)
{
cout<<Stu[i].No<<setw(14)<<Stu[i].Name<<setw(7)<<Stu[i].Chinese<<setw(15)<<Stu[i].English<<setw(17)<<Stu[i].Math<<endl;
}
}
void StuSeqList::Modify()
{
int n;
string d;
cout<<"请输入要修改同学的学号"<<endl;
cin>>d;
for(int i=0;i<length;i++)
if (Stu[i].No==d) n=i;
cout<<"请输入该学生的学号:"<<endl;
cin>>Stu[n].No;
cout<<"请输入该学生的姓名:"<<endl;
cin>>Stu[n].Name;
cout<<"请输入该学生的语文成绩:"<<endl;
cin>>Stu[n].Chinese;
cout<<"请输入该学生的英语成绩:"<<endl;
cin>>Stu[n].English;
cout<<"请输入该学生的数学成绩:"<<endl;
cin>>Stu[n].Math;
}
#include<iostream>
#include"StuSeqList.h"
using namespace std;
void main()
{
StuSeqList M;
int x;
do
{
cout<<"★☆★☆★☆★欢迎进入学生成绩管理系统☆★☆★☆★☆★☆★☆★"<<endl;
cout<<"请输入你要选择的功能序号:"<<endl;
cout<<"☆★☆★☆1.录入学生成绩信息……2.删除学生成绩信息☆★☆★☆★ "<<endl;
cout<<"☆★☆★☆3.查询学生成绩信息……4.显示学生成绩信息☆★☆★☆★ "<<endl;
cout<<"☆★☆★☆5.修改学生成绩信息……6.统计学生成绩信息☆★☆★☆★ "<<endl;
cout<<"☆★☆★☆7.退出 ☆★☆★☆★ "<<endl;
cin>>x;
switch(x){
case 1:
try
{
M.Insert();
}
catch(string *s)
{
cout<<s<<endl;
}
break;
case 2:
try
{
M.Delete();
}
catch(string *s)
{
cout<<s<<endl;
}
break;
case 3:
M.Get();
break;
case 4:
M.PrintList();
break;
case 5:
M.Modify();
break;
case 6:
cout<<"该成绩表已录入"<<M.Length()<<"个学生记录"<<endl;
break;
}
}while(x!=7);
}
七、运行结果截图
八.实验心得
首先,这个实验的框架不难想象。由于本人编写代码技术拙劣,实验花了较长的时间。刚开始,结构体里的学号和姓名两个数据我是用char型数组表示,无奈问题多多。其一,在修改、删除等功能进行匹配的时候有障碍;其二,在输出的时候只能输出第一个字符,为了方便只试了数值和字母,不确定能否输出文字。然后想到用string型表示,问题解决。此外,在文件导入也出现了问题。因为在StuSeqList_Main.cpp里导入StuSeqList.cpp文件导致整个程序无法进行。此项目只适用于一次性操作,只能一次录入数据,第二次录入就会出错。在一次录入数据前提下,其他功能可以多次实现不出错。各位大神如有更好的建议,请在评论区回复,吾必不胜感激!