• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program nie wykonuje ostatniej instrukcji

Object Storage Arubacloud
0 głosów
82 wizyt
pytanie zadane 15 grudnia 2018 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)

Program działa jak należy aż do ostatniej wywoływanej funkcji, powinien usunąć element o wartości klucza k4, a jednak program twierdzi że nie znajduje szukanego elementu

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <fstream>

using namespace std;
//----------------ZMIENNE----------------//
int tab[101], X, k1, k2, k3, k4, licznik = 0;

struct wezel {
    int klucz;
    char klucz2[10];
    wezel * lewy;
    wezel * prawy;
    wezel * ojciec;
};

struct drzewo{
    wezel * korzen = NULL;
}drzewo;
//----------------FUNKCJE----------------//
void odczyt_pliku(){
    fstream plik;
    plik.open("inlab03.txt", ios::in);

    if(plik.good()==false){
        cout<<"Nie udalo sie odczytac pliku lub plik nie istnieje";
        exit(0);
    }
plik>>X>>k1>>k2>>k3>>k4;
plik.close();
};

int losuj_int(){
    int wylosowana;
    int j;

    do
    {
        wylosowana = rand() % 20000 - 10000;

        for(j = 0; j < licznik; ++j)
        {
            if(wylosowana == tab[j]) break;
        }
    }
    while(j != licznik);

    tab[licznik++] = wylosowana;
    return wylosowana;
};

void dodaj_wezel(int k){
  wezel * wez = drzewo.korzen;
  wezel * nowy = new wezel;
  nowy->lewy = NULL;
  nowy->prawy = NULL;
  nowy->klucz = k;

  if(drzewo.korzen==NULL) {
    drzewo.korzen = nowy;
    }
else{
    while(true){
      if(k < wez->klucz)
      {
        if(!wez->lewy)
        {
          wez->lewy = nowy;
          break;
        }
        else {
            wez = wez->lewy;
        }
      }
      if (k > wez->klucz)
      {
        if(!wez->prawy)        // Jeśli prawego syna nie ma,
        {
          wez->prawy = nowy;      // to węzeł w staje się prawym synem
          break;             // Przerywamy pętlę while
        }
        else {
            wez = wez->prawy;
        }
      }
    }

  nowy->ojciec = wez;
}
}

void dodaj_x_wezlow(int X){
    for (int i = 0; i<=X; i++){

         wezel * wez = drzewo.korzen;
  wezel * nowy = new wezel;
  nowy->lewy = NULL;
  nowy->prawy = NULL;
  int k = losuj_int();
  nowy->klucz = k;



  if(!wez) {
    drzewo.korzen = nowy;
    }
  else{
    while(true){
      if(k < wez->klucz)
      {
        if(!wez->lewy)
        {
          wez->lewy = nowy;
          break;
        }
        else {
            wez = wez->lewy;
        }
      }
      if (k > wez->klucz)
      {
        if(!wez->prawy)
        {
          wez->prawy = nowy;
          break;
        }
        else {
            wez = wez->prawy;
        }
      }
    }
  }
  nowy->ojciec = wez;
    }
};

wezel * najmniejszy(wezel * wez){
    while (wez->lewy != NULL){
        wez = wez->lewy;
    }
    return wez;
}

wezel * nastepnik(wezel * wez){
    wezel * wez2;
    if (wez->prawy != NULL){
         while (wez->lewy != NULL){
            wez = wez->lewy;
        }
        return wez;
    }

    wez2 = wez->ojciec;
    while ((wez2 != wez) && (wez2->lewy != wez)){
        wez = wez2;
        wez2 = wez2->ojciec;
    }
    return wez2;
}

void usun(int k){
    wezel * wsk = drzewo.korzen;
    wezel * wsk2;
    wezel * wsk3;
    int pozycja = 1;

    if(drzewo.korzen==NULL){
        cout<<endl<<"Wezel ktory chcesz usunac nie istnieje - drzewo jest puste!"<<endl;
        return;
    }
    else{
     while((drzewo.korzen!=NULL) && (wsk->klucz != k)){//szukaj porownania
        if(k < wsk->klucz){
            if(wsk->lewy != NULL){
                wsk = wsk->lewy;
                pozycja = pozycja*2;
            }
            else{
                cout<<endl<<"Nie znaleziono szukanego wezla"<<endl;
                return;
            }
        }
        else if (k > wsk->klucz){
            if(wsk->prawy != NULL){
                wsk = wsk->prawy;
                pozycja = (pozycja*2)+1;
            }
            else{
                cout<<endl<<"Nie znaleziono szukanego wezla"<<endl;
                return;
            }
        }
    }

        if((wsk->lewy==NULL)||(wsk->prawy==NULL)){
                wsk2=wsk;
        }
        else{
                wsk2=nastepnik(wsk);
        }
        if(wsk->lewy != NULL){
                wsk3=wsk2->lewy;
        }
        else{
                wsk3=wsk2->prawy;
        }
        if(wsk3!=NULL){
                wsk3->ojciec = wsk2->ojciec;
        }
        if(wsk2->ojciec == NULL){
                drzewo.korzen = wsk3;
        }
        else{
                if (wsk2 == wsk2->ojciec->lewy){
                        wsk2->ojciec->lewy = wsk3;
                }
                else{
                        wsk2->ojciec->prawy = wsk3;
                }
        }
        if(wsk2 != wsk){
                wsk->klucz = wsk2->klucz;
                //wsk->klucz2 = wsk2->klucz2;
        }
    }
}

