연결된 목록으로 버블 정렬에 문제가 있습니다. 몇 시간 동안 간단한 코드에서 버그를 발견하지 못했습니다. 저것 좀 볼래?연결된 목록 및 (알파벳순) 버블 정렬
int listSwapWithNext(node_t **_list, size_t first)
{
node_t *pointer = *_list;
node_t *ptr_b;
node_t *ptr_c;
node_t *ptr_d;
if(!first)
ptr_b = pointer;
for(size_t i = 0; pointer->next->next; i++, pointer = pointer->next)
{
if(i == first - 1 || first == 0)
{
if(first)
ptr_b = pointer->next;
ptr_c = ptr_b->next;
ptr_d = ptr_c->next;
if(first)
pointer->next = ptr_c;
else
*_list = ptr_c;
ptr_c->next = ptr_b;
ptr_b->next = ptr_d;
break;
}
}
return 0;
}
그것은 (라인 229)이 충돌이 발생합니다 :
(I 수동으로 모든 경계 케이스를 테스트하기 때문에, 그러나 잘 작동하는 것 같다)int listSort(node_t ** _list)
{
int size = listSize(_list);
for(int i = 0; i < size; i++)
{
node_t *pointer = *_list;
for(int j = 0 ; j < size - 1; j++)
{
if(strcmp(pointer->title, pointer->next->title) > 0)
listSwapWithNext(_list, j);
pointer = pointer->next;
}
}
return 0;
}
여기 스왑 기능입니다
정렬 함수의 내부 루프 condyition을 다음과 같이 수정했습니다.
for(int j = 0; j < size - 1 && pointer->next; j++)
나쁜 주소에서 읽는 것을 막기 위해, 나는 이상한 것을 알아 차렸다. 내부 루프 somtimes 정확하게보다 한 번만 실행해야합니다.
감사합니다.
편집 : 다음은 수정 된 것 (printf와 함께 만든()) 내부 루프에 방지 조건 내 디버그 지표와 정렬 기능의 버전 :
int listSort(node_t ** _list)
{
int size = listSize(_list);
int i;
for(i = 0; i < size; i++)
{
node_t *pointer = *_list;
int j;
for(j = 0 ; j < size - 1 && pointer->next; j++)
{
if(strcmp(pointer->title, pointer->next->title) > 0)
listSwapWithNext(_list, j);
printf("# %d %d\n", i, j);
pointer = pointer->next;
}
printf("\n");
}
return 0;
}
여기 콘솔의 결과입니다. 보세요, 매 사이클마다 그렇게하지 않아서 나쁜 정렬을 가져옵니다.
EDIT2 : 여기에 문제의 essention의 . http://pastebin.com/e5K6C1A2
여전히이 문제를 해결할 수 없습니다.
한 눈부신 문제는 ptr_c' 다음>'ptr_d = ptr_c-에서 초기화되지 않은 사용되는'입니다'. 첫째, 목록을 성공적으로 반복 할 수 있습니까? 다음으로, 이것은'head/tail' 또는'circular' linked-list입니까? (코드에서 '원형'목록으로 보입니다). 다음으로'bubble-sort'에 대한 내부 루프를 살펴보면,'j'는'j = 0'보다는'j = i'에서 일반적으로 실행됩니다 (그러나 이것은 구현 정의되어 있습니다). 컴파일 할 수있는 샘플 입력으로 검증 가능한 예제를 게시하십시오. 또한 ** 경고 **로 컴파일해야합니다 (예 :'-Wall -Wextra'). 마지막으로 스크린 샷이 필요 없습니다. 충돌이 무엇인지 알 수 있습니다. –
ptr_c는 위의 줄에서 초기화됩니다. 예. 모든 정렬 순간에 목록을 반복 할 수 있습니다 (올바른 노드 수와 함께). 나는 일정한 경계를 가진 버블 정렬의 간단한 경우를 구현했다. 현재 나는 게시물을 편집하고 콘솔 결과로 작은 샘플 코드를 추가했습니다. 이제는 컴파일 할 수있는 필수 코드를 준비 중입니다. – Madras
연결 목록의 유형이 무엇인지 알 수 없습니다. 그것은 내 자신의 생각을 구현 한 것입니다. 아마도 그것은 원형 일 것입니다. – Madras