5

उदाहरण के लिए लिंक किए गए सूचियों के लिए सरल डेटा संरचनाएं, जहां 'अगला' पॉइंटर एक स्मार्ट सूचक है, के कारण स्टैक को उड़ाता है। जब हेड नोड हटा दिया जाता है, तो 'अगली' के लिए स्मार्ट पॉइंटर एक रिकर्सिव डिलीट करता है और करता है। एक लंबी सूची के लिए, यह तेजी से ढेर को उड़ाता है।स्मार्ट पॉइंटर रिकर्सिव डिलीट

मुझे इन स्मार्ट पॉइंटर्स को सरल, कच्चे पॉइंटर्स के साथ बदलने के लिए वापस जाना पड़ा। क्या मुझसे कोई चूक हो रही है?

+0

'स्टैक को उड़ाता है'? क्या आप कृपया विस्तृत कर सकते हैं। – Flexo

+2

लगभग निश्चित रूप से यह स्मार्ट सूचक की गलती नहीं है। हमें कुछ कोड दिखाएं, कार्यान्वयन में एक बग होने के लिए बाध्य है। किसी भी घटना में, पूर्ण सूची हटाना पुनरावृत्ति से नहीं होना चाहिए, इसलिए इसे लगातार स्टैक स्पेस लेना चाहिए। –

+1

@ केरेक: संभवतः, स्मार्ट पॉइंटर का विनाशक पॉइन्टे को हटा देता है, जो पॉइंटी में एक और स्मार्ट पॉइंटर होता है, जो रिकर्सन देगा। मैं नहीं देखता कि इससे बचने के लिए स्मार्ट पॉइंटर कैसे कार्यान्वित किया जा सकता है। –

उत्तर

5

मान लिया जाये कि मैं तुम्हें सही समझ लिया है और दोनों head और next स्मार्ट संकेत कर रही द्वारा इस से बच सकते हैं कर रहे हैं:

head = head->next; 

या समकक्ष। आपका 'पुराना' सिर हटा दिया जाएगा और पुराना दूसरा स्थान आइटम सिर पर प्रचारित हो जाएगा। सभी एक लगातार परिवर्तन में, कोई गहरी रिकर्सन के साथ। इसके लिए केवल एक ही शर्त है कि सिर NULL से शुरू करने के लिए नहीं है।

जैसा कि माइक ने टिप्पणी में बताया कि यदि लक्ष्य पूरी सूची को हटाना है तो आप इसे लूप के भीतर दोहरा सकते हैं।

+3

हां, इसलिए आप पूरी सूची को 'while (head) head = head-> के साथ गैर-पुनरावर्ती रूप से हटा सकते हैं;' –

+1

कोई टिप्पणी नहीं करना चाहिए, क्योंकि कोई आएगा और डब्ल्यूटीएफ जाएगा :) – UncleBens

+0

"आपका पुराना 'सिर हटा दिया जाएगा और पुराना दूसरा स्थान वस्तु सिर पर पदोन्नत हो जाएगी। "- वह कथन, जो हो रहा है उसके प्रतिबिंबित होने पर, एक अविश्वसनीय सरलीकरण है। जब तक कि आरामदायक पाठक भाषा मैकेनिक्स और स्मार्ट-पॉइंटर कार्यक्षमता दोनों में * बहुत * अच्छी तरह से ज्ञात नहीं है, यह समाधान, जबकि यह काम करता है, किसी और चीज़ की तुलना में अधिक जादू है। और अगर वे परिचित कहें, तो उन्हें पहले स्थान पर इसकी आवश्यकता नहीं है। उस सरल 'हेड = हेड-> अगली' असाइनमेंट के दौरान क्या हो रहा है, इसके बारे में एक चरण-दर-चरण यह * काफी * स्पष्ट कर देगा। – WhozCraig

2

एक लिंक किए गए सूची वर्ग के आंतरिक पर स्मार्ट पॉइंटर्स आपको बहुत अधिक खरीदते प्रतीत नहीं होते हैं। कच्चे पॉइंटर्स मेरे लिए बिल्कुल उचित लगता है। मुझे लगता है कि स्मार्ट पॉइंटर्स का उपयोग कम नियंत्रित स्थितियों के लिए सबसे अच्छा होता है जहां कुछ हटाना भूलना आसान होगा।

दिमाग आपको ढेर को उड़ाने के लिए एक बड़ी सूची होनी चाहिए, क्या आप वाकई अपने कोड में कोई बग नहीं रखते हैं?

+0

आंतरिक में स्मार्ट पॉइंटर्स आपको उच्च अपवाद सुरक्षा गारंटी प्राप्त कर सकते हैं। श्रम और बहुत कम अतिरिक्त निरंतर भंडारण लागत के मामले में मुफ्त में। ऐसा लगता है कि यह मेरे लिए लायक है। – Flexo

+0

हां, यह एक उचित बिंदु है। – john

+0

ठीक है, मैं सूची में संलग्न होने से पहले एक नव निर्मित नोड को पकड़ने के लिए एक स्मार्ट सूचक का उपयोग करता हूं। लेकिन, एक बार संलग्न होने पर, यह सूची नोड की विनाशक की ज़िम्मेदारी है। जैसा कि आपने लोगों को नोट किया है, मुझे हाथ से कोडित पुनरावृत्ति के साथ स्वचालित स्मार्ट-पॉइंटर रिकर्सन को प्रतिस्थापित करने के लिए वैसे भी विनाशक में मैन्युअल प्रोसेसिंग करना है। क्या आप अपवाद सुरक्षा मुद्दों पर विस्तृत जानकारी दे सकते हैं। मैंने सोचा कि किसी भी विनाशक में कोई भी अनचाहे अपवाद प्रोग्राम को मार देगा - चाहे स्मार्ट पॉइंटर्स की परवाह किए बिना। – Jay

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