степень родства в родословной - PullRequest
0 голосов
/ 25 апреля 2020

Я пишу программу семейного древа, и у меня возникают проблемы с реализацией степени родства. Я ввожу два имени, и программе необходимо вывести степень родства. Например, когда вы вводите - Элисон и Энтони, должно получиться, что Энтони - прадедушка, а в остальных случаях отец / дедушка / прадедушка. Спасибо за любые идеи / советы.

#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
#include <stdlib.h>
#include "Windows.h"


using namespace std;

ifstream file;

const int n = 15;

struct family
{
    string member;
    family* l, * r;
}base;

family* tree = NULL;

void init() {
    do {
        file >> base.member;
    } while (!feof);
}

void push(family** t)
{

    if ((*t) == NULL)
    {
        (*t) = new family;
        (*t)->member = base.member;
        //(*t)->year = base.year;
        (*t)->l = (*t)->r = NULL;
        return;
    }
    if (base.member < (*t)->member) push(&(*t)->r);
    else push(&(*t)->l);
}

void Tree_Balance(int n, family** t)
{

    family* now;
    int x, nl, nr;
    now = *t;
    if (n == 0)* t = NULL;
    else
    {
        nl = n / 2; nr = n - nl - 1;
        now = new family;
        (*now).member = base.member;
        //(*now).year = base.year;
        Tree_Balance(nl, &((*now).l));
        Tree_Balance(nr, &((*now).r));
        *t = now;

    }
}

void del_all(family*& t)
{
    if (!t) return;
    del_all(t->l);
    del_all(t->r);
    delete t;
    t = NULL;
}

int count(family* t)
{
    int result;
    if (t == NULL)
    {
        result = 0;
    }

    else if ((t->l == NULL) && (t->r == NULL))
    {
        result = 1;
    }

    else
    {
        result = count(t->l) + count(t->r);
    }

    return result;

}

void Print_Tree(family** tree, int l)
{

    if (*tree != NULL)
    {
        Print_Tree(&((**tree).r), l + 2);
        for (int i = 1; i <= l; i++) cout << "          ";
        cout << (**tree).member  << endl << endl;
        Print_Tree(&((**tree).l), l + 2);
    }
    Tree_Balance(n, tree);
}


int main()
{

    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    int calc;
    file.open("family.txt");

    if (!file)
    {
        cout << " error \n ";
        exit(1);
    }

    for (int i = 0; i < n; ++i) {
        init();
        push(&tree);
    }


    Print_Tree(&tree, 0);
    calc = count(tree);
    cout << endl << "members who have no children: " << calc << endl << endl;
    del_all(tree);
    system("pause");

    return 0;
}

мой файл:

Anthony Chloe Arthur Cameron Daniela Abraham Davina Daniel Armando Alana Alison  Aiden Aaron Abigale Aarav 

выходы программы:


                                                            Aarav

                                        Aaron

                                                            Abigale

                    Abraham

                                                            Aiden

                                        Alana

                                                            Alison

Anthony

                                                            Armando

                                        Arthur

                                                            Cameron

                    Chloe

                                                            Daniel

                                        Daniela

                                                            Davina
...