顺序表、结构体、深拷贝、重载运算符,快速排序的综合运用

<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");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值