如何从C中的树字典中删除一个单词?

时间:2017-12-17 17:15:08

标签: c tree

我在C中使用树实现了一个字典,这个树存储了一个单词及其定义如下:

Dictionnary

如您所见,有些词汇共享相同的字母。 但现在我想实现一个删除功能,但不知道如何继续......我知道我应该开始删除这个词的结尾...... 这是我的代码,谢谢你将来的帮助!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct _noeud{
    char *value;
    struct _noeud *child[26];
}noeud_t;

typedef struct tree{
    node_t root;
}Tree;

Tree dict;

int getPos(char letter){
    char alpha[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    int i;
    for(i=0;i<strlen(alpha);i++){
        if(alpha[i]==letter){
            return i;
        }
    }
    return -1;

}

void addWord(node_t *node, char *word, char *def){
    int i;
    for(i = 0; i < strlen(word);i++){
        int letter=getPos(word[i]);
        if(letter==-1){
            printf("Unknown letter... \n");
        }
        node_t *parent = node;
        node = node->child[letter];
        if(!node){
            node = malloc(sizeof(node_t));
            parent->child[letter]=node;
        }
    }
    node->value = malloc(strlen(def)+1);
    strncpy(node->value,def,strlen(def)),
    printf("Word %s added to dictionnary.\n",word);
    fflush(stdin);
}

void findWord(node_t *node, char *word){
    printf("Looking for word %s \n",word);
    int i;
    for(i=0;i<strlen(word);i++) {
        int letter = getPos(word[i]);
        if(NULL ==node->child[letter]){
            printf("Unknown word ...\n");
            return;
        }
        else{
            node = node->child[letter];
        }
    }
    printf("Word found, its definition is : %s\n",node->value);

}

void deleteWord(node_t *node, char *word){
    int i=0;
    for(i=0;i<strlen(word);i++) {
        //...
    }
    printf("Word deleted !\n");
}


int main(){
    addWord(&dico.root,"dog","it's an animal");
    addWord(&dico.root,"pineapple","it's a fruit");
    addWord(&dico.root,"car","something to drive");
    findWord(&dico.root,"dog");
    findWord(&dico.root,"car");
    findWord(&dico.root,"pineapple");
    deleteWord(&dico.root,"pineapple");
    return 0;
}

1 个答案:

答案 0 :(得分:2)

我可以告诉你如何解决它,但很抱歉我没有写代码。

因此,从您的代码中,我可以看到您拥有findWord函数,如果它完美无缺,那么在删除内部使用它去找到这个词,你指向它现在你必须考虑三种可能性。

  1. 如果要删除的单词没有任何子节点,则删除它不再复杂。
  2. 如果要删除的单词只有一个孩子,那么请将该单词的父级指向该单词的子级。
  3. 如果要删除的单词有多个子项,则将其替换为其中一个子项,然后将其删除。
  4. 我希望这会对你有所帮助