void wyszukaj(int k){
    int pozycja = 1;
    wezel * wez = drzewo.korzen;

    while((drzewo.korzen!=NULL) && (wez->klucz != k)){//szukaj porownania
        if(k < wez->klucz){
            if(wez->lewy != NULL){
                wez = wez->lewy;
                pozycja = pozycja*2;
            }
            else{
                cout<<endl<<"Nie znaleziono szukanego wezla"<<endl;
                return;
            }
        }
        else if (k > wez->klucz){
            if(wez->prawy != NULL){
                wez = wez->prawy;
                pozycja = (pozycja*2)+1;
            }
            else{
                cout<<endl<<"Nie znaleziono szukanego wezla"<<endl;
                return;
            }
        }
    }
    cout<<endl<<"Szukany wezel znajduje sie na pozycji "<<pozycja<<endl;
};

void in_order(wezel * wsk){
    if(wsk != NULL){
        in_order(wsk->lewy);
        cout<<wsk->klucz<<" ";
        in_order(wsk->prawy);
    }
};
void pre_order(wezel * wsk){
    if(wsk != NULL)
    {
        cout<<wsk->klucz<<" "; // odwiedzamy węzeł
        pre_order(wsk->lewy);      // przechodzimy lewe poddrzewo
        pre_order(wsk->prawy);     // przechodzimy prawe poddrzewo
    }
};
void post_order(wezel * wsk){
    if(wsk != NULL)
    {
        post_order(wsk->lewy);     // przechodzimy lewe poddrzewo
        post_order(wsk->prawy);    // przechodzimy prawe poddrzewo
        cout<<wsk->klucz<< " "; // odwiedzamy węzeł
    }
};

//----------------MAIN----------------//
int main()
{
    clock_t begin, end;
    double time_spent;
    begin = clock();
    srand(time(NULL));

    odczyt_pliku();

    usun(k1);

    dodaj_wezel(k1);

    dodaj_x_wezlow(X);

    cout<<endl<<endl<<"INORDER: ";
    in_order(drzewo.korzen);

    cout<<endl<<endl<<"PREORDER: ";
    pre_order(drzewo.korzen);

    dodaj_wezel(k2);

    cout<<endl<<endl<<"INORDER: ";
    in_order(drzewo.korzen);

    dodaj_wezel(k3);

    dodaj_wezel(k4);

    usun(k1);

    cout<<endl<<endl<<"PREORDER: ";
    pre_order(drzewo.korzen);

    wyszukaj(k1);

    usun(k2);

    cout<<endl<<endl<<"INORDER: ";
    in_order(drzewo.korzen);

    usun(k3);

    usun(k4);


   end = clock();
   time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
   cout<<endl<<endl<<"Czas wykonania instrukcji "<<time_spent<<endl;
   return 0;
}

 

komentarz 15 grudnia 2018 przez RafalS VIP (122,820 p.)

Nie używaj funkcji exit(), clock() i rand() w C++.

Zamiast exit - rzuć wyjątkiem.

Zamiast clock() - std::chrono::steady_clock. Użycie nie jest wcale takie trudne. Wystarczy zobaczyć przykład z dokumentacji.

Zamiast rand() - default_random_egnine lub mt19937 z nagłówka <random>

if(plik.good()==false)
if(!plik.good())

 

komentarz 15 grudnia 2018 przez Alan Kruszyński Obywatel (1,410 p.)
Fajne porady ale żadna na temat mojego problemu
komentarz 15 grudnia 2018 przez RafalS VIP (122,820 p.)
Nie mialem czasu analizować 300 linijek kodu więc dorzuciłem tylko to co narzuciło się od razu :P

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
2 odpowiedzi 236 wizyt
0 głosów
1 odpowiedź 83 wizyt
pytanie zadane 10 stycznia 2018 w C i C++ przez Q7V Gaduła (4,250 p.)
0 głosów
0 odpowiedzi 208 wizyt
pytanie zadane 13 maja 2023 w JavaScript przez Dawidziu Bywalec (2,610 p.)

92,555 zapytań

141,404 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...