Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двунаправленный список 
:(
    Опции темы
Metalex
Дата 8.2.2010, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Здравствуйте! Попытался сделать программу по примеру.. Нужно создать двунаправленный список с помощью классов. Кол-во эл-тов в списке не важно. Вывести его. Помогите найти ошибку(и), пожалуйста! Компилю в Dev.
Код
#include <iostream.h>
#include <system.h>

class Book
{public:
    char name[20]; // дані
    char author[20];
    int page;
    int year;
    char place[10];
    Book *next; // покажчик на наступний вузол
    Book *prev; // покажчик на попередній вузол
    Book (char dat = 0) {next = 0;  prev = 0;}// конструктор
};

class List
{    Book *pbeg, *pend; // покажчики на початок та кінець списку
public:
    List()    { pbeg = 0; pend = 0;} // конструктор
    ~List(); // деструктор
    void add(char d); // додавання вузла в кінець списку
    void print(); // друк списку в прямому напрямку
};
void List::add(char d)
{    Book *pv = new Book(d); // виділення пам'яті під новий вузол
    if(!pbeg) { pbeg = pend = pv; } // перший вузол
    else    { // зв'язування нового вузла з попереднім:
        pv->prev = pend; pend->next = pv;
        pend = pv; // оновлення покажчика на кінець списку
        }
}

void List::print()
{    Book *pv = pbeg;
    cout << endl << " list: ";
    while(pv) {cout << pv->name << " "; pv = pv->next;    }
    cout << endl; 
}
    
List::~List()
{    If (pbeg) 
        {    Book *pv = pbeg;
        while(pv) { pv = pv->next; delete pbeg;    pbeg = pv; }}
}

int main ()
{
List b1;
b1.add('Name', 'Author', 100, 1969, 'Marganets');
b1.print;

system ("Pause");
return 0;
}

Благодарю за помощь.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
artsb
Дата 8.2.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



Код

void List::add(char d)
// и
b1.add('Name', 'Author', 100, 1969, 'Marganets');

О_о
Оно хоть компилится...


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 8.2.2010, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



что-то типа:
Код

class Book{
public:
    char name[20];
    char author[20];
    int page;
    int year;
    char place[10];
    Book *next;
    Book *prev;
    Book () {
     next = 0;
     prev = 0;
    }
    Book (char _name[20], char _author[20], int _page,
          int _year, char _place[10], Book *_prev, Book *_next) {
     page = _page;
     year = _year;
     strcpy(name, _name);
     strcpy(author, _author);
     strcpy(place, _place);
     next = _next;
     prev = _prev;
    }
};

class List
{
 Book *pbeg, *pend;
public:
    List() { pbeg = 0; pend = 0; }
    ~List();
    void add(Book *newItem);
    void add(char _name[20], char _author[20], int _page,
             int _year, char _place[10]);
    void print();
};

void List::add(Book *newItem)
{
 if(!pbeg) { pbeg = pend = newItem; }
 pend->next = newItem;
 newItem->prev = pend;
 newItem->next = 0;
 pend = newItem;
}

void List::add(char _name[20], char _author[20], int _page,
               int _year, char _place[10])
{
 Book *newItem = new Book(_name, _author, _page, _year, _place, 0, 0);
 if(!pbeg) { pbeg = pend = newItem; }
 pend->next = newItem;
 newItem->prev = pend;
 newItem->next = 0;
 pend = newItem;
}

void List::print()
{
    Book *pv = pbeg;
    cout << endl << "list:\n\n";
    while(pv) {cout << pv->name << "\n"; pv = pv->next;}
    cout << endl;
}

List::~List()
{
   Book *pv = pbeg;
   while(pv) {
     pv = pv->next;
     delete pbeg;
     pbeg = pv;
   }
}

int main()
{
  List lst;
  lst.add("vasia hello", "vasia", 200, 2005, "456");
  lst.add("ivan hello",  "ivan",  120, 2000, "56");
  lst.add("kolia hello", "kolia", 20,  2015, "6");
  lst.print();
  cout << "\n";
  system("pause");
  return 0;
}


Это сообщение отредактировал(а) artsb - 8.2.2010, 21:46


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Metalex
Дата 9.2.2010, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Код

Book (char _name[20], char _author[20], int _page,
          int _year, char _place[10], Book *_prev, Book *_next) {
     page = _page;
     year = _year;
     strcpy(name, _name);
     strcpy(author, _author);
     strcpy(place, _place);
     next = _next;
     prev = _prev;

а это зачем нужно?  smile 

Это сообщение отредактировал(а) Metalex - 9.2.2010, 10:14


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
artsb
Дата 9.2.2010, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



Цитата(Metalex @  9.2.2010,  10:14 Найти цитируемый пост)
а это зачем нужно? 

ещё один конструктор для удобства. Кстати, он ниже используется.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Albor
Дата 9.2.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(Metalex @  8.2.2010,  20:08 Найти цитируемый пост)
Нужно создать двунаправленный список с помощью классов.

Тогда уж лучше убрать из класса Book  указатели prev и next, так как они к книге отношения не имеют ни какого. Добавить структуру с классическим названием:
Код

struct Node // структура - узел(элемент) списка
{
    Book book;// собственно данные - книга
    Node * pNext;// указатель на следующий узел
    Node * pPrev;// указатель на предыдущий узел
}

И список организовать на основе этих структур. Будет понятнее.

Это сообщение отредактировал(а) Albor - 9.2.2010, 15:24
PM MAIL ICQ   Вверх
bsa
Дата 9.2.2010, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Угу и вместо char[20] использовать std::string - можно будет просто присваивать.
PM   Вверх
Metalex
Дата 9.2.2010, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Огроомная просьба: прокомментируйте вышенаписанный код...


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
artsb
Дата 9.2.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 4
Всего: 64



Цитата(Metalex @  9.2.2010,  15:06 Найти цитируемый пост)
Огроомная просьба

ко мне? что конкретно не понятно? вроде ничего более сложного чем было у вас я не написал.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Albor
Дата 9.2.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(Metalex @  9.2.2010,  15:06 Найти цитируемый пост)
Огроомная просьба: прокомментируйте вышенаписанный код... 

Комментарии добавил. Понял причину? У тебя в классе Book есть данные, которые от него не зависят и им не управляются. Эти указатели нужны списку а для книги они баласт . 

Это сообщение отредактировал(а) Albor - 9.2.2010, 15:32
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.