在传递函数中的节点时通过引用问题传递

时间:2016-01-30 15:27:33

标签: c++ pass-by-reference trie

#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
#include <string>

using namespace std;

struct node {
        bool indicator;
        map<int, struct node*> vec; 
};

node * create_node () {
        node *newnode = new node();
        newnode -> indicator = 0;
        for(int i = 1; i <= 26; i++)
            newnode -> vec[i] = NULL;
        return newnode;
}

void insert_node (node* insertNode, int str_size, int currentIndex, string str) {
        node *newNode;
        newNode = create_node();
        int int_convert = str[currentIndex] % 96;
        insertNode -> vec[int_convert] = newNode;
        currentIndex++;
        if(currentIndex == str_size) {
            insertNode -> vec[int_convert] -> indicator = 1;
            cout<<"String added in the dictionary with certain insertions\n";
        }
        else
            insert_node(insertNode -> vec[int_convert], str_size, currentIndex, str);
}

void travel (node* currentNode, int str_size, int currentIndex, string str) {
        if(currentIndex != str_size) {
            int int_convert = str[currentIndex] % 96;
            if (currentNode -> vec[int_convert])
                travel(currentNode -> vec[int_convert], str_size, ++currentIndex, str);
            else {
                char c;
                cout<<"String not present\n"<<"Do u want 2 build (Y/N)\n";
                cin>>c;
                if (c == 'Y')
                    insert_node(currentNode, str_size, currentIndex, str);
            }
        }
        else {
            if(currentNode -> indicator == 1)
                cout<<"String FOund in DIctionary\n";
            else {
                cout<<"String not in dictionary BUT can acheived without further insertions\n";
                currentNode -> indicator = 1;
                cout<<"String stored in dictionary\n";
            }
        }
}

int main() {
        int num;
        char C;
        cout<<"enter number of insertions\n";
        scanf("%d", &num);
        node *rootnode;
        rootnode = create_node();
        for(int i =0; i < num; i++) {
            string S;
            cout<<"Enter string\n";
            scanf("%c", &C);
            getline(cin, S);
            travel(rootnode, S.size(), 0, S);
        }
        return 0;
}

在上面的代码中,当给出超过2个输入时,树的根将丢失,并且新树再次从NULL形成,从而消除了由先前值形成的树。因此,我认为问题是将节点传递给函数,节点地址没有得到保留。好好理解,这是Trie的一个程序。例如 string INPUT 1 - &#34; top&#34; 最初这棵树是空的,所以&#34; top&#34;不存在,因此top将被插入树中以供将来遍历。 字符串输入2 - &#34; top&#34; 这次它会在字典中找到&#34;因为&#34; top&#34;已经在第一次输入中被激活,此时程序响应很好 字符串输入3 - &#34; top&#34; 当第三个输入再次出现&#34; top&#34;时,输出应该再次&#34;在字典中找到&#34;但输出是&#34;找不到&#34; &#34; top&#34;再次插入,所以树一次响应两个输入正确,意味着第四个输入将对应第三个输入,但它不会考虑第一个或第二个输入,类似于第五个输入树再次变空并且字符串插入和第六个输入只会影响第5输入的存在。

1 个答案:

答案 0 :(得分:0)

算法本身没有明显的错误。一个问题是,您正在混淆iostream和传统的C I / O功能并做错了。

让我说我有这样的意见:

3
top
top
top

scanf("%d", &num);只读取数字3而没有换行符。第一次输入循环时,scanf("%c", &C);读取换行符,然后getline(cin, S);读取字符串&#34; top&#34;正常。但是,下次执行循环时,getline函数已经读取了换行符,因为它读取了整行。因此,代码scanf("%c", &C);会读取&#34; top&#34;的第一个字符:&#39; t&#39;。

选择其中一个I / O库的正确方法:cin/coutscanf/printf,并始终如一地使用它。要阅读字符串,只需使用cin >> sscanf("%s", s),不要将其与getline混合使用。