求大神c++ 类型: 以下是一个List类模板的定义:

以下是一个List类模板的定义:
template<class T> class List{
public:
List(); //构造函数
void Add(T&); //在Link表头添加新结点
void Remove(T&); //在Link中删除含有特定值的元素
T* Find(T&); //查找含有特定值的结点
void PrintList(); // 打印输出整个链表
~List();
protected:
struct Node{
Node* pNext;
T* pT;
};
Node *pFirst; //链首结点指针
};
完成对上述List类模板含有的各成员函数的定义。然后定义一个简单的Student类,并利用编写的List类模板对一个班级的学生进行动态管理。(根据自己的能力选做)。
提示:要编写出这个程序,要理解Link类模板中各数据成员的含义。pFirst代表链表首指针,Node代表链表的一个结点,pT为指向该结点对应数据的指针,理解这点非常重要。

参考如下代码:

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#include<stdio.h>
#include<string>

#include "math.h"

template<class T> class List{
public:
    List()  //构造函数
    {
        pFirst = NULL;
    }
    
    void Add(T& t)  //在Link表头添加新结点
    {
        if(pFirst == NULL)
        {
            pFirst = new Node;
            *(pFirst->pT) = t;
        }
        else
        {
            Node* pNewNode = new Node;
            *(pNewNode->pT) = t;
            pNewNode->pNext = pFirst;
            pFirst = pNewNode;
        }
    }

  void Remove(T& t) //在Link中删除含有特定值的元素
    {
        Node* pNode = pFirst;
        if(*(pNode->pT) == t)
        {
            pFirst = pFirst->pNext;
            delete pNode;
            return;
        }
        while(pNode != NULL)
        {
            Node* pNextNode = pNode->pNext;
            if(pNextNode!=NULL)
            {
                if(*(pNextNode->pT) == t)
                {
                    pNode->pNext = pNextNode->pNext;
                    delete pNextNode;
                    return;
                }
            }
            else
                return;//没有相同的

            pNode = pNode->pNext;
        }
    }
  T* Find(T& t)  //查找含有特定值的结点
    {
        Node* pNode = pFirst;
        while(pNode != NULL)
        {
            if(*(pNode->pT) == t)
            {
                return pNode->pT;
            }
            pNode = pNode->pNext;
        }
        return NULL;
    }
  void PrintList()  // 打印输出整个链表
    {
        if(pFirst == NULL)
        {
            cout<<"列表为空列表!"<<endl;
            return;
        }
        Node* pNode = pFirst;
        while(pNode != NULL)
        {
            cout<<*(pNode->pT)<<endl;
            pNode = pNode->pNext;
        }
    }
  ~List()
    {
        Node* pNode = pFirst;
        while(pNode != NULL)
        {
            Node* pNextNode = pNode->pNext;
            delete pNode;
            pNode = pNextNode;
        }
    }
protected:
  struct Node{
    Node* pNext;
    T* pT;

    Node()
    {
        pNext = NULL;
        pT = new T;
    }
    ~Node()
    {
        delete pT;
    }
  };
  Node *pFirst;        //链首结点指针
};

class Student
{
public:
    char id[20];    //学号
    char name[20];    //姓名
    int age;    //年龄
    Student()
    {
    }
    ~Student()
    {
    }
    Student(const char* pid, const char* pname, int _age)
    {
        strcpy(id, pid);
        strcpy(name, pname);
        age = _age;
    }
    bool operator==(const Student& stu)
    {
        return strcmp(id, stu.id) == 0 && strcmp(id, stu.id) == 0 && age==stu.age;
    }
    Student& operator=(const Student& stu)
    {
        strcpy(id, stu.id);
        strcpy(name, stu.name);
        age = stu.age;
    }
    friend ostream& operator<< (ostream &out,const Student& stu);
};
ostream & operator<< (ostream &out,const Student& stu)
{
    out<<"id:"<<stu.id<<"\tname:"<<stu.name<<"\tage:"<<stu.age<<endl;
}

