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


Автор: MagicPRO 2.1.2007, 14:24
Написать программу организации связного списка по следующему признаку: если введённый символ буква, то в конце списка добавляется узел, который содержит символ, иначе узел добавляется в начало списка и содержит цифру. Народ выручите пожалуста до экзамена 2 дня, если сдам эту лабу, поставят автомат, списки толком не учили, напишите хотя бы основную часть кода!!!!

Автор: Oleg_Ci 3.1.2007, 11:22
 smile 
Код

#include <iostream>
using namespace std;

class Node{ // узел списка
public:
    union { double n; char ch; }; // данные
    Node * Next;
    bool Num; // true-число, false-символ

    Node( double a = 0 ): n(a), Next(NULL), Num(true) {};
    Node( char c = 0 ): ch(c), Next(NULL), Num(false) {};
    friend ostream & operator<<( ostream & out, const Node & n );
};

class List{ // связанный список
    Node *Begin, *End; // первый и последний элемент списка
public:
    List(): Begin(NULL), End(NULL){};
    Node * begin(){ return Begin; } // начало списка
    Node * end() { return NULL; } // конец списка
    // добавление числа в конец списка
    void Push_back( double a ){
        if( End )
            End = End->Next = new Node(a);
        else
            Begin = End = new Node(a);
    }
    // добавление символа в начало списка
    void Push_front( char c ){
        Node * n = new Node(c);
        if( Begin ){
            n->Next = Begin; 
            Begin = n;
        }
        else Begin = n;
    }
    // удаление данных из списка
    void Erase(){
        for( End = Begin; Begin; Begin = End ){
            End = End->Next;
            delete Begin;
        }
        Begin = End = NULL;
    }
    ~List(){
        Erase();
    }
};
ostream & operator<<( ostream & out, const Node & n ){
    if( n.Num ) // если узел содержит число
        out << n.n;
    else out << n.ch; // иначе содержится симол
    return out;
}
//////////////////////////  MAIN /////////////////////////////
int main(){
    List array;
    cout << "Enter 10 int or char:\n";
    double n;
    char c;

    // цикл добавления 10 чисел или символов
    for( int i=0; i<10; i++ ){
        if( cin >> n ){ // если считали число
            array.Push_back( n ); // число в конец списка
        }
        else{ // если считываем не число
            cin.clear();
            cin >> c;
            array.Push_front( c ); // символ в начало списка
        }
    }
    cout << "\n\nList out:\n";

    // Вывод всего что считали
    for( Node * pt = array.begin(); pt; pt = pt->Next )
        cout << *pt << "\n";
    
    array.Erase(); // удаление всех элементов

    cin.sync();
    cout << "\n\nPress enter key to continue";
    cin.get(); // пауза
    return 0;
}

Автор: MagicPRO 3.1.2007, 15:56
Огромное спасибо, вобщето это нужно было связать со структурами, но это моя ошибка, сам уже переделаю!  smile 

Автор: Oleg_Ci 5.1.2007, 10:00
Интересная задача, создать список чтоб и буквы и цифры содержал...
Я тут ещё поизобретал, связанный список сделал, в него можно запихнуть всё что "дружит" с функцией вывода на консоль
Код

friend ostream & operator<<( ostream & out, ... );
Код

#include <iostream>
#include <string>
using namespace std;

template <typename tip>
class node;

class base{ // базовый класс для узлов списка
public:
    base * next; // указатель на следующий узел node
    base(): next(NULL) {}; // конструктор

    // деструктор
    virtual ~base(){};
    // функция вывода данных на консоль
    virtual void out( ostream & out )const =0;
};

template <typename tip>
class node: public base{ // узел для связанного списка
    tip data; // данные сохнаяемые в узле
public:
    node<tip>( tip a = tip()): data(a) {}; // конструктор
    node<tip>( const node & n ): data( n.data ) {}; // копирующий
    virtual void out( ostream & out )const {
        out << data << "\n";
    }
};

class list{
public:
    // начало и конец списка
    base *begin, *end;
    // конструктор
    list(): begin(NULL), end(NULL) {};
    // добавляем в конец списка
    template <typename tip>
    void push_back( const tip & a ){
        if( !begin )
            begin = end = new node<tip>( a );
        else
            end = end->next = new node<tip>(a);
    }
    // добавляем в начало списка
    template <typename tip>
    void push_front( const tip & a ){
        node<tip> *n = new node<tip>(a);
        if( !begin )
            begin = end = n;
        else{
            n->next = begin;
            begin = n;
        }
    }
    // удаление данных из списка
    void erase(){
        for( base * b = begin; b; b=begin ){
            begin = begin->next;
            delete b;
        }
        begin = end = NULL;
    }
    // вывод данных списка на консоль
    void out(){
        for( base * b = begin; b; b=b->next )
            b->out(cout);
    }
    // деструктор
    ~list() { erase(); }
};

class a{ // класс для эксперимента
    static const int b = 555555;
    friend ostream & operator<<( ostream & out, const a & x ){
        out << x.b;
        return out;
    }
};
//////////////////////////  MAIN /////////////////////////////
int main(){
    list array;
    array.push_back( 10 ); // int
    array.push_back( 'c' ); // char
    array.push_back( 8.45 ); // float - double
    array.push_back( string("asd")); // string

    array.push_front( static_cast<char*>("qwe2")); // char*
    array.push_front( static_cast<double>( 2.3e4 )); // double
    array.push_front( 0xff ); // int
    array.push_front( a() ); // пихаем в список класс 'a'

    array.out(); // вывод на консоль всего что запихнули в array

    cout << "\n\nPress enter key to continue";
    cin.get(); // пауза
    return 0;
}

Автор: MagicPRO 6.1.2007, 00:53
smile  smile  молодец!!!! Спасибо будет щас над чем подумать и код поразбирать

Добавлено @ 01:01 
2 Oleg Ci
а почему ты пишешь при помощи классов, так проще. Нам препод говорил шо типа списки связывать только со структурами, или у тебя такой стиль рограммирования? smile 

Автор: Oleg_Ci 6.1.2007, 05:51
Да фиг его знает, что лучше, структуры или классы, вроде это одно и тоже, поставь в место слова class слово struct,
и всё. А с классами, делал потому что здесь наследование, да и вроде понятней для меня так. smile 
Смотри внимательней, я ещё учусь сам, могут быть ошибки в коде.

Автор: MagicPRO 6.1.2007, 11:16
Понятно, я тоже учусь. Насчет ошибок то ниче, покапаюсь найду,  в крайнем случае к преподу обращусь. Спасибо!

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