2016-12-09 3 views
-2

Ich arbeite an doppelt verknüpften Liste in c, ich habe eine doppelt verknüpfte tepm2 mit 20 Knoten und ich möchte den Knoten löschen, dessen Wort Benutzer einfügen.Wie lösche Knoten aus doppelt verknüpften Liste in c

struct node 
{ 
    struct node *prev; 
    char word[100]; 
    int repeatTime; 
    struct node *next; 
}*h, *temp, *temp1, *temp2; 

Jeder Knoten hat ein eindeutiges Wort.

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

ich nicht in der Lage bin, den bestimmten Knoten zu löschen, den Benutzer Wort eingeben

+1

Warum testen Sie für zwei identische Bedingungen? 'if (temp2-> prev == NULL)' und 'else if (temp2-> prev == NULL)' – yLaguardia

+0

Ich hatte diese Löschfunktion kopiert, aber ich kann es nicht verstehen Logik .. –

+0

Besser wegwerfen und versuchen Sie es schreibe dein Eigenes. –

Antwort

0

Try this:

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 das funktioniert nicht für mich ... –

+1

@UsfNoor Es könnte mehrere Gründe dafür geben. Vielleicht ist die doppelt verknüpfte Liste, auf die mit "h" gezeigt wird, nicht gültig konstruiert, oder vielleicht ist das Wort, das Sie löschen möchten, nicht auf der Liste! –

0

Zunächst einmal glaube ich nicht das Recht temp2 = next = previous = h;

Jetzt müssen Sie nur noch den Knoten finden, den Sie löschen möchten, und dann den Knoten prev mit dem nächsten Knoten verknüpfen, zB (temp2-> prev) -> next = next und (temp2-> next) -> prev = vorh und befreie es.

nun das eigentliche Problem liegt bei 1. Des erste Knoten, die anderen Knoten hat, nachdem es 2. letzten Knoten, die anderen Knoten hat es vorhergehenden 3. nur Knoten

Sie können alle drei vereinfachen, indem sie die Umwandlung in das frühere Problem, dh Knoten im mittleren Problem, das wir gerade gelöst haben.

Zur Vereinfachung können Sie den Kopf und den Schwanz beide NULL machen.

Verwandte Themen