K & R bulunduğu gibi C, söz konusu ikili ağaç uygulaması

oy
6

Bu yüzden K & R C kitap aracılığıyla okuyordum ve .. sayfa 140-141 üzerindeki yapılar üzerinde 6 bölümde, şöyle kod soru var olması (daha ilgisiz bazı parçaların çıkardı)

/*
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;
}

Ve benim karışıklık kökünde ana () fonksiyonunda olduğu = AddNode (kök, kelime)

AddNode yeni eklenen düğüme bir işaretçi döndürür, ağacın üstünde tüm verileri kaybetmek olmaz (onun zaten he ağacı int eğer ya düğüme o kelimedir)? Ağacın kökü olarak kalmak kökünü gerekmez mi?

Teşekkürler!

Oluştur 03/07/2011 saat 08:25
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
3

Sizin yanlış anlama davranışı içindedir addNode. Bu etmez olmayan yeni eklenen düğüm için bir işaretçi döndürür; bunun yerine, geçirildi düğüme bir işaretçi, döner p(yani sürece NULL).

Sadece zamandan beri root == NULLilk kelimesi eklendiğinde ise, rootbu noktadan aynı değere sahip olacaktır ve tekrar tekrar bu aynı değeri atanır olsun. Bu tarafından temsil edilen boş ağaçlar, ile ilgili sadece özel bir yöntemdir ve NULLişaretçi.

Her özyinelemeli çağrı unutmayın addNodebir sahiptir farklı değer polsa da,. Bu, yerel değişkenlerin nasıl çalıştığı ise; bunlar için yerel olan belirli bir çağırma değil, bir bütün olarak işlevi için, fonksiyon. Belki bu işlevin davranışı sizin yanlış anlama yol açtı.

Cevap 03/07/2011 saat 08:38
kaynak kullanıcı

oy
5

rootHer zaman ağacın kökü olarak kalıyor. rootBirinci parametre olarak kabul edilir addNodeolan sadece olacak mallocbu ise NULLörneğin, zaman rootilk kez geçirilir. Daha sonra bir değişiklik olmayacak çağrıları ise rootsadece değiştirecektir count, leftya right. Özyinelemeli içinde olduğunu unutmayın addNodearamalar pgeçmedi, daha çok geriye ya da sağ çocuk geçirilir. Bir kağıt ve kalem / kalem ile ağaca geçmesi deneyin ve düğümleri eklenmeye nasıl anlayacaktır.

Cevap 03/07/2011 saat 08:39
kaynak kullanıcı

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