2016-04-06 10 views
1

リストがあります:
1-2-3-3-4-5-6-6-2-7-8-6-9-10-9-NULL //前
私は次のようにそれを作るためにWNT:

リンクリストの重複する要素を削除

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

1-2-3-4-5-6-7-8-9-10-NULL //
た後、私は次のコードを書かれています

出力は:
1-2-3-4-5-6-7-8-6-9-10
コードに間違っていると教えてください:)。

+0

ことの一つは、あなたがメモリをリークしているということです以下の方法を見ることができます。 –

+0

隣接する重複をチェックしているようです。 – interjay

+0

あなたは連続した詐欺だけをスキップしています – CarlH

答えて

1

は(テストなし)次の関数あなたの関数については

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

を試してみて、関数のも、初めは間違っている

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

一般に、headは、NULLに等しくてもよい彼の場合、このステートメントp=t->next;は未定義の動作になります。

EDIT:関数は再帰的でなければならない場合、それは間違って

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

あなたがネストされている間持っている必要があります。

p= head; 
while(p) 
{ 
    q=p->next; 
    while(q) 
    { 
     if (p->data==q->data) 
      ... //remove 
     q= q->next; 
    } 
    p= p->next; 
} 
関連する問題