2017-01-01 1 views
2
나는 연결리스트의 역을 인쇄 할 수있는 방법에 검색 한

에 링크 된 목록을 인쇄하고 난 문제는 내가 어디 부분을 이해하지 못하는 것입니다기능은 역순으로

/* Function to reverse the linked list */ 
void printReverse(struct node* head) 
{ 
    // Base case 
    if (head == NULL) 
     return; 

    // print the list after head node 
    printReverse(head->next); 

    // After everything else is printed, print head 
    printf("%d ", head->data); 
} 

이 코드 조각을 발견 NULL을 가리키는 마지막 포인터에 도달하고 역순으로 링크 된리스트를 출력하는 방법.

답장을 보내면 무엇이 단계별로 단계별로 진행됩니까? 또는 다른 것? 이해가 안 돼서 도와주세요.

+0

재귀가 작동하는 방법을 조사해야한다 –

+1

'}' 함수가 끝나면 함수가 반환되고, 노드가 NULL이면 아무 것도 인쇄하지 않고 반환합니다. –

+0

'LIFO' 구조화 된 연결 목록이 작동 할 수 있습니다 ... – RoadRunner

답변

2

이것은 재귀 함수입니다. 재귀 함수는 변수를 실행 스택에 푸시함으로써 작동합니다. 실행 순서는 스택에 푸시 된 순서의 역순으로 스택에서 팝됩니다. 이것은 printReverse의 모든 실행이 값을 인쇄 할 때까지 마지막 실행이 먼저 실행 된 다음 이전 실행이 이전에 실행된다는 것을 의미합니다.

+0

... 꼬리 재귀로 변환하는 것이 더 좋습니다. – 0andriy

0

이것은 재귀 함수입니다. 말하자면, 그것은 스스로를 호출합니다. 먼저 기능을 실행하면

, 그것은 머리 가리키는, 그리고 머리가 데이터 e를 포함하는 항목입니다 :

은 이제 귀하의 예제 데이터로 순서 example을 사용하자. 이 필드에는 데이터 x을 포함하는 항목 인 next 속성이 있습니다. 따라서 head == NULLFalse이고 if 문은 실행되지 않습니다.

이 함수는 자체의 두 번째 복사본을 호출하여 목록의 다음 항목 (x 포함)을 가리 킵니다. 여기에는 next 속성이 있는데 이는 a을 포함하는 항목입니다. 그런 다음 함수는이 항목과 함께 자체의 세 번째 복사본을 호출하고 마지막 점 에 도달 할 때까지 계속 호출하고 해당 항목의 next 속성으로 복사본을 호출합니다. 즉 NULL 입력으로

이 복사본은 if 문법으로 인해 return에 해당하므로이 함수는 호출 한 함수 (이 경우에는 위의 수준 자체의 복사본)에 적용됩니다. 그런 다음이 복사본은 중단 된 위치에서 계속 실행되며 printf("%d ", head->data);을 실행합니다.이 경우 e을 인쇄합니다. 그런 다음 함수 본문에서 빠져 나와 호출 한 함수에 return이 전달됩니다. 이 함수 사본은 head->data 값이 l이며 위와 같이 인쇄됩니다. 따라서 원래 함수 호출이 될 때까지 체인을 백업하고 첫 번째 e을 인쇄 한 다음 호출 한 함수로 돌아갑니다.

희망적이라 생각합니다. 재귀에 대한 가장 우수하거나 가장 우아한 설명이 아니라는 것을 알고 있습니다. 그러나 재귀가 어떻게 작동하고 얼마나 유용한지를 정확히 설명하는 것이 혼란 스럽다면 많은 자료가 있습니다.

-1

짐 로저 스는 머리에 못을 꽂습니다. 그러나 이중 연결 목록을 사용하면 생활을 매우 쉽게 할 수 있습니다.

예를 들어 항목 (노드)에 이전 항목과 다음 항목을 각각 가리키는 이전 및 다음 구성원이 있습니다. 그러면 필요한 것보다 더 "난독 화"된 코드가 필요하지 않습니다.이 역으로 이동하게

+0

이 답변은 질문의 의미와 아무런 관련이 없습니다. 왜 그런 식으로 작동하고 반대 방향으로해야하는지, 그리고 여기에 관심이없는 프로그래밍 습관에 대해 비난하고 있습니다. –

+0

LOL! 따라서 단일 링크 목록 (및 그 반전)의 맥락에서, 자연 대안의 사용에 대한 몇 가지 친숙한 조언 인 이중 연결 목록은 아무 소용이 없습니다. BTW, 검색을 역순으로하거나 링크 된 목록의 항목을 실제로 교환해야하는 경우 메모리가 심각하게 제한되지 않는 경우 이중 연결된 데이터 구조가 권고 옵션입니다. BTW, 나는 당신이 내가 데이터 구조 라기보다는 "관례"에 대해 이야기하고 있다고 생각하는 방식을 좋아한다. – cdcdcd

+0

reLOL! 이 훈련은 재귀 함수 호출에 관한 것이지 이중 링크리스트에 관한 것이 아닙니다. 더블 링크드리스트를 사용하면 어느 방향 으로든 트래버스 할 수 있지만, 질문은 무엇이 반환 문장인가? 또는 다른 무엇입니까? _ 그 뒤로 거슬러 올라가는 가장 좋은 연결된 목록 구현은 무엇입니까 _ –

0

것은 자체에 재귀 호출 후 printf() 전화 을 가지고 입니다.

당신은

void printNormal(struct node* head) 
{ 
    // Base case 
    if (head == NULL) 
     return; 

    // Before all, we print this node info. 
    printf("%d ", head->data); 

    // print the rest of the list after this node 
    printReverse(head->next); 

} 

에서와 같이 두 통화를 교환하는 시도 할 수 있습니다 그리고 당신은 목록의 앞으로 인쇄를 얻을 수 있습니다.

이렇게 설명 된 임무는 입니다. 기본 사례은 무한 재귀를 피하는 것입니다. 목록의 끝은 특별하다. printReverse() 함수를 입력 할 때 검사를 할 수 있으므로 빈 목록의 특별한 경우를 다룰 수 있거나 호출 할 때마다해야한다. (호출하기 전에 검사를해야한다. 그 안의 함수와 재귀 함수를 호출하는 코드 (처음에 넣는 편이 낫다.)