0

データが重複している連続したアイテムを削除する関数を書いています。例:リストを渡す

-> a-> b-> c-> c-> a-> b-> b-> b-> a-> null

結果として

-> a-> b-> c-> a-> b-> a-> null

リスト項目の定義と関数宣言を以下に示します。

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

Moコードは次のようになります

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);  
 }
}

これは、望ましい結果を達成するための正しい方法ですか?

4

5 に答える 5

2

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);
于 2010-10-22T13:47:10.613 に答える
2

次のノードに進むには、whileループ内にelseを追加する必要があります。

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

また、戻り値を修正する必要があります(最初の戻り値は0を返し、2番目の戻り値はwhileループの外に移動する必要があります)。

于 2010-10-22T13:48:16.860 に答える
1
  1. 重複する一致がない場合、currentはcurrent->nextに移動する必要があります。
  2. 関数に渡される引数は、単に* list(つまり、struct litem型の要素へのポインター)である必要があります。
  3. deleteC++キーワードです。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);  
}
于 2010-10-22T13:53:18.713 に答える
1

いくつかの簡単な観察:

ステートメントがループのreturn (count)外側にある可能性がありwhileます。そうでない場合、ループは途中で終了します。

ループ内にはのようなステートメントcurrent = current->next;が必要です。whileそうしないと、ループは無限ループになります。

于 2010-10-22T13:53:54.377 に答える
0

これを試して:

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);
 }
于 2010-10-22T13:54:59.170 に答える