2014-06-13 5 views
-2
node *rever(node *root) 
{ 
node *prev = NULL; 
node *xnew = NULL; 

    while (root != NULL) { 

    xnew = malloc(sizeof(root)); 
    xnew->value = root->value; 
    xnew->next = prev; 

    prev = xnew; 
    root = root->next; 
    } 



    return xnew; 
} 

안녕하십니까,이 링크드 리버스 기능을 작성했습니다. 그러나 그것은 작동하지 않습니다 (빈 응답) : 나는 이전 인덱스가 덮어 쓰기 때문이라고 생각합니다. 누군가 나에게 무슨 일이 일어 났는지 설명 할 수 있을까? 나는 인터넷에서 작동 코드를 찾을 수 있지만 내가 뭘 잘못하고 있는지 알고 싶어. 정말해야링크 된 목록 C의 반전 C

감사

+1

알고 싶다면 - 디버거를 사용하십시오. –

+0

새로운 목록을 만들어야합니다. 목록을 제자리에서 되돌리고 새 목록을 만들지 않아도됩니다. –

+0

"이 질문은 더 이상 재생할 수 없거나 간단한 인쇄상의 오류로 인해 발생했습니다." 코드가 올바르다. (orig리스트를 따라 가다가 새로 할당 된 노드를 사용하여 스택에 항목의 사본을 푸시한다. 단지 malloc이 잘못되었다.) – Kaz

답변

0
xnew = malloc(sizeof(root)); 

sizeof(*root) — 당신은 구조의 크기가 포인터가 아닌 크기로 지적 메모리 블록을합니다. 결과적으로 할당 된 포인터 크기 블록을 지나서 메모리에 앉아있을 때 어떤 것을 덮어 쓰게 될 가능성이 높아지며 결과적으로 causing demons to fly out of your nose에 이르기까지 포함될 수있는 undefined behavior이 발생합니다.

3

올바른 것으로 보입니다. 내가 보는 한 가지 문제 : sizeof(root)sizeof(node*)과 같습니다. 즉, 노드에 대한 포인터를위한 충분한 공간입니다.

실제 node 구조체에는 충분한 공간이 필요합니다. 따라서 malloc sizeof(*root) 바이트 (또는 sizeof(node), 동일 함).