要注意类中变量的初始化问题。
顺序表的搜索、插入、删除功能要首先判断操作位置的有效性。
SeqList.h
#include <iostream>
#include<string>
using namespace std;
static const int defaultSize = 100;
struct Student{
int stuNo;
string stuName;
int stuGrade;
int score;
};
template<class T>
class SeqList{
protected:
int maxSize;
T *data;
int last;
public:
SeqList(int sz = defaultSize);
~SeqList(){ delete[] data; }
int Size() const{ return maxSize; };
int Length()const{ return last + 1; };
T getData(int i){ return i > 0 && i <= last + 1 ? data[i-1] : NULL; }; //取出第i个表项的值
bool isFull(){ return last == maxSize - 1 ? true : false; };
bool isEmpty(){ return last == -1 ? true : false; }
bool Insert(int i,const T& current); //在第i个表项处插入值为current
bool deleteNode(int i, T& del); //删除第i个表项,并把值保存在del中
void output(){
for (int i = 0; i < last; i++)
cout << data[i].stuNo << " "<<data[i].stuName <<" " <<data[i].stuGrade <<" " <<data[i].score << endl;
};
};
template<class T>
SeqList<T>::SeqList(int sz){
if (sz != 0){
maxSize = sz;
last = 0;
data = new T[maxSize];
if (data == NULL){
cout << "内存分配错误!";
exit(1);
}
}
}
template<class T>
bool SeqList<T>::Insert(int i, const T& current){
if (isFull() == true) return false;
if (i < 0 || i >= maxSize) return false;
for (int j = last; j >= i; j--) //从最后一个到第i个依次往后面移一个
data[j + 1] = data[j];
data[i] = current;
last += 1; //插入元素后last所在的位置+1
return true;
}
template<class T>
bool SeqList<T>::deleteNode(int i, T& del){
if (isEmpty() == true) return false;
if (i < 0 || i > maxSize) return false;
del = data[i];
for (int j = i; j <= last; j++) //从i处到最后一个依次往前移一个
data[j] = data[j + 1];
last -= 1;
return true;
}
Test.cpp
#include"SeqList.h"
using namespace std;
void main(){
Student stu1;
stu1.stuNo = 0001;
stu1.stuName = "张三";
stu1.stuGrade = 2005;
stu1.score = 70;
Student stu2;
stu2.stuNo = 0002;
stu2.stuName = "李四";
stu2.stuGrade = 2004;
stu2.score = 65;
SeqList<Student> seqStudent;
seqStudent.Insert(0, stu1);
seqStudent.Insert(1, stu2);
seqStudent.output();
Student stu3;
seqStudent.deleteNode(1, stu3);
cout << stu3.stuNo << " " << stu3.stuName << " " << stu3.stuGrade << " " << stu3.score << endl;
}