2013-08-29 5 views
0

내 코드는 연결된 목록의 시작 부분에있는 요소에는 작동하지만 중간 또는 끝에있는 요소에는 작동하지 않습니다. 당신의 도움을 주셔서 감사합니다!이중 연결 목록에서 요소 제거

void remove(){ 
    if (!head) 
     printf("\nNo nodes to delete. List is empty."); 
    else{ 
     int n; 
     struct node* help = head; 
     printf("Enter an element to delete: "); 
     scanf("%d", &n); 
     if(head->data == n){ 
      help-> next->prev = 0; 
      head = help -> next; 
     } else{ 
      while(help -> next){ 
       if(help -> data == n){ 
        help -> next -> prev = help -> prev; 
        help -> prev -> next = help -> next; 
       } 
       else help = help -> next; 
      } 
     } 
    } 
} 
+0

'remove()'의 매개 변수로 'n'을 사용하지 않는 이유는 무엇입니까? –

+0

@ 의미 - 문제 왜 사람들은 항상 제기 된 질문에 답하는 대신 코드를 선택합니까? 귀하의 질문은 문제와 관련이 없으며 게시 된 코드는 게시자가 실제 프로젝트에 실제로 작성한 방식이 아닌 SO에 게시하기 위해 단순화 될 수 있습니다. – xaxxon

+0

@shail이 어떻게 실패했는지에 대한 구체적인 예를 보여 주면 도움이 될 것입니다. 코드에 많은 문제가있어 코드를 다시 작성하지 않고 모두 지적하기가 어렵습니다 (SO에서 수행하면 안 됨) – xaxxon

답변

1

먼저 NULL을 의미하는 NULL을 0으로 사용하십시오. C에서, 당신은해야합니다. C++에서는 선택 사항이지만 질문 C로 태그를 붙였습니다.

help-> next->prev = 0; 

두 번째 요소가 있는지 확인하지 마십시오. 목록에 하나의 요소 만 있으면이 작업이 실패하므로 첫 번째 요소에는 항상 작동하지 않습니다.

 while(help -> next){ 
      if(help -> data == n){ 

이것은 당신이 일단 당신이 목록을보고 중지 이후로, 마지막 요소를 삭제에서 당신을 중지합니다 (그러나 당신은 처리 전) 마지막 요소를. 그러나, 당신은하지 않았다하더라도, 다음 줄은 :

   help -> next -> prev = help -> prev; 
       help -> prev -> next = help -> next; 

이 후 다른 요소가 있다는 것을 확인 아니에요 이후는, 마지막의 경우 충돌이 발생할 것입니다.

또한 화살표 -> 전후의 공백은 거의 없습니다. 나는 더 이상 그렇게하지 않을 것을 제안합니다.

+0

이러한 문제를 지적 해 주셔서 감사합니다. 내 코드를 수정하려고 노력할 것이다. – Shail

+0

help-> next-> prev = NULL;을 실행하기 위해 if 조건을 추가해야합니까? (next가 null이 아닌 경우에만 실행해야합니다) 또한 while while (help)로 while while 조건을 변경해야합니까? while 루프 내부에서 코드를 변경하는 방법을 알 수는 없습니다. – Shail

+0

@Shail 예. 많은 조건이있을 것입니다. – xaxxon

0
struct node *head, *tail; //global head & tail 

int delete_item() { 
    int del_data = 0; 
    struct node *item = head, *tmp; 
    scanf("%d", &del_data); 
    while(item){ 
     if(item->data == del_data){ 
      tmp = item; 
      if(item->next){ 
       //it's not tail 
       item->next->prev = item->prev; 
      } 
      else { 
       //it's tail 
       tail = item->prev; 
       if(tail) 
        tail->next = NULL; 
      } 
      if(item->prev){ 
       //it's not head 
       item->prev->next = item->next; 
      } 
      else { 
       //it's head 
       head = item->next; 
       if(head) 
        head->prev = NULL; 
      } 
      //free memory 
      free(tmp); 
     } 
     //move forward 
     item = item->next; 
    } 
return 0; 
} 
+2

사람들을 위해 숙제를하는 것은 눈살을 찌푸리게합니다. – xaxxon

+1

그가이 코드를 이해하려고한다면 모든 것이 잘 될 것입니다. 그렇게 말하지 마라. – someuser