2017-02-20 13 views
-2

Проблема: У меня есть .txt-файл, содержащий несколько номеров, и мне нужно поместить эти цифры в порядок, а также удалить любые дубликаты. Я сделал функцию для их упорядочения (она работает). и в настоящее время я работаю над процессом удаления.C++, как перенести связанный список при удалении дубликатов

Я не уверен, как сделать так, чтобы он пробежал весь список. Потому что, если первые два числа равны 0, он удаляет только первый, а затем завершает работу.

Во всяком случае, это то, что я до сих пор для моей функции удаления:

void deleteDuplicate(Node*& head) // head is the list with the ordered numbers 
{ 
    Node* tmpPtr; 
    Node* delPtr; 

    if (head == nullptr){ 
    return; 
    }else if (head->data == head->next->data){ 
    delPtr = head; 
    head = head->next; 
    delete delPtr; 
    }else{ 
    tmpPtr = head; 
    delPtr = head->next; 

    while (delPtr != nullptr && delPtr->data != delPtr->next->data){ 
     delPtr = delPtr->next; 
     tmpPtr = tmpPtr->next; 
    } 
    if (delPtr != nullptr){ 
     tmpPtr->next = delPtr->next; 
     head = head->next; 
     delete delPtr; 
    } 
    } 
    } 
+2

Правильный инструмент для решения таких проблем является ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/).Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Вам разрешено просто не вставлять дубликаты? – user4581301

+0

Рассматривая это с другой стороны, вы, вероятно, не хотите реализовывать функцию таким образом. Скорее всего, у вас есть функция удаления, которую вы уже тестировали и знаете, работает. Если вы не рассматриваете возможность создания и тестирования. Просто повторите один раз и вызовите уже существующую функцию удаления для каждого удаляемого узла. – user4581301

ответ

0

В поставленном исходном коде, функция deleteDuplicate() показывает два недостающих деталей в анализе. Выбрав удаление первого узла в случае дубликатов, необходимо обновить ссылку на первый узел.

Вместо удаления первого узла, в связанном списке, его легче удалить второй узел маршрутизации первого узла к третьему узлу.

Отсутствует анализ 1 - второй, если условие должно быть сливаться с общим состоянием.

Корпус if (head->data == head->next->data) можно объединить, удалив узел head->next вместо узла head.

Просто удалите вторую, если условие:

if (head == nullptr){ 
    return; 
} 
// to be managed in the else condition 
//else if (head->data == head->next->data){ 
// delPtr = head; 
// head = head->next; 
// delete delPtr; 
//} 
else{ 

Отсутствует анализ 2 - удалить второй узел во всех случаях дублей.

Для удаления второго узла, сравнить как tmpPtr->data и delPtr->data вместо delPtr и delPtr->next.

Заменить следующий While-цикл:

while (delPtr != nullptr && delPtr->data != delPtr->next->data){ 
    delPtr = delPtr->next; 
    tmpPtr = tmpPtr->next; 
} 

К сильным раствором, а контур:

while ((tmpPtr != nullptr) && (delPtr != nullptr) 
     && (tmpPtr->data != delPtr->data)){ 
    delPtr = delPtr->next; 
    tmpPtr = tmpPtr->next; 
} 

Затем к удалению, не изменяют head узел:

if (delPtr != nullptr){ 
    tmpPtr->next = delPtr->next; 
    // not needed when deleting the second node 
    //head = head->next; 
    delete delPtr; 
} 

Bonus - добавление do-while для изучения всего связанного списка, один вызов deleteDuplicate() позволяет удалить все дубликаты !!!

Вот полный deleteDuplicate() функция:

void deleteDuplicate(Node*& head) 
{ 
    Node* tmpPtr; 
    Node* delPtr; 

    if (head == nullptr){ 
     return; 
    } 
    else{ 
     do { 
      tmpPtr = head; 
      delPtr = head->next; 

      while ((tmpPtr != nullptr) && (delPtr != nullptr) 
        && (tmpPtr->data != delPtr->data)){ 
       delPtr = delPtr->next; 
       tmpPtr = tmpPtr->next; 
      } 
      if (delPtr != nullptr){ 
       tmpPtr->next = delPtr->next; 
       delete delPtr; 
      } 
      // explore all the linked list 
     } while (delPtr!=nullptr); 
    } 
} 
Смежные вопросы