2011-11-23 37 views
5

Bağlantılı bir liste kullanarak bir yığın uygulamak istiyorum.Sorun Giderme Çift İşaretçi

Yığınım için pop() uygulamak için, arayanın yığınının üst kısmına (sonunda listedeki ilk giriş) işaret eden bir çift işaretçiyi (bir göstericiye işaretçi) geçirmesini sağlarım.

Bu şekilde yapmamın nedeni, bu yolla arayanın yığına statik bir gösterici tutmasıdır.

My bağlantılı liste elemanı yapı:

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

pop() uygulaması:

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

Ben sorunu çift pointer ** yığın KQUEUE çalışıyor. , Zihnimde

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

ya * stack-> değeri veya ** stack.value popped_value almak için çalışması gerekir, ancak ben aynı hatayı alıyorum: Bu kod aşağıdaki hata üretir.

+0

Sadece iyi ol ''yığın -> sonraki' kullanın – Kapichu

cevap

8

-> KQUEUE operatörü daha yüksek önceliğe sahiptir, böylece ilk bitmiş olur -> beri dereference stack->value çalışmaya benziyor ve * ikinci yapılır. wallyk Yorum önerilen gibi tek işaretçi almak ve bu kullanmak argüman KQUEUE,

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

Veya:

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

mükemmel bir anlam ifade eder, hızlı yanıt için teşekkürler. – CallMeRex

+1

Ya da parens kullanın ya da açıkça bir ara değer kullanın, 'struct Element * sip = * stack; 've' * stack = sip-> next; ' – wallyk

6

-> çözümleyecek daha operator precedence yüksektir sahiptir (*) Sen parantez kullanmak gerekir Bu satırda:

*stack->next 

Sen diyorsun:

*(stack->next) 

stack->next'dan beri başarısız olanı anlamsızdır.

Sen istiyorum: yerine

(*stack)->next 

.

İlgili konular