2011-11-23 20 views
5

मैं एक लिंक्ड सूची का उपयोग करके एक स्टैक को कार्यान्वित करना चाहता हूं।समस्या निवारण डबल पॉइंटर

मेरे ढेर के लिए पॉप() को लागू करने के लिए, मेरे पास कॉलर एक डबल पॉइंटर (पॉइंटर को पॉइंटर) पास करता है (अंततः) मेरे स्टैक (लिंक की गई सूची में पहली प्रविष्टि) के शीर्ष पर इंगित करता है।

कारण मैं इसे इस तरह से कर रहा हूं क्योंकि इस तरह कॉलर स्टैक पर स्थिर सूचक रख सकता है।

मेरे लिंक्ड सूची तत्व struct:

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 की कोशिश कर रहा तरह है, और * दूसरे किया।

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

या, जैसा कि wallyk टिप्पणी में सुझाव दिया, तर्क भिन्नता एक भी सूचक मिलता है और उसका उपयोग करने के लिए:: आप कोष्ठक का उपयोग करने की आवश्यकता है

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

त्वरित प्रतिक्रिया के लिए धन्यवाद, सही समझ में आता है। – CallMeRex

+1

या तो माता-पिता का उपयोग करें, या स्पष्ट रूप से मध्यवर्ती मान का उपयोग करें, 'संरचना तत्व * sip = * stack;' और '* stack = sip-> अगला;' – wallyk

6

-> उच्च operator precedence अपसंदर्भन से है (*) इस पंक्ति में:

*stack->next 

आप कह रहे हैं:

*(stack->next) 

जो stack->next के बाद से विफल रहता है, यह समझ में नहीं आता है।

आप चाहते हैं:

(*stack)->next 
बजाय

संबंधित मुद्दे