프로그래밍

 3198, 1/160 회원가입  로그인  
   메버리키
   [C++] 아 링크드리스트 지우기 문제,,

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3054 [복사]


위에 노드는
struct node{
       int data;
       node* prev;
       node* next;
       };
이렇게 정의되있고..

void llist::remove(int data){
     node* temp = head->next;
    
     while(temp->next != tail){
                if (temp->data == data){
                               temp->prev->next = temp->next;
                               temp->next = temp->prev;
                               delete temp;
                               return;}
                else {
                     temp= temp->next;
                     }
                     }
     cout << "리스트 내에 그런 데이터가 없습니다." << endl;
}
리무브는 이렇게 정의했는데 지우기가안되네요..

도와주세요...

  Hit : 4509     Date : 2011/06/13 04:28



    
영원한공부 동작 순서에 문제가 있네요.

만약 temp가 현재 가리키고 있는 구조체에 지워야할 데이터가 있고, 아래와 같은 상황이라면

temp           tail
↓            ↓
-------------------     -----------------
ㅣ_______________ㅣ    ㅣ______________ㅣ


temp->next 의 값은 tail과 같기 때문에

while(temp->next != tail) 이 조건에 걸려서 안에 있는 조건문을 실행하지 않겠죠.


지금 함수동작순서가

① temp->next와 tail을 비교

② temp->next와 tail이 다르면 temp->data와 data를 비교

③ 같지 않으면 temp를 다음구조체로 이동

이 순서인데 이걸

① temp->data와 data를 비교

② 같지 않으면 temp를 다음 구조체로 이동

③ temp->next와 tail을 비교

이런식으로 바꾸면 될거에요.
2011/06/13  
영원한공부 밑에 제가 고친 걸 올려놨는데 문제 해결 안 되시면 보세요.




















void llist::remove(int data){
  node* temp = head;

  while(temp->next != tail){
    temp = temp->next;
 
    if (temp->data == data){
      temp->prev->next = temp->next;
      //temp->next = temp->prev; //이부분은 굳이 필요 없는 것 같아요.
      delete temp;
      return;}
  }

  cout << "리스트 내에 그런 데이터가 없습니다." << endl;
}
2011/06/13  
메버리키 감사합니다..
그게 급하게 고친거라서 헷갈렸었는데 어떻게찾아내셨는지..
for(;;) cout << "Good!!";
= 소음공해 어쨋든
그렇게고쳐두되구 temp->next != NULL로 바꿔두 되는것같아요
그리고 temp->next->prev = temp->prev; 이거 해줘야할것같아요..
갑자기 님코드보니까 번뜩하고 생각났어요..감사합니다..
2011/06/13  
영원한공부 메버리키// temp->next->prev = temp->prev; 이걸 잊고 있었네요....
그리고 제가 한 방식보다 님이 말씀하신 temp->next != NULL 이게 더 이해하기 쉬운 것 같아요.
저도 다음에 이걸로 해야겠어요 감사합니다.
2011/06/14