求助关于 动态模版SeqList创建列表问题

baidu_16629311 2014-06-17 08:35:06
模版声明如下

#if !defined SEQLIST_H
#define SEQLIST_H

#include "book.h"//图书类
#include <fstream>
#include <iostream>
using namespace std;
#include <cassert>

const int tinitSize = 10;
const int tincrement =2;

template <typename T>//定义类模版
class SeqList
{
public:
SeqList(int sz=tinitSize); //构造函数,默认值为tinitSize
SeqList(const SeqList<T> &L); //复制构造函数
~SeqList(); //析构函数
void createList(); //输入,创建列表
int Size()const; //计算表最大可容纳表项个数
int Length()const; //计算表长度
int Search(T& x)const; //搜索x在表中位置,函数返回表项序号
int Locate(int x)const; //定位第i个表项,函数返回表项序号
bool getData(int i, T& x)const; //取第i个表项的值
bool setData(int i, T& x)const; //用x修改第i个表项的值
bool Insert(int i, T& x); //插入x在第i个表项之后
bool Remove(int i, T& x); //删除第i个表项,通过x返回表项的值
bool IsEmpty(); //判表空否,空则返回true,否则返回false
bool IsFull(); //判表满否,满则返回true,否则返回false
//void sort(bool smallToBig); //排序

void traverseList(); //输出

SeqList<T> operator=(SeqList<T> &L); //表整体赋值
T& operator[](int i); //重载下标运算符[]


void readFromFile(char* FileName); //从形参FileName传过来的文件中读取数据到data动态数组
void writeToFile(char* FileName); //将动态数组data中的数据写入形参FileName传过来的文件中



private:
T * data; //存放数组
int listSize; //最大可容纳表项的项数
int length; //当前已存表项的最后位置(从0开始)
void reSize(int newSize); //改变data数组空间大小
};


template <typename T>
SeqList<T>::SeqList(int sz)
{
//构造函数,通过指定参数sz定义数组的长度
if(sz>0)
{
listSize = sz; length = 0; //置表的实际长度为空
data = new T[listSize]; //创建顺序表存储数组
if(data == NULL) //动态分配失败
{
cerr << "存储分配失败!" << endl;
exit(1);
}
}
}

template <typename T>
SeqList<T>::SeqList(const SeqList<T> &L)
{
//复制构造函数,用参数表中给定的已有顺序表初始化新建的顺序表
listSize = L.Size(); //返回表最大可容纳表项个数,赋值给listSize
length = L.Length(); //返回表长度,赋值给length
data = new T[listSize];//创建顺序表存储数组
if(data == NULL)//动态分配失败
{
cerr << "存储分配错误!" << endl;
exit(1); //退出
}
T temp;//定义类型参数类型T的变量temp
for(int i=1; i<length; i++) //i范围1-(length-1)
{
L.getData(i,temp);
data[i-1] = temp;
}
}

template <typename T>
SeqList<T>::~SeqList()
{
delete[] data;
}

template <typename T>
void SeqList<T>::reSize(int newSize)
{
//私有函数:扩充顺序表的内存数组空间大小,新数组的元素个数为newSize,并将其赋值给listSize
if(newSize <= 0) //检查参数的合理性
{
cerr << "无效的数组大小!" << endl;
return;
}
if(newSize != listSize) //修改
{
T* newarray = new T[newSize]; //建立新数组
if(newarray == NULL)
{
cerr << "存储分配错误!" << endl;
exit(1);
}
int n = length;
T* srcptr = data; //源数组首地址
T* destptr= newarray; //目的数组首地址
while (n--)
{
*destptr++ = *srcptr++;//复制
}
delete[] data; //删老数组
data = newarray; listSize = newSize; //复制新数组
}
}

//---------------------------------------------------搜索和定位操作----------------------------------------------
template <typename T>
int SeqList<T>::Search(T& x)const
{
//搜索函数:在表中顺序搜索与给定值x匹配的表项,找到则函数返回该表项是第几个元素,否则返回0,表示搜索失败。
for(int i=0; i<length; i++)
if(data[i].getId() == x.getId())
return i+1; //顺序搜索
return 0; //搜索失败
}
template <typename T>
int SeqList<T>::Locate(int i)const
{
//定位函数:函数返回第i(1 <= i <= length)个表项的位置,否则函数返回0,表示定位失败。
if(i>=1 && i<=length)
return i;
else
return 0;
}
//---------------------------------------------------插入与删除操作----------------------------------------------
template <typename T>
bool SeqList<T>::Insert(int i, T& x)
{
//将新元素x插入到表中第i(1 <= i <= length)个表项之后。函数返回插入成功的信息,若插入成功返回true;
//否则返回false。i=0是虚拟的,实际上是插入到第1个元素的位置。

if(i<1 || i>length) return false; //参数i不合理,不能插入
if(length == listSize) //表满
{
reSize(listSize+increment);
}
for(int j=length-1; j>=i-1; j--)
data[j+1] = data[j]; //依次后移,空出第i号位置
data[i-1] = x; //插入
length++; //最后位置加1
return true; //插入成功
}

