2013-05-26 6 views
0
typedef struct slist *LInt; 

typedef struct slist{ 

int value; 
LInt next; 
}Node; 

void reverse(LInt *l){ 

LInt tail; 
if(*l){ 
    tail=(*l)->next; 
    reverse(&tail); 
    snoc(&tail,(*l)->value); 
    free(*l), 
    *l=tail; 
    } 
} 

주 :이 함수는 다음과 같이 호출합니다. reverse (& l); (l은 "LInt l"입니다) snoc이하는 일은리스트의 마지막 링크에 값을 넣는 것입니다.포인터 주소를 전달하는 링크 된 목록 반전

제 질문은 왜 함수를 호출 할 때 "l"의 주소를 전달해야합니까? 그리고 역방향 헤더에 "LInt * l"이있는 이유는 무엇입니까? 내가 통과 한 주소에 대한 포인터입니까?

어리석은 질문이고 문법적 오류 (영어는 제 모국어가 아닙니다)를 작성하면 죄송합니다.

미리 감사드립니다. (함수를 호출 할 때 우리는 "L"의 주소를 통과해야 할 이유는 무엇입니까?)

+1

경고를 켜십시오. 'reverse'는'LInt'을 받아들이고'LInt * '를 전달합니다. 같지 않아. – StoryTeller

답변

0

대답 한

기능 reverse()는 원래 목록을 변경한다고 가정한다. 그러나 함수에 대한 배열이 아닌 입력은 inputs이고 값으로 전달됩니다. 원래 l에는 영향을주지 않습니다. 따라서 l을 변경하려면 주소reverse()으로 전달하십시오. 이렇게하면 이 l이있는 곳을 알고 있기 때문에 l을 변경할 수 있습니다. (역의 헤더에 "린트 * 리터"가 이유?)

대답이

참조 응답 1. reverse 요구 변화에 영향을 미칠하기 위해 유형 LInt주소를 알 수 있습니다.

예 : 당신은 보풀이 다음과 같은 '다음'을 지정하지 않는 이유

typedef struct slist *LInt;    

그게 전부 구조체의 포인터로 타입 정의의 보풀을 정의

int x,y; // 2 non-array variables. 
y = f(x); // X does not change. You expect y to change. 
g(&x);  // After g() is done, the value of x may have changed. 
      // Of course, the _address_ of x, being what you passed to g(), did not change. 
0

; 구조. 당신이 '다음 매개 변수 린트 * 리터를 통과

typedef struct slist LInt; 

로 형식 정의 정의했습니다한다면

유효합니다. 당신은 구조 포인터를 전달하고 있습니다.

으로 typedef 당신이 작은 이해하기 쉬운 데이터 유형 (동의어없는 새)

하는 것은 다음과 같이 정의 고려 만들 수 있도록하는 것입니다 : 당신이 새 목록을 정의 할 때

typedef struct slist LIST; //i prefer this mostly 
    typedef struct slist * LIST_PTR; 

그래서 당신을 혼동하지 않습니다.

LIST *head; //creating a pointer - Head of linkedlist 
    LIST_PTR head;