int main()
{
    List<Student> stuList;
    cout<<"添加学生前:"<<endl;
    stuList.PrintList();
    
    Student stu1("1", "张三", 18);
    Student stu2("2", "李四", 18);
    Student stu3("3", "王五", 18);
    Student stu4("4", "至尊宝", 18);
    Student stu5("5", "猪八戒", 18);
    Student stu6("6", "唐僧", 18);
    Student stu7("7", "沙和尚", 18);
    Student stu8("8", "观音", 18);
    stuList.Add(stu1);
    stuList.Add(stu2);
    stuList.Add(stu3);
    stuList.Add(stu4);
    stuList.Add(stu5);
    stuList.Add(stu6);
    stuList.Add(stu7);
    stuList.Add(stu8);
    cout<<"添加学生后:"<<endl;
    stuList.PrintList();


    Student stu11("1", "张三", 18);
    Student* pStu = stuList.Find(stu11);
    cout<<"查找到的同学是:"<<*pStu;

    stuList.Remove(stu11);
    cout<<"\n\n删除第一个后:"<<endl;
    stuList.PrintList();

    return 0;
}

温馨提示:内容为网友见解,仅供参考
无其他回答

树型结构类(模板) C++ 紧急求解!!!
template <class 类型形参> 函数返回值类型 类模板名称<类型形参>::函数名(函数参数列表){ ...\/\/函数体 } 这里只是定义了类模板,如果你在主函数里没有实例化这个类模板,编译器是不会去编译这个类模板的,你必须,举个例子,这样来实例化 list<int> a;然后,调用a的成员函数get,就OK了 ...

c++ 类模板定义
template< class T> T* function(const_iterator<T*> it1,const_iterator<T*> it2){ ...} 这是函数模版,类模板有点长。但是可以用上面那个。

c++ 如何使用class
一、这是个关键字的问题,在template<>里面,class和typename完全是等价的,但鼓励使用typename,毕竟class不太准确。二、在类定义的内部是肯定不需要再加template关键字的,除非你要定义的函数需要另一个模板参数。在类外面,肯定是要加template的。三、这两个函数都是构造函数,不过是两个重载而已。sq_...

C++问题:什么叫类模版函数?怎么用呢?
类模板,是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从而大大提高编程的效率。模板的类型参数由关键字class 或关键字typename 及其后的标识符构成。在模板参数表中...

C++模板List.Add的参数类型应该怎样定义?
第一种为副本传递,实际接收到的是实参的副本。第二种是引用传递,实际参数必须是可修改的变量。可以尝试下下面的形式 void add(const T & item){ this->buffer[n]=item;...}

【Example】C++ Template (模板)概念讲解及编译避坑
模板分为函数模板和类模板。函数模板是用于实现同类型变量操作的通用函数,如加法或乘法。通过使用`template>`,程序员可以在调用时指定参数类型。例如,可以创建一个支持多种类型相乘的模板函数。类模板则用于定义可以处理不同类型对象的类。例如,一个包装std::vector的模板类,其内部成员函数可以使用模板...

C\/C++模板类模板与函数模板区别,以及用法详解
template 类模板名称<类型参数> {成员声明;} 例如:template<typename T> class MyClass {T data;};在这个例子中,T是一个通用的数据类型,可以在实例化类模板时指定为任意类型。类模板与函数模板的区别主要体现在两个方面:1. 类模板没有自动类型推导的使用方式,这意味着在实例化类模板时需要明确...

c++ 模板类 后面每个方法前的template <class Type>有什么意义 对每个...
c++集合了过程式语言,通用语言,面向对象语言的众多特点。模板是通用语言的特性,模板又叫参数化类型(parametrized types)。模板的定义。以下是模板定义的一般格式:template <class any>\/\/class 也可以换成typename,后者是新来的。void swap(any &a,any &b){ ...} 利用模板机制可以显著减少冗余信...

C++中,类模板和模板类有什么区别?
(1)作为类模版的同义词 (2)从模版产生类 (3)具有一个template-id名称的类。(template-id指的是模版名称与紧随其后的尖括号内部的所有实参的组合)第二个和第三个含义区别是很细微的,它们的这些区别无关紧要。通常使用的是 类模版。就像常使用 函数模版,而不是模版函数。

c++选择题,求大神详解
你少写东西了应该是 template<class T> class BigNumber{ ...} T是模板,代表任意类型,也就是说可以是自定义类型也可以是int,char等基本类型。因为这个类重载了 "+" 加号运算符,所以可以认定 "+" 前面的类型是对象,后面的是参数。也就是说C选项的错误是没有重载这种 "+" 运算符,可能你还...

相似回答