2016-12-09 20 views
-2

私はcで二重リンクリストを作成しています。二重リンクされた20ノードのtepm2を持っていて、単語を挿入するノードを削除します。二重リンクリストからノードを削除する方法

各ノードにはユニークな単語があります。

printf("\n Enter word to delete : "); 
scanf("%s", &word); 
Delete(word); 

int delete(char data[200]) //unable to delete 
{ 
    if (h == NULL) return; 

    temp2 = next = previous = h; 

    while (temp2->next != NULL) 
    { 
     if ((strcmp(temp2->word, data) == 0)) 
     { 
      if (temp2->prev == NULL) 
      { 
       h = temp2->next; 
       free(temp2); 
       return; 
      } 
      else if (temp2->prev == NULL) 
      { 
       previous->next = temp2; 
       free(temp2); 
       previous->next = NULL; 
       return; 
      } 
      else 
      { 
       previous->next = temp2->next; 
       next->prev = temp2->next; 

      } 
     } 
     temp2 = temp->next; 
    } 
} 

私は言葉のユーザーが

+1

なぜ2つの同じ条件でテストしますか? 'temp2-> prev == NULL)'と 'else if(temp2-> prev == NULL)' – yLaguardia

+0

私はこの削除機能をコピーしましたが、論理を理解できません。 –

+0

あなた自身で書く。 –

答えて

0

これを試して入力し、特定のノードを削除することはできませんされています:私はこれがtemp2 = next = previous = h;

権利であるとは思わないすべての

int delete(const char *data) 
{ 
    struct node *temp = h; 

    if (h == NULL) return; 

    while (temp->next != NULL) 
    { 
     if (strcmp(temp->word, data) == 0) 
     { 
      if (temp->prev != NULL) 
      { 
       temp->prev->next = temp->next; 
      } 
      if (temp->next != NULL) 
      { 
       temp->next->prev = temp->prev; 
      } 
      if (h == temp) 
      { 
       h = temp->next; 
      } 
      free(temp); 
      return; 
     } 
     temp = temp->next; 
    } 
} 
+0

@lanこれは私のために働いていません... –

+1

@UsfNoorそれにはいくつかの理由があります。恐らく、 'h 'が指し示す二重にリンクされたリストは、最初に有効に構成されていないか、削除しようとしている単語がリストに入っていない可能性があります。 –

0

ファーストをここで、あなたがしなければならないのは、あなたが横断することによって削除したいノードを見つけて、そのノードを次のノード、すなわち、(temp2-> prev) - > next = nextそして(temp2-> next)前のそれを解放する。

今、本当の問題は、 1ノードのみ

それを 3.の前に他のノードを持っているあなたがそれらを変換することにより、3つのすべてを簡素化することができ、それ 2.最後のノードの後に​​他のノードを持つ最初のノードであります以前の問題、すなわち私たちが直前に解決した中間の問題のノードに変換します。

簡単にするために、頭と尾を両方ともNULLにすることができます。

関連する問題