2012-07-20 9 views
5

को क्रैश करने का कारण बनता है। मुझे कुछ होमवर्क में एक अजीब त्रुटि आ रही है जिसने मुझे एक लिंक की गई सूची के साथ एक ढेर बना दिया है। मेरे कार्यक्रम में सभी कार्य पूरी तरह से काम करते हैं, यहां तक ​​कि शुरुआत में भी जब मेरे पास कोई नोड्स नहीं है, या कुछ हटाने के बाद। लेकिन जब मैं नोड्स बना देता हूं और उन्हें हटा देता हूं तो मैं शून्य पर वापस आ जाता हूं, फिर हर फ़ंक्शन क्रैश का कारण बनता है। मैंने समस्या का शोध करने की कोशिश की है, लेकिन जो समाधान मैंने पाया है, वह लगभग समान है जो मुझे पहले से मिला है, इसलिए स्पष्ट रूप से कुछ महत्वपूर्ण है जिसे मैं नहीं देख रहा हूं।मेरी लिंक्ड-सूची नोड हटाने का कार्य मेरे प्रोग्राम के अन्य हिस्सों को

यहाँ नोड हटाने समारोह (एक मैं इस सब में दोषी संदेह है)

void remove(node** root) 
{ 
    node* temp = *root; 
    node* previous = 0; 
    if(*root) 
    { 
     while((*root)->next) 
     { 
      previous = *root; 
      *root = (*root)->next; 
     } 
     delete *root; 
     *root = temp; 
     if(previous) 
     { 
      previous->next = 0; 
     } 
    } 
    else 
    { 
     std::cout<<"cannot delete items from empty list\n"; 
    } 
} 

यहाँ है नोड डालने समारोह

void insert(node** root) 
{ 
    node* temp = *root; 
    if(*root) 
    { 
     while((*root)->next) 
     { 
      (*root) = (*root)->next; 
     } 
     (*root)->next = new node; 
     (*root)->next->data = getnum(); 
     (*root)->next->next = 0; 
     *root = temp; 
    } 
    else 
    { 
     (*root) = new node; 
     (*root)->data = getnum(); 
     (*root)->next = 0; 
    } 

} 

मैं काफी यकीन है कि मुद्दा है हूँ कोड में कहीं भी मैंने लिंक किया है, लेकिन अगर ऐसा नहीं है, तो यहां पूर्ण असाइनमेंट http://pastebin.com/AWtG4qjD

+1

मुझे कुछ भी गलत नहीं दिख रहा है। जब आप इसे valgrind के तहत चलाते हैं तो यह क्या करता है? स्टाइल समस्याएं: अपने पुनरावृत्ति चर के रूप में '* root' का उपयोग न करें, यह भ्रमित है। विशेष रूप से ऐसा न करें जब आपको इसे अपने पुनरावृत्ति के बाद मूल मान पर रीसेट करने की आवश्यकता हो। और ** विशेष रूप से ** उस मूल मूल्य को "temp" न कहें (यह अस्थायी कुछ भी नहीं है, यह वास्तविक सूची संशोधित की जा रही है!)। इसके अलावा: आप अंत में डालने या हटाने के अंत तक क्यों चल रहे हैं? सूची को विपरीत क्रम में क्यों स्टोर न करें और लगातार समय पर सिर पर सीधे काम न करें? –

+0

यह एक असाइनमेंट का हिस्सा है। आपने जो सुझाव दिया है वह चीजों को करने का एक बेहतर तरीका है, लेकिन चूंकि यह मेरी पहली लिंक्ड सूची असाइनमेंट है, मुझे संदेह है कि मुझे इसे बेहतर तरीके से सीखने में मदद करने के लिए एक जानबूझकर जटिल तरीका करने के लिए कहा जा रहा है। मैं वास्तव में एक सुंदर नया प्रोग्रामर हूं, इसलिए मैंने वास्तव में साफ और साफ दिखने वाले कोड को कैसे किया है, इसलिए स्टाइल सलाह की बहुत सराहना की गई है। उसी नोट पर, मुझे वास्तव में पता नहीं है कि वाल्ग्रिंड क्या है, लेकिन मैं इसे गुगल कर रहा हूं और यह दिलचस्प लगता है – kamstack

उत्तर

5

remove कार्यान्वयन सुधार नहीं है सीटी। मान लें कि सूची में एक तत्व है। इस मामले में अस्थायी delete *root; निष्पादित करने के बाद अस्थायी "गैर-मौजूदा स्मृति" को इंगित करेगा, हालांकि आप जो कर रहे हैं वह *root = temp; इस तरह से आप रूट को अमान्य नोड पर इंगित करते हैं। और यह अजीब व्यवहार बाद में संभव तरीके से अपने कार्यान्वयन सही बनाने के लिए कारण बनता है:

void remove(node** root) 
{ 
    //TODO: your code here 
    node* temp = *root; 
    node* previous = 0; 
    if(*root) 
    { 
     while((*root)->next) 
     { 
      previous = *root; 
      *root = (*root)->next; 
     } 
     delete *root; 
     if(previous) 
     { 
      *root = temp; 
      previous->next = 0; 
     } 
     else { 
      *root = NULL; 
     } 
    } 
    else 
    { 
     std::cout<<"cannot delete items from empty list\n"; 
    } 
} 

लेकिन मैं जड़ सूचक .Define के साथ कुछ इटरेटर सूची पुनरावृति और साथ अंत देखने के लिए आपको सलाह डॉन `t इसे बदलने के बजाय * रूट

+0

जो समस्या है, आपकी टिप के लिए एक गुच्छा धन्यवाद! – kamstack

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