Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Однонаправленное кольцо


Автор: Foxxx 13.5.2008, 13:53
Реализовать шаблон класса Circle, реализующий однонаправленное кольцо. Для представления элемента кольца использовать шаблон структуры Node. Определить функции добавления элемента в кольцо и поиска в кольце.

С++

Автор: Foxxx 13.5.2008, 17:32
Неужели никто мне не поможет?
ПЛЗ! Ошень нада smile 

Автор: Foxxx 13.5.2008, 20:25
up

Автор: Foxxx 14.5.2008, 17:06
Очень нуна! Помогите плз!

Автор: anatox91 14.5.2008, 17:54
может хватит уже флудить, а?

Автор: Foxxx 15.5.2008, 13:18
Да я не флужу!
Просто очень нужно, мне КР скоро сдавать, а я не могу разобраться в этих списках!
Пробовал книжки читать - всеравно не догоняю!
Объясните мне тупому попроще как-нибуть.
 smile 

Автор: Foxxx 26.5.2008, 11:31
Вот что сам смог набросать! Ток я не уверен что тут все верно! Хелп ми плиз!

Код

#include <iostream>
using namespace std;

template <class T> class Circle
{
    struct Node
    {
        T Data;
        Node *Next;
    };

    int N;
    Node *First;

public:
    Circle();
    Circle(T);
    Circle(const Circle &);
    ~Circle();
    void Add(T);
    void Echo();
};

template <class T> Circle <T>::Circle()
{
    cout << "Def_Construct..." << "\n";
    N = 0;
}

template <class T> Circle<T>::Circle(T Data)
{
    cout << "Param_Construct..." << "\n";
    First = new Node;
    First->Data = Data;
    First->Next = First;
    N = 1;
}

template <class T> Circle<T>::Circle(const Circle &Obj)
{
    cout << "Cpy_Construct..." << "\n";
}

template <class T> Circle<T>::~Circle()
{
    cout << "Destruct..." << "\n";
}

template <class T> void Circle<T>::Add(T Data)
{
    Node *Item = new Node;
    Item->Next = First;
    Item->Data = Data;
    if (!First)
    {
        Item->Next = First;
        First = Item;
    }
    else First = Item;
    N++;
}

template <class T> void Circle<T>::Echo()
{
    //Node *Item = First;
    for (int I = 0; I < N; I++)
    {
        cout << First->Data << ' ';
        First = First->Next;
    }
    cout << "\n";
}

int main()
{
    Circle <int> C(666);
    for (int I = 1; I <= 5; I++) C.Add(I);
    C.Echo();
    return 0;
}

Автор: udly 2.12.2010, 19:17
Как раз клиент ко мне обратился с задачами по С++, а среди них есть и такая. Думал найти что то похожее, но халява не прокатила, пришлось самому дописывать  smile 
Понимаю, что уже не актуально, но может кому пригодится. Пример Foxxx'a слегка не доделан: не реализован конструктор копирования, деструктор, некорректно написана функция добавления элемента в кольцо. Да и по сути представленная структура кольцом не является.
Предлагаю свой вариант решения (за основу взял пример Foxxx'a). Элементы буду добавлять в конец кольца (условно, конечно). Поскольку кольцо однонаправленное, то хранить буду указатель на последний элемент (по последнему найти первый гораздо легче, чем последний по первому). 
Код

#include <iostream>
using namespace std;

template <class T>
class Circle
{
    struct Node
    {
        T data;
        Node *next;
    };

protected:
    Node *last; // указатель на последний элемент
public:
    Circle();    // конструктор по умолчанию
    Circle(T);  // конструктор с параметрами
    Circle(const Circle &); // конструктор копирования
    ~Circle();    // деструктор
    void addItem(T);
    void print() const;
    void find(T) const;
};

template <class T>
Circle <T>::Circle():last(NULL)
{
    // кольцо не содержит элементов
}

template <class T>
Circle<T>::Circle(T data)
{
    last = new Node;
    last->data = data;
    last->next = last;
}

template <class T> 
Circle<T>::Circle(const Circle& circle)
{
    last=NULL;
    if(circle.last!=NULL)
    {
        Node *cur=circle.last->next;
        while(cur!=circle.last) // проходим элементы пока не дойдем до последнего
        {
            this->addItem(cur->data);
            cur = cur->next;
        }
        // копирование последнего элемента
        this->addItem(circle.last->data);
    } 
}

template <class T>
Circle<T>::~Circle()
{
    Node *temp, *cur;
    // удаление элементов и освобождение ресурсов
    if(last!=NULL) // если кольцо содержит элементы
    {
        cur = last->next;
        last->next=NULL;    // разрываем кольцо
        while(cur)
        {
            temp = cur;
            cur=cur->next;
            delete temp;
        }
    }
}

template <class T> 
void Circle<T>::addItem(T data)
{
    // если добавляется певый элемент
    if(last==NULL)
    {
        last = new Node;
        last->next = last;
        last->data = data;
    }
    else // добавление второго и последующих элементов
    {
        Node *oldLast = last;
        Node *newNode = new Node;
        newNode->data = data;
        newNode->next=last->next;
        last=newNode;
        oldLast->next=newNode;
    }
}

template <class T> 
void Circle<T>::print() const
{
    if(last!=NULL)    // если кольцо не пустое
    {
        Node *cur=last->next;
        while(cur!=last) // выводим элементы пока не дойдем до последнего
        {
            std::cout << cur->data << "  ";
            cur = cur->next;
        }
        // вывод последнего элемента
        std::cout << last->data << endl;
    }
}

template <class T> 
void Circle<T>::find(T pattern) const
{
    int c=0;
    if(last!=NULL)    // если кольцо не пустое
    {
        Node *cur=last->next;
        while(cur!=last) // перебираем элементы пока не дойдем до последнего
        {
            if(cur->data == pattern)
                std::cout << "Совпадение найдено в " << c << " элементе кольца\n";
            cur = cur->next;
            c++;
        }
        // проверяем последнй элемент
        if(last->data == pattern)
            std::cout << "Совпадение найдено в " << c << " элементе кольца\n";
    }    
}

int main()
{
    Circle <int> c1;
    c1.addItem(15);
    c1.addItem(30);
    c1.addItem(15);
    c1.addItem(7);
    
    std::cout << "Вывод элементов кольца c1: ";
    c1.print();

    // создание объекта с2 с использованием конструктора копирования
    Circle <int> c2=c1;
    c2.addItem(99);
    c2.addItem(15);

    std::cout << "Вывод элементов кольца c2: ";
    c2.print();

    std::cout << "Поиск элементов кольца с2, содержащих число 15:\n";
    c2.find(15);

    return 0;
}

P.S. Мой контактный эл. ящик [email protected]

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)