Saturday 15 February 2014

c++ - Double-linked-list insert item algorithm flawed -


मैंने एक डबल-लिंक्ड-लिस्ट लिखी है:

  वर्ग दुगुना {निजी: क्लास sublink {निजी: चार डेटा [30]; Sublink * next_ptr; Sublink * previous_ptr; दोस्त दुगुना; }; सार्वजनिक: sublink * first_ptr; दोगुना () {first_ptr = NULL;}; शून्य add_item (चार * आइटम); शून्य rm_item (चार * आइटम); };   

समस्या सूची में एक आइटम जोड़ने के लिए कार्य के साथ है:

  शून्य दोगुना :: add_item (char * item) {sublink * new_data; Sublink * n_insert; Sublink * p_insert; New_data = नया sublink; N_insert = नया sublink; P_insert = नया sublink; If (first_ptr == NULL) {strcpy (new_data- & gt; डेटा, आइटम); New_data- & gt; पिछला_पिटर = नल; New_data- & gt; अगली_पीटर = प्रथम_पीटर; First_ptr = new_data; } Else {strcpy (new_data- & gt; डेटा, आइटम); N_insert = first_ptr; जबकि (1) {n_insert = n_insert- & gt; अगली_पीटर; अगर (n_insert == NULL) तोड़; यदि (strcmp (n_insert- & gt; डेटा, new_data- & gt; डेटा) & gt; = 0) {new_data- & gt; next_ptr = n_insert; N_insert- & gt; previous_ptr = new_data; }} P_insert = first_ptr; जबकि (1) {p_insert = p_insert- & gt; अगले_पीटर; अगर (p_insert == NULL) तोड़; अगर ((strcmp (p_insert- & gt; डेटा, new_data- & gt; डेटा)) & lt; 0) {new_data- & gt; previous_ptr = p_insert; P_insert- & gt; next_ptr = new_data; }}} Std :: cout & lt; & lt; प्रथम_पीटीआर- & gt; डेटा & lt; & lt; '\ N'; Std :: cout & lt; & lt; New_data- & gt; डेटा & lt; & lt; '\ N'; अगर (new_data- & gt; next_ptr! = NULL) std :: cout & lt; & lt; New_data- & gt; अगली_पीटीआर- & gt; डेटा & lt; & lt; '\ N'; }   

उपरोक्त कोड वर्णमाला क्रम में सूची में दिए गए आइटम को सम्मिलित करता है new_data- & Gt; अगली_पत- & gt; डेटा , न तो प्रथम_प्रविष्ट-> gt; अगली_िपटर- & gt; डेटा । तो बयान यदि (new_data-> gt; next_ptr! = NULL) हमेशा सच है, और नहीं होना चाहिए।

क्या कोई इस कार्यक्रम के साथ समस्या को देखता है?

आपको संभवतः एक पिछले या अगले ptr को null में सेट करने के लिए भूलने से मिलता है।

यहाँ मैंने तर्क को थोड़ा तय किया और सीगफॉल्ट से छुटकारा दिलाया (मैंने जितनी अच्छी तरह से जांच की, मैंने प्रत्येक मामले की जांच करनी है):

  #include & lt; iostream & gt; #include & lt; string.h & gt; कक्षा दोगुनी हो गई {निजी: वर्ग sublink {निजी: चार डेटा [30]; Sublink * next_ptr; Sublink * previous_ptr; दोस्त दुगुना; }; सार्वजनिक: sublink * first_ptr; दोगुना () {first_ptr = NULL;}; शून्य add_item (चार * आइटम); शून्य rm_item (चार * आइटम); }; शून्य दोगुना :: add_item (चार * आइटम) {sublink * new_data; New_data = नया sublink; Strcpy (new_data- & gt; डेटा, आइटम); // खाली सूची केस अगर (first_ptr == NULL) {// सूची में केवल आइटम, मेरे पास कोई अगला या पिछले तत्व नहीं है new_data- & gt; previous_ptr = NULL; New_data- & gt; next_ptr = NULL; // इस तत्व को सूची बिंदु बनाओ first_ptr = new_data; } Else {sublink * iter; Iter = first_ptr; // 1 तत्व सूची अगर (आईटीआर- gt; अगली_पत == नल) {// मैं पहले और एकमात्र नोड के बाद हूं (यदि स्ट्रिंगएम (आईटीआर-> डेटा, नया_डेटा- & gt; डेटा) & lt; = 0) { Iter- & gt; next_ptr = new_data; New_data- & gt; पिछला_पिटर = इटर; New_data- & gt; next_ptr = NULL; } // मैं पहले और एकमात्र नोड से पहले हूं और इससे पहले कि मैं पहली बार नया हो गया (iter- & gt; previous_ptr = new_data; New_data- & gt; अगली_पीटीआर = इटर; First_ptr = iter; }} // 2 + तत्व सूची else {// यह पहली बार कभी भी अशक्त नहीं है क्योंकि रिक्त सूची केस ऊपर का ख्याल रखता है (आईटीआर! = नल) {// क्या मुझे वर्तमान नोड से पहले डाला जाना चाहिए? यदि (एसआरसीएमपी (आईटीआर- & gt; डेटा, नया_डेटा- & gt; डेटा) & gt; = 0) {// पहले नोड केस अगर (आईटीआर-> gt; पिछला_पटल == नल) {new_data- & gt; पिछले_पीटर = नल; New_data- & gt; अगली_पीटीआर = इटर; Iter- & gt; पिछला_पत = नया_डेटा; First_ptr = new_data; } // मध्यवर्ती नोड मामले और अगर (आईटीआर-> gt; अगली_पीटी! = नल) {iter- & gt; पिछला_पिटर-> gt; next_ptr = new_data; New_data- & gt; पिछला_पत = आईटीआर-> gt; पिछला_िप्रर; New_data- & gt; अगली_पीटीआर = इटर; Iter- & gt; पिछला_पत = नया_डेटा; } // अंतिम नोड केस else {iter- & gt; next_ptr = new_data; New_data- & gt; पिछला_पिटर = इटर; New_data- & gt; next_ptr = NULL; } टूटना; } // अगला नोड iter = iter-> next_ptr पर जाएं; }}} // सूची मुद्रित करें std :: cout & lt; & lt; "सूची:" & lt; & lt; std :: endl; Sublink * printer = first_ptr; जबकि (प्रिंटर! = नल) {std :: cout & lt; & lt; '\ T' & lt; & lt; प्रिंटर- & gt; डेटा & lt; & lt; std :: endl; प्रिंटर = प्रिंटर- & gt; अगले_पीटर; } Std :: cout & lt; & lt; std :: endl; } Int main (int argc, char * argv []) {दोगुनी डी; चार आइटम [30] = "ब्लॉ ब्ला ब्ला \" "; चार आइटम 2 [30] = "मेह \ 0"; चार आइटम 3 [30] = "अहाह्ह्ह्ह्ह \ 0"; चार आइटम 4 [30] = "दिनमिम्मम \ 0"; d.add_item (आइटम); d.add_item (ITEM2); d.add_item (ITEM3); d.add_item (item4); std :: cin.get (); वापसी 0; }   

आप यहां परिणाम देख सकते हैं:

No comments:

Post a Comment