CSDN的各位友友们你们好,今天千泽为大家带来的是
燕山大学-面向对象程序设计实验-实验九 模板类的构造-实验报告,
接下来让我们一起进入c++的神奇小世界吧,相信看完你也能写出自己的 实验报告!
本系列文章收录在专栏 燕山大学面向对象设计报告中 ,您可以在专栏中找到其他章节
如果对您有帮助的话希望能够得到您的支持和关注,我会持续更新的!
1.理解和应用类模板和函数模板;
2.复习数据结构的相关知识;
3.学习用C++的编程思想实现链表类。
9.2 实验内容
1.理解下面的动态数组类模板,它由一系列位置连续、任意数量相同类型的元素组成,其元素个数可在程序运行时改变,并完成该类中没有完成的成员函数(不允许改变已有代码),并设计主函数,实现对该模板类的功能测试。
#include
#include
//容错处理
enum ErrorType
{
invalidArraySize,memoryAllocatetionError,indexOutOfRang
};
char *errorMsg[] =
{
"Invalid array size",
"Memory allocation error",
"Invalid index"
};
template
class Array
{
private:
T* alist;
int size;
void Error(ErrorType error) const;//输出错误信息
public:
Array(int sz=50);//构造函数
Array(const Array& X);//拷贝构造函数
~Array(void);//析构函数
Array& operator=(const Array& rhs);//重载赋值运算符
T& operator[](int i);//重载下标运算符
int GetSize(void) const;//获取数组大小
void Resize(int sz);//重新设置数组大小
};
template
Array::Array(int sz)
{
if(sz <= 0)
Error(invalidArraySize);
size = sz;
alist = new T[size];
if(alist == 0)
Error(memoryAllocatetionError);
}
template
Array::Array(const Array& X)
{
int n = X.size;
size = n;
alist = new T[n];
if(alist == 0)
Error(memoryAllocatetionError);
T* srcptr = X.alist;
T* destptr = alist;
while(n--)
*destptr++ = *srcptr++;
}
template
Array::~Array()
{
delete[] alist;
}
template
Array& Array::operator=(const Array &rhs)
{
int n = rhs.size;
if(size != n)
{
delete[] alist;
alist = new T[n];
if(alist == 0)
Error(memoryAllocatetionError);
size = n;
}
T* destptr = alist;
T* srcptr = rhs.alist;
while(n--)
*destptr++ = *srcptr++;
return *this;
}
template
T& Array::operator[](int n)
{
if(n < 0 || n > size-1)
Error(indexOutOfRang);
return alist[n];
}
void main()
{
}
答:
#include
#include
using namespace std;
//容错处理
enum ErrorType{
invalidArraySize,memoryAllocatetionError,indexOutOfRang
};
char *errorMsg[] = {
"Invalid array size",
"Memory allocation error",
"Invalid index"
};
template
class Array{
private:
T* alist;
int size;
void Error(ErrorType error) const{//输出错误信息
cout<& X);//拷贝构造函数
~Array(void);//析构函数
Array& operator=(const Array& rhs);//重载赋值运算符
T& operator[](int i);//重载下标运算符
int GetSize(void) const;//获取数组大小
void Resize(int sz);//重新设置数组大小
};
template
Array::Array(int sz){
if(sz <= 0)
Error(invalidArraySize);
size = sz;
alist = new T[size];
if(alist == 0)
Error(memoryAllocatetionError);
}
template
Array::Array(const Array& X){
int n = X.size;
size = n;
alist = new T[n];
if(alist == 0)
Error(memoryAllocatetionError);
T* srcptr = X.alist;
T* destptr = alist;
while(n--)
*destptr++ = *srcptr++;
}
template
Array::~Array(){
delete[] alist;
}
template
Array& Array::operator=(const Array &rhs){
int n = rhs.size;
if(size != n){
delete[] alist;
alist = new T[n];
if(alist == 0)
Error(memoryAllocatetionError);
size = n;
}
T* destptr = alist;
T* srcptr = rhs.alist;
while(n--)
*destptr++ = *srcptr++;
return *this;
}
template
T& Array::operator[](int n){
if(n < 0 || n > size-1)
Error(indexOutOfRang);
return alist[n];
}
template
int Array::GetSize(void)const{
return size;
}
template
void Array::Resize(int sz){
if(sz <= 0)
Error(invalidArraySize);
else if(sz == 0)
return;
T* newlist = new T[sz];
if(newlist == 0)
Error(memoryAllocatetionError);
int n = min(size,sz);
T* destptr = newlist;
T* srcptr = alist;
while(n--)
*destptr++ = *srcptr++;
delete[] alist;
alist=newlist;
size=sz;
}
int main(){
Array a(10);
for(int i=0;i<100;i++){
if(i==a.GetSize()){
a.Resize(i+10);
}
a[i]=i;
}
Array b;
b=a;
cout<<"a[10]: "<
1.设计一个通用链表类,要求如下:
a.数据成员包含头指针、尾指针、链表中节点个数、顺序访问中当前节点指针和当前节点前一个节点的指针;
b.主要的成员函数包含:生成节点(在链表头、尾以及任意位置)、插入节点、删除节点、访问/修改节点、遍历链表,以及一些辅助函数等;
c.能实现两个链表的复制;
d.能实现两个链表对象的赋值;
e.在测试程序中定义两个整型链表A和B,本别插入5个元素,然后把B中的元素加入A的尾部。
答:
#include
#include
#include
using namespace std;
template
class node{//节点
public:
T data=0;
node *next;
};
template
class LinkList{
private:
node *head;//头节点
node *end;//尾节点
int size;//节点个数
node *now;//当前指针
node *last;//前一个指针
public:
LinkList(int n);
~LinkList();
void Generate_head();//生成默认data为0
void Generate_end();
void Generate_i(int i);
void Insert(int i,node *s);
void Delete(int i);
node* getNode(int i);
void overAll();
node* getHead();
int getSize();
void operator=(LinkList &t);
void Insert_Link(int i,LinkList &t);
void Insert_Link_End(LinkList &t);
};
template
LinkList::LinkList(int n=0){
size=n;
head=new node;
end=head;
for(int i=1;i<=n;i++){
node *s=new node;
end->next=s;
end=s;
}
}
template
LinkList::~LinkList(){
delete[] head;
delete[] end;
delete[] now;
delete[] last;
}
template
void LinkList::operator=(LinkList &t){
if(getSize()!=t.getSize()){
cout<<"Error: Size not equal! "<data=t.getNode(i)->data;
}
}
template
int LinkList::getSize(){
return size;
}
template
node* LinkList::getNode(int i){
if(i<1 || i >size){
cout<<"Error: i out of range!"< *t=head;
for(int j=1;j<=i-1;j++)
t=t->next;
return t;
}
template
void LinkList::Generate_head(){//头生成一个
size++;
node *s=new node;
s->next=head;
head=s;
}
template
void LinkList::Generate_end(){//尾生成一个
size++;
node *s=new node;
end->next=s;
end=s;
}
template
void LinkList::Generate_i(int i){//在第i个位置生成一个
if(i<1 || i >size){
cout<<"Error: i out of range!"< *t=getNode(i-1);
node *s=new node;
s->next=t->next;
t->next=s;
}
template
node* LinkList::getHead(){
return head;
}
template
void LinkList::Insert(int i,node *s){
if(i<1 || i >size){
cout<<"Error: i out of range!"< *t=getNode(i-1);
s->next=t->next;
t->next=s;
}
template
void LinkList::Delete(int i){
if(i<1 || i >size){
cout<<"Error: i out of range!"< *s=head;
head=head->next;
delete[] s;
}else{
node *s=getNode(i);
node *t=getNode(i-1);
t->next=s->next;
delete[] s;
}
size--;
}
template
void LinkList::Insert_Link(int i,LinkList &t){
int n=t.getSize();
for(int j=1;j<=n;j++){
node *s=new node;
s->data=t.getNode(j)->data;
this->Insert(i++,s);
}
}
template
void LinkList::Insert_Link_End(LinkList &t){
int i=size+1;
size+=t.getSize();
Insert_Link(i,t);
size-=t.getSize();
}
template
void LinkList::overAll(){
int n=getSize();
for(int i=1;i<=n;i++)
cout<data<<" ";
cout< LL(5);
for(int i=1;i<=5;i++)
LL.getNode(i)->data=i;
cout<<"*LinkList 创建"< A(5);
A=LL;
A.overAll();
LinkList B(5);
for(int i=1;i<=5;i++)
B.getNode(i)->data = -1*i;
cout<<"*链表尾插入"<
1.根据数据结构和类模板知识,定义一个通用队列(先进先出)类并加以实现,编写主函数进行测试;
答:参照课本P510
#include
#include
using namespace std;
const int MAXSIZE = 1000;
template
class Queue{
private:
int front,rear,count;
T qlist[MAXSIZE];
public:
Queue(void);
void Insert(const T& item);
T Delete(void);
T getFront(void) const;
int getLength(void) const;
bool isEmpty(void) const;
bool isFull(void) const;
};
template
Queue::Queue(void):front(0),rear(0),count(0){
}
template
void Queue::Insert(const T& item){
if(count==MAXSIZE){
cout<<"Queue Overflow!"<
T Queue::Delete(void){
T temp;
if(count==0){
cout<<"Delete from empty queue!"<
T Queue::getFront(void) const{
return qlist[front];
}
template
int Queue::getLength(void) const{
return count;
}
template
bool Queue::isEmpty(void) const{
return count==0;
}
template
bool Queue::isFull(void) const{
return count==MAXSIZE;
}
int main(){
Queueq;
q.Insert(1);
q.Insert(2);
q.Insert(3);
q.Insert(4);
q.Insert(5);
cout<<"The front is "<
2.根据数据结构和类模板知识,定义一个通用栈(后进先出)类并加以实现,编写主函数进行测试。
答:
#include
#include
using namespace std;
const int MAXSIZE = 1000;
template
class Stack{
private:
int top,count;
T slist[MAXSIZE];
public:
Stack(void);
void Push(const T& item);
T Pop(void);
T getTop(void) const;
int getCount(void) const;
bool isEmpty(void) const;
bool isFull(void) const;
};
template
Stack::Stack(void):top(0),count(0){
}
template
void Stack::Push(const T& item){
if(count==MAXSIZE){
cout<<"Stack Overflow!"<
T Stack::Pop(void){
T temp;
if(count==0){
cout<<"Delete from empty Stack!"<
T Stack::getTop(void) const{
return slist[top-1];
}
template
int Stack::getCount(void) const{
return count;
}
template
bool Stack::isEmpty(void) const{
return count==0;
}
template
bool Stack::isFull(void) const{
return count==MAXSIZE;
}
int main(){
Stacks;
s.Push(1);
s.Push(2);
s.Push(3);
s.Push(4);
s.Push(5);
cout<<"The top is "<