template <typename T>
bool SeqList<T>::Remove(int i, T& x)
{
//从表中删除第i(1 <= i <= length)个表项,通过引用型参数x返回删除的元素值。
//函数返回删除成功的信息,若删除成功则返回true,否则返回false。
if(length==0) return false; //表空,不能删除
if(i<1 || i>length) return false; //参数i不合理,不能删除
x = data[i-1]; //存被删元素的值
for(int j=i; j<length; j++)
data[j-1] = data[j]; //依次后移,填补
length--; //最后位置减1
return true; //删除成功
}
//-----------------------------------------------输入输出操作和赋值操作------------------------------------------
template <typename T>
void SeqList<T>::createList()
{
//从标准输入(键盘)逐个数据输入,建立顺序表
cout << "开始建立顺序表,请输入表中元素个数:";
cin >>length; //输入元素最后位置
if(length > listSize)
reSize(length);
for(int i=0; i<length; i++)
{
cout <<"请输入表中第"<< i+1 << "个元素信息。具体如下:"<<endl;
cin>>data[i];

}
}

template <typename T>
void SeqList<T>::traverseList()
{
//将顺序表全部元素输出到屏幕上
cout << "顺序表当前元素最后位置为: " << length-1 << endl;
for(int i=0; i<length; i++)
cout << "#" << i+1 << " : " << data[i] << endl;
}
template <typename T>
SeqList<T> SeqList<T>::operator =(SeqList<T> &L)
{
//重载操作:顺序表整体赋值。若当前调用此操作的表对象为L1,代换形参L的表对象为L2,
//则使用方式为L1=L2。实现代码参照复制构造函数部分。

if(&L!=this)
{
listSize = L.Size(); length = L.Length();
data = new T[listSize]; //创建顺序表存储数组
if(data == NULL) //动态分配失败
{
cerr << "存储分配错误!" << endl;
exit(1);
}
T temp;
for(int i=1; i<=length; i++)
{ L.getData(i,temp); data[i-1] = temp;}
}
return *this;
}
/*
template <typename T>
void SeqList<T>::sort(bool smallToBig)
{
int size=length;
for(int i=1;i<size;i++)
{
for(int j=size-1;j>=i;j--)
{
if(smallToBig)
{
if(data[j-1]>data[j])
{
T temp=data[j-1];
data[j-1]=data[j];
data[j]=temp;
}
}
else
{
if(data[j-1]<data[j])
{
T temp=data[j-1];
data[j-1]=data[j];
data[j]=temp;
}
}
}
}
}*/
template <typename T>
int SeqList<T>::Size()const{return listSize;} //计算表最大可容纳表项个数

template <typename T>
int SeqList<T>::Length()const{return length+1;} //计算表长度

template <typename T>
bool SeqList<T>::getData(int i, T& x)const //取第i个表项的值
{ if(i>0 && i<=length)
{ x = data[i-1]; return true; }
else
return false;
}

template <typename T>
bool SeqList<T>::setData(int i, T& x)const //用x修改第i个表项的值
{ if(i>0 && i<=length)
{ data[i-1]=x; return true; }
else
return false;
}

template <typename T>
bool SeqList<T>::IsEmpty(){return (length==0)?true:false;} //判表空否,空则返回true,否则返回false

template <typename T>
bool SeqList<T>::IsFull(){return (length==listSize)?true:false;} //判表满否,满则返回true,否则返回false

template <typename T>
void SeqList<T>::readFromFile(char* FileName)
{
fstream file(FileName,ios::in|ios::binary);
if(!file)
{
cout<<" 文件打开错误!"<<endl;
abort();
}
length=0;
while(!file.eof())
{
data[length].readFromFile(file);
length++;
}
length--;
file.close();
//cout<<" 读取数据成功!"<<endl;
//system("pause");
}

template <typename T>
void SeqList<T>::writeToFile(char* FileName)
{
fstream file(FileName,ios::out|ios::binary);
if(!file)
{
cout<<" 文件打开错误!"<<endl;
abort();
}
for(int i=0;i<length;i++)
{
cout<<"write for"<<endl;
data[i].writeToFile(file);
}
file.close();
cout<<" 写入数据成功!"<<endl;
system("pause");
}

template <typename T>
T& SeqList<T>::operator[](int i)
{
assert(i>=0 &&i<length);
return data[i];
}
#endif


创建 SeqList<int> book; book.createList();运行,输入长度超过默认的11,运行没问题;但是创建SeqList<string>book;book.createList();运行就有问题了;自定义类A的话,创建SeqList <A>book;book.createList();运行也有问题啊!求解决
...全文
180 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