2011-11-23 3 views
5

링크 된 목록을 사용하여 스택을 구현하고 싶습니다.더블 포인터 문제 해결

내 스택에 pop()을 구현하려면 호출자가 내 스택 상단 (링크 된 목록의 첫 번째 항목)을 가리키는 이중 포인터 (포인터에 대한 포인터)를 전달해야합니다.

이렇게하는 이유는 호출자가 정적 포인터를 스택에 유지할 수 있기 때문입니다.

내 링크리스트의 요소 구조체 :

struct Element { 
int value; 
struct Element *next; 
}; 

팝업() 구현 :

int pop (struct Element **stack) { 
    int popped_value = *stack->value; 
    *stack = *stack->next; 
    return popped_value; 
} 

내가 가진 문제는 이중 포인터 ** 스택 역 참조에 노력하고있다. 내 마음 속에서

error: request for member ‘value’ in something not a structure 
error: request for member ‘next’ in something not a structure 

중 * stack-> 값 또는 ** stack.value이 popped_value를 검색하는 작업을해야하지만, 나는 동일한 오류가 발생합니다 :이 코드는 다음과 같은 오류가 발생합니다.

+0

그냥 좋은 올 '스택 -> 다음'을 사용하십시오 – Kapichu

답변

8

->은 참조 연산자보다 더 높은 우선 순위를 가지고 있습니다, 그래서 먼저 수행 가져옵니다 -> 이후 역 참조 stack->value하려고처럼, 그리고 *이 두 번째 다. wallyk는 의견 제안 하나의 포인터를 취득하고 사용하기 위해 인수를 역 참조,

int popped_value = (*stack)->value; 
*stack = (*stack)->next; 

또는 :

struct Element *sip = *stack; 
int popped_value = sip->value; 
*stack = sip->next; 
+0

완벽한 응답, 빠른 응답을 주셔서 감사합니다. – CallMeRex

+1

괄호를 사용하거나 명시 적으로 중간 값 인'struct element * sip = * stack;'과'* stack = sip-> next;를 사용하십시오. – wallyk

6

->은 역 참조에 비해 operator precedence 높은있다 (*을) 당신은 괄호를 사용합니다 이 라인 :

*stack->next 

당신은 말하고있다 :

*(stack->next) 

stack->next이 실패한 이후에는 실패합니다.

당신이 원하는 : 대신

(*stack)->next 

.