सी सवाल में द्विआधारी पेड़ कार्यान्वयन के रूप में कश्मीर एंड आर में पाया

वोट
6

इसलिए मैं कश्मीर एंड आर सी किताब के माध्यम से पढ़ रहा है और एक सवाल .. पेज 140-141 पर structs पर 6 अध्याय में, वहाँ कोड है कि इस तरह दिखता है है है (मैं और अधिक अप्रासंगिक भागों में से कुछ बाहर ले)

/*
the program loops through a tree looking for some word
if it finds the word itll incremenet the count by 1 
if it doesnt itll add a new node
*/

 struct node {
    char *word;
    int count;
    struct node *left;
    struct node *right;
}

 main() {
    struct node *root;
    char word[1000];

    root = NULL;
    while(getword(word, MAXWORD) != EOF) /* getword just grabs 1 word at a time from a file of words */
        if(isalpha(word[0])) /* isalpha checks to see if it is a valid word */
            root = addNode(root, word);

    treeprint(root); /* prints the tree */
    return 0;
}

struct node *addNode(struct node *p, char *w) {
    int cond;

    if(p == NULL) {
        p = malloc(sizeof(struct node)); /* allocates memory for the new node */
        p -> word = strdup(w);
        p -> count = 1;
        p -> left = p -> right = NULL;
    }

    else if ((cond = strcmp(w, p -> word)) == 0)
        p -> count++;

    else if(cond < 0)
        p -> left = addNode(p -> left, w);

    else
        p -> right = addNode(p -> right, w);

    return p;
}

और मेरे भ्रम जड़ में मुख्य () फ़ंक्शन में है = addNode (रूट, शब्द)

addNode नए जोड़े गए नोड के लिए एक सूचक देता है, तो (या नोड के लिए है कि शब्द है पर अगर इसके पहले से ही वह पेड़ int), नहीं है कि पेड़ से ऊपर सभी डेटा हार? पेड़ की जड़ के रूप में ठहरने के जड़ नहीं करना चाहिए?

धन्यवाद!

03/07/2011 को 08:25
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
3

आपका गलतफहमी के व्यवहार में है addNode। यह करता है नहीं नए जोड़े गए नोड के लिए एक सूचक लौट; बल्कि, यह नोड कि में पारित किया गया था करने के लिए एक सूचक, रिटर्न p(जब तक कि था NULL)।

केवल समय है कि जब से root == NULLहै, जब पहले ही शब्द जोड़ा जाता है, rootउस बिंदु से एक ही मूल्य है जाएगा, और यह बहुत ही मूल्य बार बार असाइन किए जाएंगे। यह खाली पेड़, जिसके द्वारा प्रतिनिधित्व कर रहे हैं से निपटने का सिर्फ एक सुंदर तरीका है NULLसूचक।

याद रखें में से प्रत्येक पुनरावर्ती कॉल कि addNodeएक है अलग के लिए मूल्य pहै, हालांकि। यह कैसे स्थानीय चर काम है, वे करने के लिए स्थानीय कर रहे हैं एक विशेष मंगलाचरण समारोह की, एक पूरे के रूप में कार्य करने नहीं। हो सकता है कि इस समारोह के व्यवहार की अपनी गलतफहमी का नेतृत्व किया।

03/07/2011 को 08:38
का स्रोत उपयोगकर्ता

वोट
5

rootहमेशा पेड़ की जड़ के रूप में रह रहा है। rootपहले पैरामीटर के रूप पारित हो जाता है की addNodeजो केवल mallocअगर वह यह है कि NULL, यानी जब rootपहली बार के लिए दिया जाता है। बाद में कॉल में यह परिवर्तन नहीं होगा root, केवल संशोधित करेगा count, leftया right। ध्यान दें कि पुनरावर्ती में addNodeकॉल pपारित नहीं किया है, बल्कि यह बचा है या सही बच्चे पारित कर दिया है। एक कागज और पेंसिल / कलम से पेड़ के माध्यम से जाने की कोशिश करो और आप कैसे नोड्स जोड़ा जा रहा है एहसास होगा।

03/07/2011 को 08:39
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more