Удаление предметов с дубликатами данных - PullRequest
0 голосов
/ 22 октября 2010

Я пишу функцию, которая удаляет последовательные элементы с дубликатами данных. например Например, переходя в список

-> a-> b-> c-> c-> a-> b-> b-> b-> a-> нуль

должно привести к

-> a-> b-> c-> a-> b-> a-> нуль

Определение элемента списка и описание функции приведены ниже

struct litem { 
char data; 
litem* next; 
}; 

Мо код выглядит как

int remove_dumplicates(litem *&list)
{
 int count = 0; 
 struct litem * current = NULL;
 current = list;
 struct  litem *deleteNode;
 if (current == NULL ) return;
 while(current->next != NULL)
 {
  if ( current->data == current->next->data) // check for the duplicates 
   {
    count++;
    deleteNode =current->next;
    current>next= current->next->next;
    delete deleteNode;
   }      
  return (count);  
 }
}

Это правильный способ достижения желаемого результата?

Ответы [ 5 ]

2 голосов
/ 22 октября 2010

Вам нужно добавить else внутри цикла while, чтобы перейти к следующему узлу:

if( current-> data == current->next->data ) {
....
} else {
    current = current->next;
}

Также должны быть исправлены возвраты (первый должен возвращать 0, а второй должен быть перемещен за пределы цикла while).

2 голосов
/ 22 октября 2010

Я не вижу, как current увеличивается до current->next.

. Возьмем для примера список со всеми уникальными элементами a -> b -> c и посмотрим, как работает ваша программа.

Чтобы это исправить, вам нужно:

while(current->next != NULL) {
   if ( current->data == current->next->data) {
     // delete duplicates .
   } else {
     current = current -> next;
   }
}// end-while
return (count);
1 голос
/ 22 октября 2010

Несколько быстрых наблюдений:

Оператор return (count) может находиться вне цикла while, в противном случае цикл был бы преждевременно завершен.

В цикле while требуется оператор типа current = current->next;.В противном случае цикл стал бы бесконечным циклом.

1 голос
/ 22 октября 2010
  1. current должен перейти к current-> next при отсутствии совпадений.
  2. Аргумент, передаваемый в функцию, должен быть просто * list (т.е. указатель на элемент типа struct litem)
  3. delete - это ключевое слово C ++.Вместо этого используйте free().

Модифицированный код:

int remove_duplicates(struct litem *list)
{
    int count = 0; 
    struct litem * current = NULL;
    current = list;
    struct  litem *deleteNode;
    if (current == NULL ) return;
    while(current->next != NULL)
    {
        if ( current->data == current->next->data) 
        {
            count++;
            deleteNode = current->next;
                current->next= current->next->next;
                    free(deleteNode);
        }
        else
        {
            current = current->next;
        }
    }
    return (count);  
}
0 голосов
/ 22 октября 2010

Попробуйте это:

int remove_duplicates(litem *&list)
{
   int count = 0; 
   struct litem * current = NULL;
   current = list;
   struct  litem *deleteNode;
   if (current == NULL ) return 0;
   while(current->next != NULL)
   {
     if (current->data == current->next->data) // check for the duplicates 
     {
       count++;
       deleteNode =current->next;
       current->next= current->next->next;
       delete deleteNode;
     }
     else
     {
       current = current->next;
     }
   }
   return (count);
 }
...