2014-10-16 3 views
0

단일 링크 된 목록에서 노드 a를 삭제하는 코드를 작성했습니다. 나는이 코드를 테스트했고 결과물은 괜찮습니다. 나는이 코드에서 마지막 "else"블록에 대해 약간 혼란 스럽다. 맞습니까? 내 말은, (p-> ptr) 노드를 해제 한 후에도 옆에있는 노드에 계속 액세스 할 수 있다는 것입니다.이 코드는 연결된 목록에서 노드를 삭제할 수 있습니까?

NODE* delNODE(NODE *HEAD,int position){ 
     int k=1; 
     NODE *p; 
     if(HEAD==NULL){ 
      printf("List Empty\n"); 
      return HEAD; 
     } 

     p=HEAD; 
     if(position==1){ 
      p=HEAD; 
      HEAD=HEAD->ptr; 
      free(p); 
      printf("Success!\n"); 
      return HEAD; 
     } 
     else{ 
      while(k<position-1){ 
       k++; 
       p=p->ptr; 
      } 

      if((p->ptr)==NULL) 
      { 
       printf("NO such position\n"); 
      } 
      else{ 
       free(p->ptr); 
       p->ptr=p->ptr->ptr; 
       printf("Success!\n"); 
      } 
     } 
    return HEAD; 
} 
+0

@pala도 잘못된 것이라고 지내요. –

답변

1

아니요, 괜찮습니다. 이것이 "작동"하는 유일한 이유는 시도한 시간에 메모리 할당자가 사용 가능 상태로 해제 한 메모리를 표시했지만 실제로 덮어 쓰거나 그렇지 않으면 아직 만지지 않았기 때문에 이전의 가치는 여전히 저기 메모리 주소에 있습니다. 이 사실에 항상 의지 할 수는 없습니다. 예를 들어 해당 노드가 특정 페이지에서 마지막으로 할당 된 메모리 조각 인 경우 free() 구현을 중단하여 프로세스의 가상 메모리 테이블에서 해당 노드를 제거하지 못하게하여 다음에 액세스하려고 할 때 세그먼트 위반이 발생합니다.

대신 임시 변수를 사용

NODE * tempnode = p->ptr->ptr; 
free(p->ptr); 
p->ptr = tempnode; 
+0

고마워! 내 의심이 사라져! –

0

할 수 없으며 그렇게해서는 안됩니다. 헤드 노드를 제거하는 두 번째 if 문과 마찬가지로 중간 변수를 사용하십시오.

+0

그러나이 함수를 사용하여 노드를 삭제하고 링크 된 전체 목록을 인쇄하면 출력이 올바른 것으로 출력됩니다. 이유를 설명해 주시겠습니까? –

+0

@ 2ndGenCore_i5 이것은 정의되지 않은 동작입니다. – 2501

+0

귀하의 통찰력에 감사드립니다! –

관련 문제