2016-04-06 13 views
1

Ich habe eine Liste:
1-2-3-3-4-5-6-6-2-7-8-6-9-10-9-NULL // Vor
ich wnt zu machen, wie folgend:
1-2-3-4-5-6-7-8-9-10-NULL // nach
ich folgenden Code geschrieben haben:

löschen doppelte Elemente in verknüpften Liste

void don(struct node *head) 
{ 
struct node *t,*p,*q; 
t=head; 
p=t->next;//p is to check each node! 
q=t;//q is used to take care of previous node! 
while(p!=NULL) 
{ 
    if(p->data==t->data) 
    { 
     while(p->data==t->data) 
     { 
      p=p->next; 
     } 
     q->next=p; 
     q=q->next; 

    } 
    else 
    { 
     p=p->next; 
     q=q->next; 
    } 
} 
t=t->next; 
if(t!=NULL) 
    don(t); 
} 

Aber die Ausgabe ist:
1-2-3-4-5-6-7-8-6-9-10
Bitte sagen Sie mir, was im Code falsch ist und bitte korrigieren Sie es :).

+0

Eine Sache falsch ist, dass Sie Speicher undicht sind. –

+0

Es sieht so aus, als würden Sie nur nach benachbarten Duplikaten suchen. – interjay

+0

Sie überspringen nur hintereinander Dupes – CarlH

Antwort

1

Versuchen Sie, die folgende Funktion (ohne Prüfung)

void don(struct node *head) 
{ 
    for (struct node *first = head; first != NULL; first = first->next) 
    { 
     for (struct node *current = first; current->next != NULL;) 
     { 
      if (current->next->data == first->data) 
      { 
       struct node *tmp = current->next; 
       current->next = current->next->next; 
       free(tmp); 
      } 
      else 
      { 
       current = current->next; 
      } 
     } 
    } 
} 

Was Ihre Funktion dann auch der Anfang der Funktion ist falsch

void don(struct node *head) 
{ 
struct node *t,*p,*q; 
t=head; 
p=t->next;//p is to check each node! 
//... 

Im Allgemeinen head kann gleich NULL in t sein sein Fall diese Aussage p=t->next; führt zu undefiniertem Verhalten.

EDIT: Wenn die Funktion rekursiv sein muss, dann kann es aussehen die folgende Art und Weise

void don(struct node *head) 
{ 
    if (head) 
    { 
     for (struct node *current = head; current->next != NULL;) 
     { 
      if (current->next->data == head->data) 
      { 
       struct node *tmp = current->next; 
       current->next = current->next->next; 
       free(tmp); 
      } 
      else 
      { 
       current = current->next; 
      } 
     } 

     don(head->next); 
    } 
} 
0

Sie sollten eine verschachtelte während haben:

p= head; 
while(p) 
{ 
    q=p->next; 
    while(q) 
    { 
     if (p->data==q->data) 
      ... //remove 
     q= q->next; 
    } 
    p= p->next; 
} 
Verwandte Themen