<quickSort.h>
/************************************************
* 快速排序的类模板
*
************************************************/
template <class T>
void quickSort(T num[], int size)
{
quickSort(num, 0, size - 1);
}
template <class T>
void quickSort(T num[], int low, int high)
{
if (low < high)
{
int q = partition(num, low, high);
quickSort(num, low, q - 1);
quickSort(num, q + 1, high);
}
}
template <class T>
int partition(T num[], int low, int high)
{
int i, j;
T tmp;
for (i = (j = low) + 1; i <= high; i++)
if (num[i] > num[low])
{
j++;
tmp = num[j];
num[j] = num[i];
num[i] = tmp;
}
tmp = num[low];
num[low] = num[j];
num[j] = tmp;
return j;
}
<MySeqList.h>
#pragma once
#ifndef _MYSEQLIST_H_
#define _MYSEQLIST_H
/***************************************************
*
* 顺序表的类模板
*
*
***************************************************/
template<class T>
class MySeqList
{
private:
T *list ;
int maxSize;
int len;
public:
MySeqList(int i) {
maxSize =i;
list = new T[i];
len = 0;
}
~MySeqList() {
delete [] list;
}
bool isEmpty(){ // 判空
if (len <= 0)return true;
else return false;
}
bool isFull(){ // 判满
if (len >= maxSize)return true;
else return false;
}
int length(){ // 返回此顺序表的当前实际长度
return len;
}
void doubleSpace();
void append(T num[], const T &value); //表尾插入
void insert(int p,const T &value); //某点插入
T * getList() { return list; }
T & del(int i); //删除
T & visit(int i)const; //按排名查找
void print(); //打印
void clear() { // 将顺序表存储的内容清除,成为空表
delete[] list;
len = 0;
list = new T[maxSize];
}
};
/******************************************************
* 函数名称:T & visit(int i)const
* 功能描述:按排序的位置(成绩名次)查找
* 参数列表: int 位置
* 返回结果: T
******************************************************/
template<class T>
T & MySeqList<T>::visit(int i)const
{
cout << "查找成功" << endl;
return list[i-1];
}
/******************************************************
* 函数名称:doubleSpace()
* 功能描述:表长扩大两倍
* 参数列表: 无
* 返回结果: void
******************************************************/
template <class T>
void MySeqList<T>::doubleSpace()
{
T*tmp = list;
maxSize *= 2;
list = new T[maxSize];
for (int i = 0; i <len; ++i)
list[i] = tmp[i];
delete[] tmp;
}
/******************************************************
* 函数名称:append(T num[], const T &value)
* 功能描述:从表尾插入元素,且长度加1
* 参数列表: T num[]顺序表对象const T &value插入的元素
* 返回结果: 完成插入返回true
******************************************************/
template <class T>
void MySeqList<T> ::append(T num[], const T &value){
if (isFull()){ // 检查顺序表是否溢出
doubleSpace();
//cout<< "顺序表溢出"<<endl;
}
int s = length();
list[s] = value; // 位置s处插入新元素
len++; // 表的实际长度增1
cout << "添加完成" << endl;
}
/******************************************************
* 函数名称:insert(int p, const T &value)
* 功能描述:在某点插入元素
* 参数列表:int p 需要插入的位置 const T &value 需要插入的元素
* 返回结果:bool 插入完成返回true
******************************************************/
template <class T>
void MySeqList<T> :: insert(int p, const T &value) {
for (int j = len; j > p; j--)
list[j] = list[j - 1];
list[p] = value;
++len;
}
/******************************************************
* 函数名称:del(T & value,int i)
* 功能描述:删除表中的某个位置上的元素
* 参数列表: value顺序表的引用 int i 需要删除元素的位置
* 返回结果: value
******************************************************/
template <class T>
T & MySeqList<T> :: del(int i) {
int j;
if (i<0 || i>len){ cout << "越界了" << endl; }
else{
for (int j = i; j < len; ++j)
list[j - 1] = list[j];
--len;
}
cout << "删除完成" << endl;
return list[len];
}
/******************************************************
* 函数名称:print()
* 功能描述:打印表中的元素
* 参数列表: 无
* 返回结果: void
******************************************************/
template <class T>
void MySeqList<T>::print() {
if(isEmpty())cout<<"空\n";
else{
for (int i = 0; i < len; i++) {
cout << list[i] << " ";
cout << endl;
}
}
cout << "打印完成" << endl;
}
#endif
<main.cpp>
#define _CRT_SECURE_NO_WARNINGS
#include"MySeqList.h"
#include"quickSort.h"
#include<iostream>
#include<string>
using namespace std;
struct student
{
char id[9];
char * name;
int score;
student(){ name = NULL; }
student(const char _id[], const char *_name, int s);
~student(){ delete[]name;}
student & operator=(const student &s);//深拷贝
bool operator >(const student &s) const{
return (score > s.score);
}
void setinfo(const char _id[], const char *_name, int s)
{
strcpy(id, _id);
name = new char[11];
strcpy(name, _name);
score = s;
}
};
student &student:: operator=(const student &s)//深拷贝
{
if (id == s.id)
return *this;
strcpy(id,s.id);
delete[] name;
name = new char[11];
strcpy(name, s.name);
score = s.score;
return *this;
}
student::student(const char _id[], const char *_name, int s)
{
strcpy(id,_id);
name = new char[11];
strcpy(name,_name);
score = s;
}
//重载输出运算符
ostream &operator <<(ostream &cout, const student &s)
{
cout << "学号:" << s.id<<" "<< "姓名:" << s.name <<" "<< "成绩:" << s.score << endl;
return cout;
}
void main()
{
cout << "需要申请表的规模:" << endl;
int u; cin >> u;
MySeqList<student> mylist(u);
int x, n,i;
cout << "你需要存储多少个学生的成绩"<< endl;
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "请输入第" << (i + 1) << "位同学的学号、姓名、成绩"<<endl;
char * id, *name;
id = new char[9];
name = new char[11];
int score;
cin >> id >> name >> score;
student stu(id, name, score);
mylist.insert(i,stu);
delete [] id;
delete [] name;
}
cout << endl;
do{
cout << "-----------------------------------------------" << endl;
cout << "| 1.添加一个学生的资料 |" << endl;
cout << "| 2.对MySeqList中的对象,按score的值降序排序 |" << endl;
cout << "| 3.从键盘输入一个n,查看对应n排名的学生成绩 |" << endl;
cout << "| 4.对某一位同学的成绩进行删除 |" << endl;
cout << "| 5.打印成绩 |" << endl;
cout << "| 6.如果不需要其他服务,请输入6离开,88 |" << endl;
cout << "-----------------------------------------------" << endl;
student stu_add;
cout << "请问你需要什么服务!" << endl;
cin >> i;
switch (i){
case 1:
cout << "请输入添加的学生资料" << endl;
char * id, *name;
id = new char[9];
name = new char[11];
int score;
cin >> id >> name >> score;
if (score<0 || score>100)cout << "输入的成绩有误" << endl;
stu_add.setinfo(id, name, score);
mylist.append(mylist.getList(), stu_add);
delete[]id;
delete[]name;
break;
case 2:
quickSort(mylist.getList(), n);
cout << "排序完成" << endl;
break;
case 3:
cout << "请问你想查找第几位的学生的资料:" << endl;
int v; cin >> v;
cout << mylist.visit(v)<<endl;
break;
case 4:
cout << "请问你需要删除第几位学生的资料: "<<endl;
int i; cin >> i;
mylist.del(i);
break;
case 5:
cout << "成绩单:" << endl;
mylist.print();
cout << endl;
break;
case 6:
cout << "谢谢你的使用,再见" << endl;
mylist.clear();
break;
default:
cout << "你输入的服务选项有误,请重新输入!" << endl;
break;
}
} while (i!= 6);
system("pause");
}