燕山大学-面向对象程序设计实验-实验九 模板类的构造-实验报告

CSDN的各位友友们你们好,今天千泽为大家带来的是
燕山大学-面向对象程序设计实验-实验九 模板类的构造-实验报告,
接下来让我们一起进入c++的神奇小世界吧,相信看完你也能写出自己的 实验报告!
本系列文章收录在专栏 燕山大学面向对象设计报告中 ,您可以在专栏中找到其他章节
如果对您有帮助的话希望能够得到您的支持和关注,我会持续更新的!

实验九 模板类的构造

9.1 实验目的

1.理解和应用类模板和函数模板;

2.复习数据结构的相关知识;

3.学习用C++的编程思想实现链表类。

9.2 实验内容

9.2.1程序阅读

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]: "<
9.2.2 程序设计

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<<"*链表尾插入"<

9.3思考题

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 "<

你可能感兴趣的:(燕山大学面向对象设计报告,c++,c语言,学习,经验分享,后端)