2014-10-29 3 views
0

while 루프가 끝나기 전에 komv-> next가이 코드에서 어떻게 NULL이 될 수 있습니까? 다음 줄 이후에 NULL이된다는 것을 알아 차리지 못합니다 .-> previous-> next = town-> next 그러나 나는 왜 이런 일이 일어 났는지 이해할 수 없습니다. 세그먼트 화 오류로 인해 프로그램이 종료되었습니다. komv 만약한 포인터의 변경이 다른 포인터에 영향을 미침

komv=list->First; 
     while ((komv->next)!=NULL) 
     {  


      if(town->num>=komv->next->num) 
       { 

        town->previous->next=town->next; 

        if(town->next!=NULL) 
         town->next->previous=town->previous;   
        town->next=komv->next; 
        town->previous=komv; 
        komv->next->previous=town; // gdb say komv->next=NULL 
        komv->next=town;  

        break;     
       } 
      komv=komv->next; 


     } 
+0

도시가 이미 목록 – seinta

+0

이 라인에서 노드) 마지막 반복에서 얻을 : 동안 ((komv-> 다음) = (komv 동안 NULL)이어야한다! = NULL) 다음 현재 링크 된 목록 노드를 기반으로 나머지 루프를 수정하십시오. 다음 노드 'komv = komv-> next'로 이동하십시오. 루프의 끝에서 – user3629249

답변

1

다음 목록에서 town, town->previous == komv 앞의 노드입니다. town이 마지막 노드이면 town->next == NULL입니다. 사람들은 같은 시간에 해당하는 경우,이 :이 경우

   komv->next = NULL; 

목록을 수정할 필요가 없다처럼 보이는, 그래서 당신은 문제를 해결할 수 :

   town->previous->next=town->next; 

는에 감소 조건을

 if ((town != komv->next) && (town->num >= komv->next->num)) { 

으로 수정하여 원하는 가정과 동작에 따라 더 좋은 해결책이 될 수도 있습니다.

town가있다
 if (town->num > komv->next->num) { 
1

내가 생각할 수있는 유일한 조건이되는 경우 : 예를 들어, 노드가 동일한 num을 갖는 대신 이전의, 당신은 단순히이 조건을 사용할 수 있습니다 후 town를 삽입 허용 될 경우 리스트의 마지막 노드는, 당신은

if (town->num >= komv->next->num) // komv is the previous to last element, so komv->next is town. 
{ 
    town->previous->next = town->next; // here, komv->next is changed to NULL. 
    ... 
관련 문제