2012-01-03 2 views
6

저는 지금까지 내가 처리 한 프로그램과 비교하여 상당히 복잡한 프로그램을 작성했습니다. 어쨌든 어느 시점에서 구조체 목록을 조작 할 함수를 작성해야합니다. 나는이 질문을 가능한 한 간단하게하려고 애쓰며 그래서 나는 단지 참조 용으로 아주 간단한 코드를 적어 둔다. 여기 재귀 함수에서리스트 노드에 대한 포인터를 편집하려면 어떻게해야합니까?

는 일 : 제 I 유효한 current뿐만 아니라, 0이 값을 갖는 i 함께 제공하는 다른 기능에서 testf 전화에 그 나머지 액세스를 시작하기 전에 testf 약 100 배 자신을 호출된다는 것을 의미 코드의 생성 된 모든 인스턴스 인 testf이 처리되기 시작합니다.

void testf(listnode *current, int *i) { 
    wordwagon *current2; 

    current2 = current; 
    if (*i < 100) { 
    *i = *i + 1; 
    current2 = current2->next; 
    testf(current2, i); 
    } 


    current = current->next; 
    return; 
} 

경우에, 나는, "마지막"testf 기능 (이 기능의 current 인)에 액세스하고 발신자의 current2 값을 편집하기위한 올바른 방법 current = current->next; 내 처분에 충분한 연결리스트 노드입니다 한의 말을하자, 또는 나는 끔찍하게 틀린가? 호출 된 함수 내부에서 호출자 함수의 변수를 변경하고 호출 된 함수가 반환 되 자마자 사라지지 않도록하는 방법은 무엇입니까? 나는 포인터가 작동하는 방법에 대해 잘 이해하는 것이 어렵다고 느낍니다.

중요한 정보를 빠뜨린 것, 또는 제 질문을 명확하게하지 않은 것 같습니다. 그렇다면 알려 주시면 필요한 내용을 편집 할 수 있습니다.

미리 감사드립니다.

+2

당신은 POI를 통과해야 포인터를 돌려 주거나 재현하기 전에'current'를 수정하십시오. –

+0

간단한 예제를 제공하기 위해 +1 –

답변

4

현재, 다시 listnode 포인터를 얻기 위해 함수에 대한 포인터에 포인터를 전달하고이를 derefrence 수는 코드 (컴파일 테스트되지 않음) 그 후 모양을하는 방법입니다 : 여기

void testf(listnode **current, int *i) { // accept pointer to listnode pointer 
    wordwagon *current2; 

    current2 = *current; // retreive pointer value by dereferece 
    if (*i < 100) { 
    *i = *i + 1; 
    current2 = current2->next; 
    testf(&current2, i); // recursively call by reference to the pointer 
    } 

    *current = (*current)->next; /* change the current pointer next pointer, CORRECTED as suggested by Azure */ 
    return; 
} 

학습 포인터에 대한 정말 좋은 문서 목록은 다음과 같습니다

A) http://cslibrary.stanford.edu/102/PointersAndMemory.pdf

b)는 http://cslibrary.stanford.edu/103/LinkedListBasics.pdf

+0

'return' 전에 마지막 줄에 스택에 이중 포인터의 값만 변경하고 있다고 생각합니다. 이것을 시도해보십시오 :'* current = (* current) -> next;' –

+0

@PlatinumAzure, 고맙습니다. – DhruvPathak

+0

괜찮습니다! 나는 항상 그 문제에 익숙해 있었고 디버깅하는 데에는 너무 고통 스럽습니다. –

관련 문제