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


Автор: pubsy 10.4.2006, 10:34
Помогите пожалуйста разобратся.
Задача:Создать связной список, ввести целочисельные значения, вывести все значения по порядку.
Списал программку из книжки. Скомпилировал. Выводит только непонятное предупреждение, ошибок нету. Ввожу значения. Потом должно всё по порядку вывести, а не выводит.
И ещё, не понял что означает "=0" в выражении типа: virtual void show()=0;
Код

#include <iostream>
using namespace std;

class Data
{
private:
    int myValue;
public:
    Data(int val):myValue(val){}
    ~Data(){}
    void Show(){cout<<myValue<<endl;}
};

class Node
{
private:
        
public:
    Node(){}
    virtual ~Node(){}
    virtual Node* Insert(Data* theData)=0;
    virtual void Show()=0;
};

class InternalNode:public Node
{
private:
    Data* myData;
    Node* myNext;
public:
    InternalNode(Data* theData, Node* next);
    ~InternalNode(){delete myData; delete myNext;}
    virtual Node* Insert(Data *theData);
    virtual void Show(){cout<<myData; myNext->Show();}
};

InternalNode::InternalNode(Data* theData, Node* next):myData(theData),myNext(next){}

Node* InternalNode::Insert(Data* theData)
{
    InternalNode* dataNode=new InternalNode(theData,this);
    return dataNode;
}

class TailNode:public Node
{
private:

public:
    TailNode(){}
    ~TailNode(){}
    virtual Node* Insert(Data* theData);
    virtual void Show(){}
};

Node* TailNode::Insert(Data* theData)
{
    InternalNode* dataNode=new InternalNode(theData,this);
    return dataNode;
}

class HeadNode:public Node
{
private:
    Node* myNext;
public:
    HeadNode();
    ~HeadNode(){delete myNext;}
    virtual Node* Insert(Data* theData);
    virtual void Show(){myNext->Show();}
};

HeadNode::HeadNode()
{
    myNext=new TailNode;
}

Node* HeadNode::Insert(Data* theData)
{
    myNext=myNext->Insert(theData);
    return this;
}

class LinkedList
{
private:
    HeadNode* myHead;
public:
    LinkedList();
    ~LinkedList(){delete myHead;}
    void Insert(Data* theData);
    void ShowAll(){myHead->Show;}
};

LinkedList::LinkedList()
{
    myHead=new HeadNode;
}
void LinkedList::Insert(Data* pData)
{
    myHead->Insert(pData);
}

void main()
{
    Data* pData;
    int val;
    LinkedList ll;

    for(;;)
    {
        cout<<"Enter next value (0 to stop): ";
        cin>>val;
        if (!val) break;
        pData=new Data(val);
        ll.Insert(pData);
    }
    ll.ShowAll();
}

Помогите пожалуйста.

Автор: Бонифаций 10.4.2006, 10:53
Цитата(pubsy @ 10.4.2006, 10:34 Найти цитируемый пост)
И ещё, не понял что означает "=0" в выражении типа: virtual void show()=0;


абстрактная функция. таким присваиванием вы говорите что тела этой виртуальной функции нет в этом классе. и она должна быть обязательно переопределена в наследниках.

Слушайте,а зачем вам вся эта война с классами? не проще с помощью STL сделать? Все решение в три строчки уложится

list<int> lst;
copy(ifstream_iterator<int>(stdin), ifstream_iterator<int>(), back_inserter(lst));
copy(lst.begin(),lst.end(), ofstream_iterator<int>(stdout," "));

Автор: pubsy 11.4.2006, 09:02
Спасибо. Но это университетское задание. Проверка знаний по теме указатели. Конечно я бы не занимался этим маразмом с классами...

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