Стек, ошибка Access violation at address с разными размерами

134
27 августа 2019, 22:40

Дана задача: создать стек из чисел, найдти среднее арифметическое и удалить елементы меньше его. C++ Builder6

Я написал программу но она правильно работает только в некоторых промежутках размера стека, например от 1 до 9- работает, от 10 до 19- не работает, от 20 до 29- работает и тд. Появляется ошибка Access violation at address вот код:

#include <vcl.h>

#pragma hdrstop
#include"stdlib.h"
#include "Unit1.h"
//--------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1* Form1;
//--------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner) {
}
//-------------------------------------------------------------------------
struct Stack {
    int info;
    Stack* next;
} * begin, * t;
//--------------------------------------
Stack* InStack(Stack*, int);
void View(Stack*);
void Del_All(Stack**);
int findAverage(Stack* p);
void __fastcall TForm1::Button1Click(TObject* Sender) {
    int i, in, n = StrToInt(Edit1->Text);
    if (begin != NULL) {
        ShowMessage("Освободите память!");
        return;
    }
    for (i = 1; i <= n; i++) {
        in = random(20) - 10;
        begin = InStack(begin, in);
    }
    Memo1->Lines->Add("создали " + IntToStr(n));
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject* Sender) {
    int i, in, n = StrToInt(Edit1->Text);
    for (i = 1; i <= n; i++) {
        in = random(20) - 10;
        begin = InStack(begin, in);
    }
    Memo1->Lines->Add("Добавили " + IntToStr(n) + " - òü.");
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject* Sender) {
    if (!begin) {
        ShowMessage("Стек пуст");
        return;
    }
    Memo1->Lines->Add("элементы");
    View(begin);
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject* Sender) {
    if (begin != NULL) Del_All(&begin);
    ShowMessage("память очищена");
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject* Sender) {
    if (begin != NULL) Del_All(&begin);
    Close();
}
//--------------------------------------------------------------------------
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) {
        Form1->Memo1->Lines->Add("   " + IntToStr(t->info));
        t = t->next;
    }
}
//----------------------------------------------
void Del_All(Stack** p) {
    while (*p != NULL) {
        t = *p;
        *p = (*p)->next;
        delete t;
    }
}
//----------------------------------------------
int findAverage(Stack* p) {
    int amount = 0, i = 0;
    for (Stack* temp = p; temp; temp = temp->next, i++)
        amount += temp->info;
    return amount / i;
}
//--------------------------------------------------
Stack* del(Stack* p, int sum) {
    Stack* head = p;
    if (p == NULL)
        return NULL;
    Stack* t = new Stack;
    t->next = head;
    p = t;
    while (p->next != NULL) {
        if (p->next->info < sum) {
            Stack* temp = p->next;
            p->next = p->next->next;
            delete temp;
        } else { p = p->next; }
    }
    return t->next;
}
//-------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject* Sender) {
    int a, b, n = StrToInt(Edit1->Text), i;
    int avg;
    avg = findAverage(begin);
    del(begin, avg);
    Memo1->Lines->Add("Среднее значение " + IntToStr(avg));
}
READ ALSO
c++ вычислить значение выражения

c++ вычислить значение выражения

Во входном потоке задано три вещественных числа a (a > 0), b (b < 0), x (-1 < x < 1)Значения исходных данных подобраны так, что выражение имеет смысл

127
С++ олимпиадная задача

С++ олимпиадная задача

Старый пират Пью спрятал свое золото, но для надежности не в одном месте, а частями в нескольких тайникахНо чтобы не забыть места хранения...

112
C++ циклический сдвиг влево [закрыт]

C++ циклический сдвиг влево [закрыт]

Дан линейный массив на N элементовВыполнить циклический сдвиг всех его элементов на один влево начиная с первого нулевого элемента

111