Создание Шаблона Класса С++

Тема в разделе "C/C++/C#", создана пользователем inek, 9 апр 2012.

  1. inek

    inek Гость

    Добрый вечер! Помогите, пожалуйста, начинающей программистке решить следующую задачу:
    Разработать шаблон класса для работы с однонаправленным некольцевым списком. Реализовать следующие действия:
    -добавление звена в начало списка;
    -удаление звена из начала списка;
    -добавление звена в произвольное место списка, отличное от начала (например, после звена, указатель на которое задан);
    -удаление звена из произвольного места списка, отличного от начала (например, после звена, указатель на которое задан);
    -проверка, пуст ли список;
    -очистка списка;
    -формирование списка;
    -печать списка.
    Составить программу, которая формирует список L включив в него по одному разу элементы, которые входят в один из списков L1 и L2, но в то же время не входит в другой из них.

    Все действия реализовала, а вот как составить метод формирования списка L не могу сообразить. Вот шаблон, разработанный мной:

    Код (C++):
    #include <iostream>

    using namespace std;

    template <typename T>
    class List
    {
    struct Node
    {
    T data;
    Node *next;
    Node(T d, Node *n = 0):data(d), next(n) {}
    };
    Node *head;
    public:
    List(Node *h = 0):head(h){}
    ~List();
    bool isEmpty();
    void insertAfter(Node *pre, T d);
    void removeAfter(Node *pre);
    void pushFront(T d);
    T popFront();
    void print();
    Node *search(T d);
    void removeDuplicate();
    void create(int k);
    };

    template <typename T>
    List<T>::~List()
    {
    while (!isEmpty())
    popFront();
    }

    template <typename T>
    bool List<T>::isEmpty()
    {
    return !head;
    }

    template <typename T>
    void List<T>::insertAfter(Node *pre, T d)
    {
    if(!pre) return;
    Node *newNode = new Node(d,0);
    newNode->next = pre->next;
    pre->next = newNode;
    }

    template <typename T>
    void List<T>::removeAfter(Node *pre)
    {
    if (!pre || !pre->next) return;
    Node *tmp = pre->next;
    pre->next = pre->next->next;
    delete tmp;
    }

    template <typename T>
    void List<T>:: pushFront(T d)
    {
    Node *newNode = new Node(d,0);
    if(!head) {
    head = newNode;
    return;
    }
    newNode->next = head;
    head = newNode;
    }

    template <typename T>
    T List<T>:: popFront()
    {
    T data;              
    if(!head) return data;
    Node *tmp = head;
    data = head->data;
    if(head->next) {
    head = head->next;
    delete tmp;
    return data;
    }
    delete tmp;
    head = NULL;
    return data;
    }

    template <typename T>
    typename List<T>::Node* List<T>::search(T d)
    {
    if(!head) return NULL;
    Node* cur = head;
    while(cur) {
    if(cur->data == d) return cur;
    cur = cur->next;
    }
    return NULL;
    }


    template <typename T>
    void List<T>:: print()
    {
    if(!head) return;
    Node *cur = head;
    while(cur) {
    cout << cur->data << "; ";
    cur = cur->next;
    }
    cout << endl;
    }

    template <typename T>
    void List<T>::create(int k)
    {
    T d;
    for (int i = 1; i <= k; i++)
    {
    cout << "Enter " << i << "-i element: ";
    cin >> d;
    pushFront(d);

    }
    }
    Работаю в DEV C++ (так требует препод).
     
  2. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    у вас есть объявление функций описание которых отсутствует!
    вот как реализовать
    Код (C++):
    //
    List A(a);
    List B(b);
    int c=a+b;
    List C(c);
    for(int i=0;i<a;i++)
    C.pushFront(A.popFront());
    for(int i=0;i<b;i++)
    C.pushFront(B.popFront());
    removeDuplicate(C);
    //
    вот функция удаления повторов
    НО!!! для вашего класса её надо немного изменить ))
    Код (C++):
    //
    void removeDuplicate(List &С,int c)
    {
    int t=c;
    for(int a,i=0;i<t;i++)
    {
    a=С.front();//функция front это popFront,но не удаляющая элемент!
    С.popFront();
    for(int b,j=0;j<t-1;j++)
    {
    if(a==С.front())
    С.popFront();
    else
    {
    b=C.front();
    С.popFront();
    С.push_back(b);
    }
    }
    С.push_back(a);
    }
    }
    //
     
  3. inek

    inek Гость



    int c=a+b; - нужно добавить метод сложения двух списков? Будет ли это работать для всех типов данных как просится в задаче?


    вот так я объявляю два списка:
    Код (C++):
        List<string> *L1 = new List<string>(NULL);
    L1->create(7);
    L1->print();

    List<string> *L2 = new List<string>(NULL);
    L2->create(7);
    L2->print();
    из них нужно сделать третий L3...
     
Загрузка...

Поделиться этой страницей