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

Поиск:

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


Опытный
**


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

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



Так, теперь дошел к почти последнему пункту.
Нужно найти элементы с одинаковым полем матрикель и удалить копию.
Делаю так, что то не так.. :(

Код

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 = root->next; // сл элемент списка

        del = root; //удаляемому элементу присваиваем текущий
        delete del; //удаляем элемент с дублированным полем

        root = root->next; //смотрим сл элемент но про втором проходе первого while 2, при третьем - 3 элемент
    }
}

пасиб
PM MAIL   Вверх
bsa
Дата 18.10.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



конечно не работает.
Я бы на твоем месте разделил на 3 функции. Первая - поиск элементов по заданному полю Matrikelnummer (кстати, кто тебя учит давать переменным/типам немецкие названия? Лучше давать английские). Вторая - удаление указанного элемента. А третья уже - перебор всех элементов с поиском среди оставшихся и удалением подходящих.
PM   Вверх
Killer_13
Дата 18.10.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вах, тяжеловато.. :( Завтра после обеда сдавать... Ниче с утречка проснусь и вперед. smile А то сегодня башка уже совсем не варит... Целый день провозился с этим, книгами, форумом и так д..

На счет названий, то я согласен, но как то так получается, - я учусь сейчас в Германии. Структура уже была задана преподом.
Здесь круто учиться, но тяжело. :(

Это сообщение отредактировал(а) Killer_13 - 18.10.2010, 23:40
PM MAIL   Вверх
bsa
Дата 19.10.2010, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Killer_13 @  19.10.2010,  00:37 Найти цитируемый пост)
Вах, тяжеловато..

тяжеловато сразу делать комплексное решение задачи. проще разбить на подзадачи и уже затем собрать из них решение комплексной.
PM   Вверх
Killer_13
Дата 19.10.2010, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну вот, попробовал заново.
Не получается у меня разбить на подзадачи.
Не понимаю для чего писать ф-цию для удаления если она всего 2 строчки..
Вот что у меня получилось в новом варианте.

Код

void findMatr(Anmeldung* &root){

    Anmeldung* rootPtr1 = root;
    Anmeldung* rootPtr2;
    while(rootPtr1->next != NULL){

        rootPtr2=rootPtr1->next;

        while(rootPtr2->next != NULL || rootPtr2->Matrikelnummer != rootPtr1->Matrikelnummer){
            rootPtr2=rootPtr2->next;
        }

        if(rootPtr2->Matrikelnummer == rootPtr1->Matrikelnummer){
            Anmeldung* del=rootPtr2;
            delete del;
            //rootPtr2->Matrikelnummer = "00000000";
        }

        rootPtr1=rootPtr1->next;
    }
}


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


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


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

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



Цитата(Killer_13 @  19.10.2010,  10:35 Найти цитируемый пост)
Не понимаю для чего писать ф-цию для удаления если она всего 2 строчки

даже если одну, если она отражает конкретное логически полное действие... 
 
вот с какого  перепугу Ваша findMatr чего то удаляет ?!
а где аргумент для сравнения ? или Вы для каждого поиска будете составлять  функцию _findчтототам_ ?!

Добавлено через 1 минуту и 40 секунд
Цитата(Killer_13 @  19.10.2010,  10:35 Найти цитируемый пост)
  Anmeldung* rootPtr1 = root;

слово root означает корневую ветку, а не ту которую вы сейчас исследуете.. 
страйтесь подбирать более правильные названия, чтоб не вводить окружающих в заблуждение..

Добавлено через 3 минуты и 9 секунд
почему у Вас тип Аnmeldung выступает в роли списка ?!

Добавлено через 3 минуты и 40 секунд
Вам задание нужно выполнить на С++ в стиле С ?



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


Опытный
**


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

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



Цитата

а где аргумент для сравнения ? или Вы для каждого поиска будете составлять  функцию _findчтототам_ ?!

по ходу тут я сравниваю, если равно, то удаляю.
if(rootPtr2->Matrikelnummer == rootPtr1->Matrikelnummer){

Цитата

слово root означает корневую ветку, а не ту которую вы сейчас исследуете.. 


да, я ее присваиваю другому указателю и начинаю с него поиск.

Цитата

почему у Вас тип Аnmeldung выступает в роли списка ?!


Аnmeldung - это тип структуры, а какой тип тогда задавать?

Добавлено через 6 минут и 19 секунд
Чуток не понял вопроса на счет выполнения задания, но это типо 1 практикум по с++, так что мы еще не оч много прошли.. :(
PM MAIL   Вверх
mes
Дата 19.10.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Killer_13 @  19.10.2010,  11:05 Найти цитируемый пост)
по ходу тут я сравниваю, если равно, то удаляю.
if(rootPtr2->Matrikelnummer == rootPtr1->Matrikelnummer){

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

Цитата(Killer_13 @  19.10.2010,  11:05 Найти цитируемый пост)
да, я ее присваиваю другому указателю и начинаю с него поиск.

ну так назoвите current_node или просто node
приучайтесь изначально делать красиво, Вам же самим будет удобнее

Цитата(Killer_13 @  19.10.2010,  11:05 Найти цитируемый пост)
Аnmeldung - это тип структуры, а какой тип тогда задавать?

ну я как понимаю у вас  регистрация содержит список заявок, то удобнее будет использовать 
AntragListe которое, и скорее всего не только оно будет включено в структуру Anmeldung.. 
T.e. Anmeldung хранит root от Листа

ну а сам элемент списка желательно должен содержать только одно поле данных... 

итого 
Код

struct Antrag {
  ... 
};

struct AntragListNode
{
      AntragListNode  * next;
      Antrag            data;  // или * data
};

struct Anmeldung
{
    AntragListNode * Antrags;  //Antraege
};

как там лучше под Ваши нужды , сами смотрите и допиливаете...

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


Это сообщение отредактировал(а) mes - 19.10.2010, 12:21


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


Опытный
**


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

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



Спасибо за полезные советы.
структуру Anmeldung изменять нельзя.

По ходу придется сдавать без поиска дубликатов. :( 

Я вас понимаю, что красиво нужно писать код, но разве функция поиска такая уж сложная? Согласен, что имена не те, сейчас поменяю.
Еще раз спасибо, золотой форум, так много всего полезного подсказывают. smilesmilesmile 
PM MAIL   Вверх
mes
Дата 19.10.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Killer_13 @  19.10.2010,  11:27 Найти цитируемый пост)
структуру Anmeldung изменять нельзя.

почему ? такого задание ? 



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


Опытный
**


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

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



Цитата

Цитата(Killer_13 @  19.10.2010,  11:27 Найти цитируемый пост)
структуру Anmeldung изменять нельзя.

почему ? такого задание ? 

да

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


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


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

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



Код

void delete_dublicate_by_field (..)
{
   for (node_t * sample = root; sample; sample = sample->next )
     for (node_t * prev_node  = sample
               , * node = sample->next;
                   node; 
                   prev_node = node
                 , node = node->next )

       if (node->data.field == sample->data.field) 
       {
               node_t * tmp = node;

               prev_node->next = node->next;
               node = prev_node; 
               
               delete tmp;               
       }
}

подправлено под односвязанный список.. 


Добавлено @ 12:41
Цитата(Killer_13 @  19.10.2010,  11:37 Найти цитируемый пост)
да

все время удивляюсь учителям, почему не приучать учеников культуре кода с самого начала ? 
нет же..обязательно надо вдолбить в голову неповоротливые конструкции 90х... 
:(



Это сообщение отредактировал(а) mes - 19.10.2010, 13:05


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


Опытный
**


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

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



пасиб, код испробую

Цитата

все время удивляюсь учителям, почему не приучать учеников культуре кода с самого начала ? 
нет же..обязательно надо вдолбить в голову неповоротливые конструкции 90х... 
:(


Да здесь преподаватели не такие уж и старые, - эт как бы повторение материал из "с" - неее, я считаю, что здесь мне дают действительно знания, СИСТЕМА ЗАСТАВЛЯЕТ учиться, я могу сказать так потому, что закончил в Украине 2 разных заведения, колледж и универ.
PM MAIL   Вверх
mes
Дата 19.10.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



если у вас односвязанный список, то в цикле еще придется держать предыдущую node.. 
подправил в пред посте.. 


Это сообщение отредактировал(а) mes - 19.10.2010, 13:05


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


Опытный
**


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

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



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

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

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

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

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


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

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


 




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


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

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