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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите спроектировать класс 
:(
    Опции темы
Гость_Leksey
Дата 7.4.2005, 18:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мне необходимо создать связанный список. Хочу реализовать его объектом.
Имеется класс узел:
class Node
{
public:
Node *prev;
Node *next;
CSprite *dat;
Node(CSprite *tempor)
{
dat=tempor;
next=0;
prev=0;
}
};
и собственно, класс, реализующий связанный список
class List
{
public:
Node *pbeg, *pend;
//function & variable members for links
List()
{
pbeg=0; pend=0;
}
//functions-members
void add(CSprite *tmp);
bool remove(Node *cur);
void show();
//end links
};
Есть функции добавления узла, удаления, вывода всего списка.
Мне нужно еще сделать так, чтобы при удалении узла он заменялся бы связанным списком.
Поясняю:
был список:
List1: x->y->z y удалили, при удалении y на его место должен встать объет List2: a->b->c
List1: x->a->b->c->z
Я так понимаю объект класса List который будет всавляться надо хранить в классе node, а List описывается после Node, поэтому в Node нельзя хранить указатель на List.
Конечно тут все мутно описано, но кто разберется в моей задаче, прошу помочь. Может быть вообще у меня подход неправильный к решению этой задачи?

  Вверх
Void
Дата 7.4.2005, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата
Может быть вообще у меня подход неправильный к решению этой задачи?

Если есть возможность использовать STL (нет, ну вдруг на BC++ 3.1 это пишется), то да. std::list чем не устраивает?
Код

#include <list>
...
// тип списка
typedef std::list<CSprite*> List;
// тип итератора (указателя на элемент в списке, грубо говоря)
typedef List::iterator iter_t;
...
List List1, List2;
iter_t a;
...
// удалить из списка элемент a
iter_t pos = List1.erase(a);
// вставить содержимое List2 вместо удаленного элемента
List1.insert(pos, List2.begin(), List2.end());

Об удалении объектов CSprite надо заботиться отдельно.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Dray
Дата 7.4.2005, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

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



Код

Node* RemoveAndAdd (List *list, int NodeToDel)
{
   Node *buf = pbeg, buf2 = 0, buf3 = 0;
   for (int i = 0; i < NodeToDel; i++)
      buf = buf->next;
   buf2 = buf->prev;
   buf3 = buf->next;
   buf2->next = list->pbeg;
   buf2->next->prev = buf2;
   buf3->prev = list->pend;
   buf3->prev->next = buf3;
   return buf;
};

buf потом можно удалить(delete RemoveAndAdd(...)). Я правильно понял?

Это сообщение отредактировал(а) Dray - 7.4.2005, 21:13


--------------------
忍者

user posted image
PM MAIL   Вверх
Lekseich
Дата 10.4.2005, 09:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Последний вариант подходит, но у меня основная проблема - что первый параметр должен определяться автоматически (в зависимости от номера удаляемой цепочки). Как это реализовать?
  Вверх
Dray
Дата 11.4.2005, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

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



Цитата(Lekseich @ 10.4.2005, 09:18)
Последний вариант подходит, но у меня основная проблема - что первый параметр должен определяться автоматически (в зависимости от номера удаляемой цепочки). Как это реализовать?

Что-то я не понимаю, что новый список не должен передаваться в пвраметре? Какие вообще параметры должны быть в этой функции?

Цитата
List описывается после Node, поэтому в Node нельзя хранить указатель на List.

Можно. Если написать перед классом Node такую штучку:
Код

class List;



--------------------
忍者

user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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