2012-07-13 27 views
7

मैं लिंक्ड सूची पर कुछ बुनियादी संचालन के बारे में छोरों के दो प्रकार पढ़ रहा था और मैंने देखा के माध्यम से पार करने के लिए लूप का उपयोग मुख्य रूप से इस्तेमाल किया जा रहालिंक्ड सूची


struct node { 
    int data; 
    struct node *next; 
}*start=NULL,*tmp; 

पहले पाश फार्म की थी

for(tmp=start;tmp->next!=NULL;tmp=tmp->next); 

ऊपर पाश, सूची में अंतिम नोड की ओर अब tmp सूचक अंक का उपयोग

दूसरे लूप प्रपत्र

tmp=start; 
while(tmp!=NULL) 
{ 
    // do something 
} 

मुझे लगता है कि उन दोनों को एक ही काम करते हैं की थी, लेकिन मुझे यकीन है कि नहीं हूँ। क्या कोई अंतर है?

+0

आप 'tmp = tmp-> अगले अनुपलब्ध हैं;' जबकि लूप – Musa

+2

@Musa: '// कुछ करें 'इसे कवर करता है। – user7116

+0

प्रश्न: क्या "लूप के लिए" idiom संबंधित "जबकि लूप" के बराबर है? ए: हां। प्रश्न: क्या यह उदाहरण त्रुटिपूर्ण है क्योंकि इस विशेष "for() लूप" में एक बग होता है? ए: हाँ भी :) – paulsm4

उत्तर

11

मुझे लगता है कि आपका समय लूप इस तरह कुछ है।

temp=start; 
while(temp!=NULL) 
{ 
    // do something 
    temp= temp->next; 
} 

पाश के लिए के अपने कोड में, आप पाश के लिए से बाहर कर रहे हैं, अस्थायी शून्य पर ओर इशारा करते हुए नहीं है। temp लिंक की गई सूची के अंत में इंगित कर रहा है। लेकिन के मामले में लूप, आपके temp आप लूप से बाहर निकलने के बाद NULL को इंगित कर रहे हैं और आपके पास पूंछ नहीं है (जब तक आप किसी अन्य अस्थायी चर को प्रोग्राम के तर्क को बदलने के लिए अस्थायी असाइन नहीं करते) आप इसे आगे के चरणों में उपयोग करना चाहते हैं। यही एकमात्र अंतर है। सिवाय इसके कि इसमें कोई फर्क नहीं पड़ता है।

आप इसे एक छोटा प्रोग्राम लिखकर और परिणामों को प्रिंट करके देख सकते थे। मैं आपको यह करने की सलाह देते हैं।

+0

यदि मैं temp चर बदलता हूं, तो क्या यह मूल लिंक की गई सूची को बदल देगा? – User

+0

केवल तभी जब आपका अस्थायी चरक पॉइंटर है। – Trent

1

प्रश्न: प्रभावी रूप से, "नहीं"। कोई वास्तविक अंतर नहीं है; वे दोनों एक ही काम करते हैं।

आप हमेशा कोड के लिए "()" लूप को समकक्ष के साथ "()" कोड कर सकते हैं।

+0

मैं जानना चाहता हूं कि अगर लूप के अंत में, "tmp" पॉइंटर दोनों मामलों में अंतिम नोड पर इंगित करता है ?? – OneMoreError

+0

@CSSS जैसा कि आपने वर्तमान में इसे परिभाषित किया है, जबकि ** लूप को समाप्त करने के लिए केवल ** तरीका है जब 'tmp == NULL'। इसके विपरीत, लूप को समाप्त करने के लिए ** केवल ** तरीका तब होता है जब 'tmp-> अगला == NULL'। तो ऐसा लगता है कि केवल लूप के लिए अंतिम नोड को इंगित करने वाले 'tmp' को छोड़ने का मौका है। उस ने कहा, लूप के लिए प्रत्येक बराबर है जबकि लूप (और इसके विपरीत), ताकि आप * अपने व्यवहार को वही बना सकें। –

+0

लूप के लिए निकलता है जब 'tmp-> अगला! = NULL' गलत है, इसलिए यह तब निकलता है जब' tmp-> अगला 'नल होता है, जो तब होता है जब tmp अंतिम नोड को इंगित कर रहा है। जबकि लूप निकलता है जब 'tmp! = NULL' गलत होता है, इसलिए जब यह' tmp' नल होता है तो यह निकलता है, इसलिए tmp अंतिम नोड को इंगित नहीं कर रहा है (यह किसी भी चीज़ को इंगित नहीं कर रहा है)। ध्यान दें कि लूप के शरीर को अंतिम नोड को इंगित करने के लिए कभी भी टीएमपी के साथ निष्पादित नहीं किया जाता है, क्योंकि वह तब होता है जब लूप निकलता है। –

5

लूप समान नहीं हैं। वास्तव में, आपके for लूप में कोई समस्या है। for लूप दर्ज करने से पहले start==NULL पर क्या होता है, इस पर विचार करें।

for(tmp=start;tmp->next!=NULL;tmp=tmp->next); 

आप starttmp के लिए और फिर भिन्नता tmp, एक शून्य सूचक आवंटित। मुझे लगता है कि आप इसके बजाय निम्नलिखित चाहते हैं।

for(tmp=start;tmp!=NULL;tmp=tmp->next); 

परिवर्तन for बनाता है और while ही लूप है।

0

मैं लूप के दौरान उपयोग करता हूं जब मुझे लिंक की गई सूची को बदलने की आवश्यकता होती है। उदाहरण के लिए

while (root->next) 
{ 
    if(0 == strcmp(root->data,root->next->data)) 
    { 
     temp = root; 
     root = root->next; 
     free(temp) 
    } 
    else 
    { 
     root = root->next; 
    } 
} 

मैं लूप के लिए उपयोग करता हूं जब मुझे केवल लिंक्ड सूची तक पहुंच पढ़ने की आवश्यकता होती है।

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