2012-03-18 5 views
0

그래서 주변 목록에서 주위를 둘러 보려고하고 목록에있는 각 노드에 "서수"값을 추가하기로했습니다. 이 방법으로, 나는 가치보다는 서수에 의해 삭제할 수 있으며 나중에 다른 멋진 것들을 할 수 있습니다.연결된 목록 서수 재설정

목록에서 요소를 삭제할 때 모든 서수는 뻔뻔 스럽습니다 (즉, 분명함). 그래서 나는 "다른 기능으로 목록을 실행하고 서수의 ". 기술적으로 삭제 된 요소에서이 함수를 시작할 수 있으며 이전 노드를 그대로 유지해야하므로 시간을 절약하기 위해 해당 노드의 서수로 전달할 수 있습니다.하지만 지금은 그렇게 덜 우아하게 설명하고 있습니다.

"귀하의 질문은 무엇입니까?" 네가 그걸 물어볼 줄 알았어! "그걸로 잡아라!" 네가 그렇게 말할 줄 알았어!

여기에 링크하거나 포함 할 수있는 테스트 프로그램은 5 개의 노드 목록을 만들고 3 번째 노드를 제거한 다음 끝에 노드를 추가합니다. 여기에, 그래서 DEBUG: resetting ordinals: 1 2 4 5 5

, 어떤 속히 내 질문 : DEBUG: resetting ordinals: 0 1 2 3 4

실제 출력은 다음과 같습니다

예상 출력은 왜 내 기대와 다른 실제 출력이는?

void ll_fix(node_t* list) 
{ 
    node_t* root = list; 
    int ordinal = 0; 
    printf("DEBUG: resetting ordinals: "); 
    while(list->next != NULL) 
    { 
    list->ordinal = ordinal; 
    list = (node_t*)list->next; 
    printf("%d ",list->ordinal); 
    ordinal++; 
    } 
    printf("%d\n",list->ordinal); 
    list = root; // rewind the list 
} 
+0

좋은 지적, 예상 출력 편집 (코드는 복사 붙여 넣기이므로 실제 코드입니다). –

답변

2

변경하기 전에 서수를 인쇄하고 있습니다. 이전 값을 볼 수 있습니다.

아마해야합니다

list->ordinal = ordinal; 
printf("%d ",list->ordinal); 
list = (node_t*)list->next; 
ordinal++; 

이 비록 마지막 값이 변경되지 않습니다, 더 나은 수정은 다음과 같습니다

while(list != NULL) { // as per wildplasser comment, I moved the check to the beginning 
    list->ordinal = ordinal; 
    printf("%d ",list->ordinal); 
    ordinal++; 
    list = list->next; 
} 
+0

좀더 자세히 살펴보면, "list-> ordinal"과 "ordinal"을 인쇄하고 있습니다. 나는 그러한 혼란을 피하기 위해 변수를 다르게 명명해야한다고 생각합니다. –

+0

'list-> ordinal'을 인쇄하기 전에 다음 예제로 이동하십시오. – MByD

+0

@ChrisBrowne 당신은'list'를 변경하고 있으므로'list-> ordinal'은 방금 설정 한 것이 아닙니다. +1, 잘 보였다. – cnicutar

1

당신은, 서수 및 인쇄 설정 사이

목록 포인터를 이동
while(list->next != NULL) 
{ 
    list->ordinal = ordinal; 
    list = (node_t*)list->next; 
    printf("%d ",list->ordinal); 
    ordinal++; 
} 

잘못된 값을 인쇄하고 있습니다. list이 지역 변수이기 때문에 "목록을 되감기"하는 것은 불필요합니다. 함수 외부의 어떤 것에도 영향을 미치지 않습니다.

list = root; // rewind the list 
+0

참조로 전달되었으므로 되감기가 불필요합니다. –

+0

아니요, 참조로 노드가 아니라 값으로 포인터를 전달하고 있습니다. 따라서 노드를 수정할 수는 있지만 전달 된 포인터는 수정할 수 없습니다. –

+0

네 말이 맞아. 포인터 별 값. 내 코드에서 "되감기"비트를 안전하게 제거 할 수 있습니다. 감사! –

0

당신은 while 루프 테스트에 next을 위해 그것을 역 참조하기 전에 NULL에 대한 list을 확인하지 않습니다. 세그먼트 화 오류가 발생할 수 있습니다. 나는 이런 식으로 뭔가를 할 것이다 :

while(list != NULL) 
    { 
    list->ordinal = ordinal; 
    printf("%d ",list->ordinal); 
    ordinal++; 
    list = list->next; 
    } 

이 당신에게 출력을 제공한다 : 당신은 확인된다

DEBUG: resetting ordinals: 0 1 2 3 4 
0

-> 다음 포인터를 현재 요소를 확인해야합니다 동안.

void ll_fix(node_t *list) 
{ 
    node_t *tmp; 
    int ordinal = 0; 
    printf("DEBUG: resetting ordinals:"); 
    for (tmp=list; tmp; tmp = tmp->next) 
    { 
    tmp->ordinal = ordinal++; 
    printf(" %d", tmp->ordinal); 
    } 
    printf("\n"); 
}