【问题标题】:Recursive C++ alphabetical order function returning same value repeatedly递归C++字母顺序函数重复返回相同的值
【发布时间】:2019-04-19 02:15:57
【问题描述】:

背景:我正在编写一个程序,它获取数据列表并将其解析为二叉搜索树。该数据的键是“字符串”类型的。我正在编写一个布尔函数,如果要添加的数据的键在参考节点中的数据键之前返回“true”,如果新键成功旧键,则返回“false”,并递归运行如果所讨论的字符相等,则函数增加一个位置是 ASCII 值。

目前,我的比较似乎是正确的,并且似乎是正确递归的,但在所有情况下都返回 false。

mBST.cpp

    class mBST {
    private:
        struct mNode {
            movie M;
            string k;
            mNode* left;
            mNode* right;
        };
        mNode *root;
        mNode *insert(movie m, mNode *t) {
            bool rec;
            if (t == NULL) {
                t = new mNode();
                t->M = m;
                t->k = m.getTitle();
                t->left = NULL;
                t->right = NULL;
            } else {
                if(abcOrder(m, t, 0)){
                    t->left = insert(m, t->left);
                }
                else {
                    t->right = insert(m, t->right);
                }
            }
            return t;
            };
            mNode *remove(movie m, mNode *t);
            mNode *search(string k, mNode *t);
            mNode *min(mNode *t);
            mNode *max(mNode *t);
            void inorder(mNode *t);


public:
    mBST() {
        root = NULL;
    }

    void insert(movie m) {
        root = insert(m, root);
    };
    void remove(movie m);
    void search(string k);
    void inorder();
    //Initial call passes i = 0
    bool abcOrder(movie m, mNode *ref, int i) {
        int data = NULL;
        //Gets key data and converts to lowercase as needed
        int newNode = m.getTitle().at(i);
        if (newNode < 97)
            newNode = newNode + 32;
        int refNode = ref->M.getTitle().at(i);
        if (refNode < 97)
            refNode = refNode + 32;
        //Compares key data at position 'i'
        if (newNode < refNode) {
            return true;
        } else if (newNode > refNode) {
            return false;
        } else {
            //If newNode.key == refNode.key, increment position and run again
            i++;
            abcOrder(m, ref, i);
        }
    }
};

MoviePeopleBST.cpp

int main()
{
ifstream inFile;
ofstream outFile;
mBST movieBST;
pBST peopleBST;

inFile.open("movies.txt");
//Reads in movies text file and sends to BST
while (!inFile.eof()) {
    string junk;
    string sTemp;
    movie temp;
    int iTemp;
    getline(inFile, sTemp);
    if (sTemp != "") {
        temp.setTitle(sTemp);
        inFile >> iTemp;
        temp.setYear(iTemp);
        getline(inFile, junk);
        inFile >> iTemp;
        temp.setRunTm(iTemp);
        getline(inFile, junk);
        getline(inFile, sTemp);
        temp.setRating(sTemp);
        getline(inFile, sTemp);
        temp.setAspect(sTemp);
        getline(inFile, sTemp);
        temp.setColor(sTemp);
        movieBST.insert(temp);
        //movieVector.push_back(temp);
    }
}
inFile.close();

/*inFile.open("people.txt");
//Reads in people text file and sends to BST
while (!inFile.eof()) {
    string junk;
    string sTemp;
    people temp;
    int iTemp;
    getline(inFile, sTemp);
    if (sTemp != "") {
        temp.setFirst(sTemp);
        getline(inFile, sTemp);
        temp.setLast(sTemp);
        inFile >> iTemp;
        temp.setbYear(iTemp);
        getline(inFile, junk);
        inFile >> iTemp;
        temp.setdYear(iTemp);
        getline(inFile, junk);
        getline(inFile, sTemp);
        temp.setGender(sTemp);
        peopleBST.insert(temp);
        //peopleVector.push_back(temp);
    }
}
inFile.close();*/

return 0;
}

文本文件作为要插入的数据:

laak
4
5
guide
payment
exclusive
laab
5
4
impartial
sigh
stage
laaj
9
8
change
cannon
wound
laal
8
7
acid
help
tickle

给定键: 1. 拉克 2. 拉布 3. 拉吉 4. 拉尔

我们应该看到以下输出:

  • 真(1 的左边有 2)

  • 真则假(3在1的左边,2在右边)

  • false(k 在 1 的右边)

它实际返回的都是假的,4 是 3 的右孩子,3 是 2 的右孩子,2 是 1 的右孩子。

注意:在我实现这个功能之前,插入方法可以正常工作,尽管第一个字符是唯一的。

【问题讨论】:

标签: c++ function recursion


【解决方案1】:
return abcOrder(m, ref, i);

...

【讨论】:

  • 您能否解释一下为什么会这样,以及它是如何在没有return 的情况下返回false 的。
  • 如果调用者使用返回值,则从具有非void 返回类型的函数的末尾退出会产生未定义的行为。因此,调用者收到的值可以是任何值。始终返回false 是一个完全有效的结果。但其他任何事情也是如此。
猜你喜欢
  • 2017-05-14
  • 2013-01-31
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2022-07-21
相关资源
最近更新 更多