Передача значений из одной функции в другую и сравнение адресов элементов стека

249
02 мая 2018, 05:16

Нужно, чтобы вычисленные в функции Min_Max значения адресов min и max сохранялись и передавались в функцию Count. А функция Count должна считать элементы между адресами min и max, но я понял, что адреса элементов стека не идут по порядку.

struct Stack {              // Декларация структурного типа
    int info;
    Stack *next;
} *beg;
void Min_Max(Stack*, Stack*, Stack*);
Stack* Instack(Stack *p, int in) {
    Stack *t = new Stack;
    t->info = in;
    t->next = p;
    return t;
}
void View(Stack *p) {
    Stack *t = p;
    while (t != NULL) {
        cout << t->info << endl;
        t = t->next;
    }
}
void Del_All(Stack **p) {
    Stack *t;
    while (*p != NULL) {
        t = *p;
        *p = (*p)->next;
        delete t;
    }
}
void Min_Max(Stack *p, Stack *min, Stack *max) {
    Stack *t = p, *m;
    int min_value = t->info, max_value = 0;
    //t = p;
    for (t = t->next; t != NULL; t = t->next)
    {
        if (min_value > t->info)
        {
            min = t->next; min_value = t->info;
        }
        if (max_value < t->info)
        {
            max = t->next; max_value = t->info;
        }
    }
    cout << "min_value: " << min_value << ends << min << endl << "max_value: " << max_value << ends << max;
    m = min > max ? min : max; cout << endl << m;
}
void Count(Stack *p, Stack *min, Stack *max) {
    int c = 0; Stack *t = p;
    for (t = t->next; t != NULL; t = t->next)
    {
        if ((t->next < max) && (t->next > min))
            c++;
    }
    cout << c << ends << min << ends << max;
}
void Sort_info(Stack *p) {
    Stack *t = NULL, *t1;
    int r;
    do {
        for (t1 = p; t1->next != t; t1 = t1->next)
            if (t1->info > t1->next->info) {
                r = t1->info;
                t1->info = t1->next->info;
                t1->next->info = r;
            }
        t = t1;
    } while (p->next != t);
}
int main()
{
    int i, in, n, kod, kol = 0; 
    Stack *min=NULL, *max=NULL;
    srand(time(0));
    while (true) {
        cout << "\n\tCreate - 1.\n\tAdd - 2.\n\tView - 3.\n\tDelete - 4.\n\tSort - 5.\n\tMinMax - 6.\n\t\Count - 7\n\tEXIT - 0.  :  ";
        cin >> kod;
        switch (kod) {
        case 1: case 2:
            if (kod == 1 && beg != NULL) {
                // Если создаем новый стек, должны освободить память, занятую предыдущим
                cout << "Clear memory!" << endl;
                break;
            }
            cout << "Input kol = ";
            cin >> n;
            for (i = 1; i <= n; i++) {
                in = rand();
                beg = Instack(beg, in);
            }
            if (kod == 1) cout << "Create " << n << endl;
            else cout << "Add " << n << endl;
            break;
        case 3:         if (!beg) {
            cout << "Stack is empty!" << endl;
            break;
        }
                        cout << "--- Stack ---" << endl;
                        View(beg);
                        break;
        case 4:
            Del_All(&beg);
            cout << "Memory is free!" << endl;
            break;
        case 5:
            Sort_info(beg);
            break;
        case 6:
            Min_Max(beg, min, max);
            break;
        case 7:
            Count(beg, min, max);
            break;
        case 0:
            if (beg != NULL)
                Del_All(&beg);
            return 1;       // Выход – EXIT
        }
    }
    return 0;
}
Answer 1

Как я понял из комментов, вам нужно передать указатели в ф-цию, в ней вычислить нужные значения, сохранить их в переменные, доступные в main, а потом использовать их для вызова другой ф-ции. Если я прав, то вам нужно изменить ф-цию MinMax так, чтобы она не просто вычисляла адреса, но и сохраняла их. Для этого можно добавить возвращаемое значение в виде пары адресов и присваивать его в main переменным, но это морока, проще будет передовать в ф-цию адреса указателей, тобишь:

void Min_Max(Stack*, Stack**, Stack**);

Тогда при вызове ф-ции нужно будет:

Min_Max(beg, &min, &max);

Тогда значения адресов в указателях min и max будут соответствовать вычесленным в ф-ции MinMax. Ну и соответственно нужно отредоктировать код самой ф-ции.

READ ALSO
Можно ли использовать класс string вместе со scanf?

Можно ли использовать класс string вместе со scanf?

Для вывода объекта класса string с помощью printf можно воспользоваться методом c_str()

273
Непонятное поведение программы

Непонятное поведение программы

Нужно написать реализацию метода шаблонного класса List для простых типов данных и строк(сhar*), которая будет загружать список с csv файлаНаписал,...

248
Асинхронная запись в файл WinApi

Асинхронная запись в файл WinApi

Есть программа поиска всех файлов каталоге С

266