2012-01-03 20 views
6

मैं एक प्रोग्राम है जो कि मैं क्या अब तक के साथ निपटा है की तुलना में काफी जटिल है लेखन की है। वैसे भी किसी बिंदु पर मुझे एक ऐसा फ़ंक्शन लिखना है जो एक स्ट्रक्चर सूची में हेरफेर करेगा। मैं इस प्रश्न को यथासंभव सरल बनाने की कोशिश कर रहा हूं इसलिए मैंने संदर्भ के लिए कोड का एक बहुत ही सरल टुकड़ा लिखा है।मैं रिकर्सन में किसी फ़ंक्शन से सूची नोड में पॉइंटर कैसे संपादित कर सकता हूं?

यहाँ बात है: सबसे पहले मैं एक वैध current के साथ-साथ 0. इस का एक मूल्य के साथ एक i के साथ उपलब्ध कराने के एक और समारोह से testf फोन पर इसका मतलब है कि testf से पहले यह बाकी तक पहुँचने शुरू होता है खुद के बारे में 100 बार फोन करेगा कोड का यह तब होता है जब testf के सभी जेनरेट किए गए उदाहरण हल हो जाएंगे।

void testf(listnode *current, int *i) { 
    wordwagon *current2; 

    current2 = current; 
    if (*i < 100) { 
    *i = *i + 1; 
    current2 = current2->next; 
    testf(current2, i); 
    } 


    current = current->next; 
    return; 
} 

हैं, तो मान लें, मैं अपने निपटान में काफी जुड़ा सूची नोड्स है, current = current->next; "पिछले" testf समारोह पहुँच सकते हैं और फोन करने वाले का current2 मूल्य संपादित करने के लिए (इस समारोह के current है) के लिए सही तरीका है, या मैं बहुत गलत हूँ? अगर मैं कर रहा हूँ, क्या कहा जाता समारोह अंदर से फोन करने वाले समारोह के चर में परिवर्तन करने और सुनिश्चित करें कि वे समारोह रिटर्न कहा जाता है के रूप में के रूप में जल्द दूर नहीं जाना होगा होने के लिए तरीका है? मुझे पॉइंटर्स कैसे काम करते हैं, इस बारे में अच्छी समझ पाने के लिए मुझे बहुत मुश्किल लगता है।

ऐसा नहीं है कि मैं महत्वपूर्ण जानकारी को छोड़ दिया है या मैं स्पष्ट रूप से पर्याप्त मेरे सवाल नहीं पूछा है कि बहुत संभावना है। कृपया मुझे सूचित करें कि अगर ऐसा है तो मैं जो भी आपको चाहिए उसे संपादित कर सकता हूं।

अग्रिम धन्यवाद।

+2

आप एक poi पास करना सूचक को nter, या current' संशोधित 'इससे पहले कि आप से पहले' return' अपने अंतिम पंक्ति में एक सरल उदाहरण –

+0

+1 recurse, मुझे लगता है कि आप केवल ढेर पर डबल सूचक का मूल्य बदल रहे हैं। इसे आज़माएं: '* वर्तमान = (* वर्तमान) -> अगला;' –

उत्तर

4

आप यहाँ समारोह में एक सूचक सूचक पारित कर सकते हैं, और यह derefrence एक listnode सूचक वापस पाने के लिए कोड की तरह उस के बाद (संकलन के लिए परीक्षण नहीं) दिखाई देगा:

void testf(listnode **current, int *i) { // accept pointer to listnode pointer 
    wordwagon *current2; 

    current2 = *current; // retreive pointer value by dereferece 
    if (*i < 100) { 
    *i = *i + 1; 
    current2 = current2->next; 
    testf(&current2, i); // recursively call by reference to the pointer 
    } 

    *current = (*current)->next; /* change the current pointer next pointer, CORRECTED as suggested by Azure */ 
    return; 
} 

यहाँ सीखने संकेत के लिए वास्तव में अच्छा लेख की एक सूची है:

क) http://cslibrary.stanford.edu/102/PointersAndMemory.pdf

ख) http://cslibrary.stanford.edu/103/LinkedListBasics.pdf

+0

प्रदान करने के लिए –

+0

@PlatinumAzure, धन्यवाद, इसे ठीक किया गया। – DhruvPathak

+0

कोई समस्या नहीं! मैं हर समय उसमें दौड़ता था और डीबग करने के लिए ऐसा दर्द होता था। –

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

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