数据结构实验一:顺序表
C++实现
-
实验内容要求:
定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能(参见教材中基本操作): (1) 根据指定学生个数,逐个输入学生信息(构建表或产生表); (2) 逐个显示学生表中所有学生的相关信息(显示表,即遍历表); (3) 根据姓名进行查找,返回此学生的学号和成绩(查找); (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩)(取值 ); (5) 给定一个学生信息,插入到表中指定的位置(插入); (6) 删除指定位置的学生记录(删除); (7) 统计表中学生个数(相当于求表长)。
(1) 定义Student类,表示学生(注:注意=、==、<<、>>的重写); (2) 定义SeqList类,表示顺序表,每一功能用一成员函数实现,函数名和参数与教材P22基本操作保持一致; (3)在主函数中创建SeqList对象,并对各个功能进行测试。 (4) 程序要做到界面友好(菜单式界面),在程序运行时用户可以根据相应的提示信息进行操作。
-
顺序表功能:
学生类:
class Student{ string name; string number; string score; public: Student(string name=" ", string number=" ", string score=" ") { this->name = name; this->name = number; this->score = score; } friend istream& operator >> (istream& in, Student& s) { cin >> s.name >> s.number >> s.score; return in; } friend ostream& operator <<(ostream& out,const Student& s) { cout << s.name <<" "<< s.number <<" "<< s.score; return out; } bool operator == (const Student & s) { if (this->name == s.name && this->number == s.number && this->score == s.score) return 1; return 0; } string getName() { return this->name; } };
顺序表类:
class SeqList { Student *data; int length; public: SeqList(); bool deleteList(SeqList& L, int i,Student& s); bool insertList(SeqList& L, int i,Student s); //根据姓名查找 int locateItem(SeqList L, string name); //根据位置输出信息 Student getItem(SeqList L, int i); //获取长度 int getLength(); //遍历列表输出 void traverseList(); ~SeqList(); };
顺序表初始化:
SeqList::SeqList() { this->data = new Student[MAXSIZE]; this->length = 0; if (this->data==NULL) { cout << "分配失败"; return ; } }
插入数据:
bool SeqList::insertList(SeqList& L, int i,Student s) { if (i<1||i>L.length+1) { cout << "请输入正确的插入位置:1-"<<L.length+1; return false; } if (L.length>MAXSIZE) { cout << "当前存储空间已满,插入失败"; return false; } cout << "请输入姓名,学号,成绩(每输入一项按回车输入下一项):"<<endl; cin >> s; for (int j=L.length;j>=i;j--) L.data[j] = L.data[j - 1]; L.data[i - 1] = s; L.length++; return true; }
删除数据:
bool SeqList::deleteList(SeqList& L, int i, Student& s) { if (i<1 || i>L.length || i > MAXSIZE) cout << "删除失败"; return false; s = L.data[i - 1]; cout << "删除的元素为:"<<s; for (int j = i; j < L.length; j++) L.data[j - 1] = L.data[j]; L.length--; return true; }
获取顺序表长度:
int SeqList::getLength() { return length; }
根据姓名查找:
//根据姓名查找 int SeqList::locateItem(SeqList L, string name) { int i; for (i = 0; i < L.length; i++) if (L.data[i].getName() == name) return i+1; return -1; }
遍历顺序表:
void SeqList::traverseList() { if (this->length == 0) cout << "顺序表为空" << endl; for (int i = 0; i < this->length; i++) cout << this->data[i]<<endl; }
根据位置查找相应数据:
Student SeqList::getItem(SeqList L, int i) { Student s("不存在") ; if (i<1 || i>L.length) { cout << s; return s; } else { return data[i - 1]; } }
析构函数释放内存:
SeqList::~SeqList() { delete[]this->data; }
-
运行
show函数:
void show() { cout << "输入以下数字进行相关操作:\n 1:插入数据\n 2:输出顺序表信息\n 3.删除指定位置信息\n 4:查找指定位置信息\n 5:输入姓名查找元素位置\n 6.获取元素个数\n 0退出\n "; }
main函数:
int main() { Student e; SeqList s; show(); bool flag = true; while (flag) { int i; cout << "\n请输入相应数字进行操作:" << endl; cin >> i; switch (i) { case 0: flag = false; break; case 1: int j; cout << "请输入插入位置"<<endl; cin >> j; s.insertList(s,j,e); break; case 2: s.traverseList(); break; case 3: int k; cout << "请输入要删除的位置" << endl; cin >> k; cout<< s.deleteList(s, k, e); break; case 4: int i; cout << "请输入要查找的位置" << endl; cin >> i; cout<<s.getItem(s,i); break; case 5: { string name; cout << "请输入要查找的姓名" << endl; cin >> name; cout <<"在顺序表的位置:"<< s.locateItem(s, name); break; } case 6: cout<<"顺序表长度为:"<< s.getLength(); break; default: cout << "输入错误"; break; } } cout << "退出程序"; return 0; }