Рекурсивная функция C ++ в алфавитном порядке, возвращающая одно и то же значение повторно - PullRequest
1 голос
/ 19 апреля 2019

Справочная информация: я пишу программу, которая берет список данных и анализирует их в двоичном дереве поиска.Ключ для этих данных имеет тип «строка».Я работаю над написанием логической функции, которая возвращает «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. laak 2. laab 3. laaj 4. laal

Мы должнысм. вывод:

  • true (2 слева от 1)

  • true затем false (3 слева от 1 и справа от 2)

  • false (k является правым от 1)

Все, что он на самом деле возвращает, является ложным, поскольку 4 является правильным потомком 3, 3справа от 2, а 2 справа от 1.

Примечание. Метод вставки работал правильно до того, как я реализовал эту функцию, хотя и с уникальными первыми символами.

1 Ответ

1 голос
/ 19 апреля 2019
return abcOrder(m, ref, i);

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...