2016-10-07 2 views
1

목록을 처리하는 동안 생성 된 중복 값을 제거하기 위해이 코드를 사용하면 이 시작되지만이 코드를 사용할 때 세그먼트로 오류가 발생하지 않으면 프로그램이 제대로 실행됩니다. 당신이 q->next->next가 널 포인터가 목록에서 마지막 노드에 두 번째이다 할 때링크 된 목록의 세그먼트 오류 얻기

void remove_duplicate(){ 
    q = start;   //list start has already been created 
    while(q->next){ 
     q=q->next; 
     if(q->id==q->next->id){ //removing duplicate values 
      q->next->prev = q->prev; 
      q->prev->next = q->next; 
     } 
    } 
} 

답변

1
귀하의 문제가이 라인에 거짓말을 할 수

는, 여기 당신이 q->next 요소가 존재 함을 주장 :

while(q->next) 

이제 다음 요소를 할당 귀하의 질문에 대한 연쇄,

q=q->next; 

귀하의 q->nextNULL 수 있습니다 :

if(q->id==q->next->id) 

이동 당신에게 q=q->next; 블록 if에서.

void remove_duplicate(){ 

    q = start->next;  
    if (q==NULL) 
    return -1;  
    while(q->next){ 

    if(q->id==q->next->id){     
     q->next->prev = q->prev; 
     q->prev->next = q->next; 
    } 
    q=q->next; 
    } 
} 
+0

(q-> 다음)은 정확히 동일합니다. 그리고 당신의 픽스는 q-> prev가 아마도 NULL 일 때 바로 충돌 할 것이고 –

+0

에 아마 NULL을 쓰고 싶을 것입니다 ... 지금이 구조체가 어떻게 정의되었는지, 내 픽스가이 특별한 문제를 하나의 점프로 해결할 수는 없습니다. 노드 앞에 –

+0

해결책을 잘못 읽었습니다. 내 의견의 첫 번째 문장은 정확하지 않으며, 두 번째 문장은 그대로 서 있습니다. –

2

은 (q->nextNULL하지 않기 때문에) 당신은 루프 본문을 입력하고 직접 마지막 노드에 q 점을 . 따라서 다음에 q->next을 사용하면 NULL 포인터를 역 참조하고 의 동작은입니다.

명세서의 순서를 바꾸고 마지막에 임무를 지정하십시오.

또는 대신 for 루프를 사용

for (q = start; q->next != NULL; q = q->next){ 
    if ... 
} 
+0

문제가 첫 번째 문장에만 있었음 ...... 감사합니다. –

+0

@ ÐevendraSuthar 허용 된 답을 표시 할 수 있습니다. 이것은 모든 사람이 이것이 솔루션 + 포스터가 자신의 작업에 대한 대변인이된다는 것을 알기 때문에 감사보다 낫습니다. –

0
void remove duplicate() 
{ 
    q=start; 

    while(q->next!=NULL) 
    { 
     if(q->id==q->next->id) 
     { 
     q->next=q->next->next; 
     } 

     q=q->next; 
    } 
} 

그것은 당신을 도울 수 있습니다.

+1

원래 도움이 될만한 이유가 무엇인지 설명했으면 대답이 훨씬 더 쉬울 것입니다. –

+0

여기에서 q는 포인터입니다.이 경우 조건 (q-> next! = NULL)을 가진 요소의 이동을 시작합니다.이 조건에서 이전 노드의 중복 값을 찾을 수 있습니다.prev 코드 while 루프는 우리의 루프가 끝나는 곳에서 완벽하게 정의되지 않고 조건이 맞지만 if 루프 내부에서 –

+0

포인터 q가 노드를 가리키고있는 경우 prev 코드에서 다음 노드의 ID와 다음에 q-> 다음에 다음 노드 (중복 노드)의 주소를 보유하고 다음에 세 번째 노드의 주소를 보유하는 중복 노드의 다음 노드 (q-> next-> q-> next-> next)에 일치하면 이 시점에서 다음 번 포인팅 노드에서 세 번째 노드의 주소를 넣고이 시점에서 중복 노드와 포인팅 노드 사이의 연결을 끊습니다. –