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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка узла в список по индексу 
:(
    Опции темы
knut
Дата 16.1.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день.
У меня такой вопрос.
Как вставить узел в список по индексу?
Код

void Add_Node(int position,cList value, cList *node){//???}



--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
_hunter
Дата 16.1.2007, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



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


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Daevaorn
Дата 16.1.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Пробегать от начала списка и считать элементы, когда встретишь нужный номер - вставляй новый
PM MAIL WWW   Вверх
knut
Дата 16.1.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

нихт не понял. вставить куда?

вставить надо в список.


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
zkv
Дата 16.1.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



по крайней мере надо знать что такое cList 

PM MAIL   Вверх
knut
Дата 16.1.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

по крайней мере надо знать что такое cList 

не понял а что это значит?


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
zkv
Дата 16.1.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(knut @  16.1.2007,  11:31 Найти цитируемый пост)
не понял а что это значит? 

smile объявление класса cList надо, ты показал, что тебе нужна функция
Цитата(knut @  16.1.2007,  11:03 Найти цитируемый пост)
void Add_Node(int position,cList value, cList *node){//???}

но чтобы ее реализовать, надо знать что из себя представляет cList
PM MAIL   Вверх
_hunter
Дата 16.1.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



Цитата(knut @  16.1.2007,  11:23 Найти цитируемый пост)
вставить надо в список.

что это за список (его организация)
Цитата(knut @  16.1.2007,  11:31 Найти цитируемый пост)
не понял а что это значит?

это значит что нужно знать что такое cList (судя по названию это самоклепный класс). так же это значит что кроме автора класса (и возможно справки) этого никто не знает: например в моем самоклепном классе bList вставка узла по индексу осуществляется функцией Delete(void).
и я так и не понял проблемы: функцию для втавки ты знаеш, ее параметры тоже. что мешает ее использовать?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
knut
Дата 16.1.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

class cList
{
public:
    typedef struct Node
    {
        int val;
        Node *prev;
        Node *next;
    }*NODE;
private:
    Node head,tail;
public:
    cList();
    ~clist();
public:
    void Add_Begin(cList var);
    void Add_End(cList var);
    void Add(int position,cList var);
};

Add_Begin(cList var) and Add_End(cList var) писать не буду (не кого не удевлю я этим) а вот теперь как собственно  реализовать Add(int position,cList var)
т.е вставка в список по индексу


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
_hunter
Дата 16.1.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



ааа... т.е. тебя алгоритм интересует? -- так бы сразу и говорил...
делается это очень легко -- проходиш последовательно по всем елементам (начиная с первого) и увеличиваеш счетчик. когда он == индексу (или индексу+-1 (зависит от реализации)) делаеш:
 -- запоминаеш куда-нить следующий елемент
 -- перекидываеш его (текущего елемента) *next на вставляемый елемент
 -- вставляемому ставиш *prev на текущий елемент
 -- запомненому "следующему" ставиш  *prev на вставляемый елемент
 -- вставляемому елементу ставиш *next на запомненый "следующий"
все...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
knut
Дата 18.1.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



что за проблемма не пойму делаю так вдоди все должно работать  smile 
Код

void cList::Add_By_Index(int ipos, int var){

    cList::ndd *root = head;
    while (root->next != NULL || ipos != index){        
        root = root->next;
        index++;
    }
    if(root->next){
    cList::ndd* Add_object = new cList::ndd; 
    Add_object = var;
    temp = root;
    root->next->prev = Add_object;
    Add_object->prev = temp->prev;
    Add_object->next = temp;
    index++;
    }
    else{
        Add_End(int var); 
    }




--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
zkv
Дата 18.1.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



а index это что такое, где сбрасывается, и зачем в конце увеличивается?

что то страшное здесь происходит
Цитата(knut @  18.1.2007,  15:46 Найти цитируемый пост)
   root->next->prev = Add_object;
    Add_object->prev = temp->prev;
    Add_object->next = temp;

что типа этого должно быть наверное:
Код

Add_object->next = temp->next;
Add_object->prev = temp;
temp->next->prev = Add_object;
temp->next = Add_object;

PM MAIL   Вверх
knut
Дата 18.1.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



zkv, а что не так в коде?


--------------------
Цитата

Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
PM MAIL   Вверх
zkv
Дата 18.1.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(knut @  18.1.2007,  18:52 Найти цитируемый пост)
zkv, а что не так в коде? 

ну давайте посмотрим,
судя по этой строчке:
root->next->prev = Add_object;
я понял, что вы хотите вставить Add_object в список после root
объект с адресом root условно назовем A, Add_object - B, а root->next - С. требуется выстроить их в цепочку A-B-C. 

Что имеем сейчас (состояние объектов на 11 строке вашего кода):
Цитата(Состояние 1)

A.next указывает на C
A.prev указывает куда то куда и надо, менять не нужно

B.next указывает в никуда
B.prev указывает в никуда

C.next указывает куда то куда и надо, менять не нужно
C.prev указывает на A

после строки root->next->prev = Add_object; (root->next  соответствует C, помните мы договорились  smile те C.prev теперь указывает на Add_object, те на B) описываем состояние:
Цитата(Состояние 2)

A.next указывает на C
A.prev указывает куда то куда и надо, менять не нужно

B.next указывает в никуда
B.prev указывает в никуда

C.next указывает куда то куда и надо, менять не нужно
C.prev указывает на B

далее строка  Add_object->prev = temp->prev; Так, здесь была моя ладья smile, 
temp == root (судя по 11 строке вашего кода) что в свою очередь соответствует A,
Add_object соответствует B получаем:
Цитата(Состояние 3)

A.next указывает на C
A.prev указывает куда то куда и надо, менять не нужно

B.next указывает в никуда
B.prev указывает туда куда должен указывать A.prev

C.next указывает куда то куда и надо, менять не нужно
C.prev указывает на B
 
ну и завершаем выстраивание строкой Add_object->next = temp; те B.next указывает на A. Смотрим:
Цитата(Состояние 4)

A.next указывает на C
A.prev указывает куда то куда и надо, менять не нужно

B.next указывает на A
B.prev указывает туда куда должен указывать A.prev

C.next указывает куда то куда и надо, менять не нужно
C.prev указывает на B
 
а хотелось бы получить:
Цитата(Желаемый результат)

A.next указывает на B
A.prev указывает куда то куда и надо, менять не нужно

B.next указывает на C
B.prev указывает на A

C.next указывает куда то куда и надо, менять не нужно
C.prev указывает на B
 
Видите разницу, приведенный мною код я уж не буду комментировать, посмотрите сами, что происходит. 
  Удачи!
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.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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