2011-11-23 11 views
5

Chciałbym zaimplementować stos przy użyciu połączonej listy.Podwójny wskaźnik dereferencji po dereferencji

Aby zaimplementować pop() dla mojego stosu, mam wywołujący przekazać podwójny wskaźnik (wskaźnik do wskaźnika), który (ewentualnie) wskazuje na szczyt mojego stosu (pierwszy wpis na liście połączonej).

Powodem, dla którego robię to w ten sposób, jest to, że w ten sposób osoba dzwoniąca może trzymać wskaźnik statyczny na stosie.

Moja powiązana element listy struct:

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

pop() Realizacja:

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

Problem mam próbuje dereference podwójnego wskaźnika ** stosu. Ten kod wygeneruje następujący błąd:

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

W moim umyśle, albo * stack-> wartość lub ** stack.value powinno działać, aby pobrać popped_value, ale pojawia się identyczny błąd.

+0

Po prostu użyj dobrego "" stosu -> następnego " – Kapichu

Odpowiedz

8

-> ma wyższy priorytet niż operator dereference tak, jakby próbując dereference stack->value od -> odmacha pierwszy, drugi i * zrobić. Trzeba użyć nawiasów:

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

lub, jak wallyk sugerowane w komentarzach, nieprawidłowego argumentu, aby uzyskać pojedynczy wskaźnik i używać:

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

ma sens, dzięki za szybką reakcję. – CallMeRex

+1

Albo użyj parens, albo jawnie użyj wartości pośredniej, 'struct Element * sip = * stack;' i '* stack = sip-> next;' – wallyk

6

-> ma wyższy operator precedence niż wyłuskania (*) w tym wierszu:

*stack->next 

mówisz:

*(stack->next) 

Który nie działa od stack->next nie ma sensu.

Chcecie:

(*stack)->next 

zamiast.

Powiązane problemy