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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск и удаление эл. св. списка с одинаковым полем 
V
    Опции темы
xvr
Дата 19.10.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Безотносительно к тому, что вам тут уже рассказали (и правильно рассказали), вот ошибки в вашей первоначальной программе:
Код

void delKnot(Anmeldung* &root) { // передается ссылка на указатель на первый эл
    Anmeldung* del; //рег указатель на удаляемый элемент
    if (root == 0) 
        cout << "Die Liste ist leer" << endl;
    while (root->next != NULL) { // Начинаем проверку цыкл работает до последнего элемента в списке на котором стоит заглушка NULL
        string temp = root->Matrikelnummer; //переменной temp присваиваем значение первого поля по которому ищем
        while (root->next != NULL || root->Matrikelnummer != temp) //проверяем весь список, пока не найден такой элемент или пока не закончился список
//!!! Условие заданно неверно - должно быть root->next != NULL && root->Matrikelnummer != temp
//!!! Собственно логика тоже не верна - надо искать ВСЕ совпадающие, и удалять. У вас ищется только ПЕРВЫЙ совпадающий элемент, и удаляется уже ВНЕ цикла
            root = root->next; // сл элемент списка
//!!! Нельзя тут использовать root - вы по нему перебираете в охватывающем цикле. Нужна отдельная переменная

//!!! Прежде, чем удалять root не плохо было бы проверить, что он не NULL (если в цикле на нашли дубликатов)
        del = root; //удаляемому элементу присваиваем текущий
        delete del; //удаляем элемент с дублированным полем
        root = root->next; //смотрим сл элемент но про втором проходе первого while 2, при третьем - 3 элемент
//!!! Неверно. Нельзя брать root->next - вы этот root удалили в предыдущей строке (и то, что вы скопировали поинтер в del сути дела не меняет)
    }
}


PM MAIL   Вверх
Killer_13
Дата 19.10.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вы наверное сильно разозлитесь, но не идет, вот - переделал...

Код

void findMatr(Anmeldung* &root){

   for (Anmeldung * sample = root; sample; sample = sample->next )
     for (Anmeldung * node = node->next; node; node = node->next )
       if (node->Matrikelnummer == sample->Matrikelnummer)
       {
             Anmeldung * tmp = node;
             node=node->next;
             delete tmp;
       }
}

PM MAIL   Вверх
mes
Дата 19.10.2010, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



в том посте уже подправленный пример под односвязанный список


--------------------
PM MAIL WWW   Вверх
Killer_13
Дата 19.10.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



xvr - пасиб огромнейшее, дык что я там правильно написал? Там 75% неправильно. :(
Наверное придется терроризировать преподавателя, пусть ищет ошибку.
PM MAIL   Вверх
bsa
Дата 19.10.2010, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Killer_13, вот о чем я говорил:
Код
Anmeldung* findMatrikelnummer(Anmeldung* node, const string &mn) { //поиск в списке по полю Matrikelnummer
   for(; node; node = node->next)
     if (node->Matrikelnummer == mn)
       break;
   return node;
}

void delNode(Anmeldung* &root, Anmeldung *node) { //удаление node из списка, если node == root, то root меняется на node->next
   for(Anmeldung *t = root, p = 0; t; p = t, t = t->next) {
       if (t == node) {
           if (p)
              p->next = node->next;
           else
              root = node->next;
           delete node;
           break;
       }
   }
}

void delKnot(Anmeldung* root) { //удаление дубликатов по полю Matrikelnummer
   for(Anmeldung *node = root; node; node = node->next)
      if (Anmeldung *t = findMatrikelnummer(node->next, node->Matrikelnummer))
         delNode(node->next, t);
}

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


Опытный
**


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

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



Что ж господа "тру программисты", большой вам поклон за помощь.
Млин смотрю на код, и все прекрасно понимаю, все просто, а у меня вечно ошибки лезут. :(
Показал недавно свою (нашу) программу, посмотрел как сделали другие.smile оказывается у меня думалка хоть правильно настроена. smile

Многому научился, только жаль, препод посмотрел 10 мин и все. smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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