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

2 sposoby tworzenia struktury 1 nie działa(

Object Storage Arubacloud
0 głosów
169 wizyt
pytanie zadane 18 czerwca 2018 w C i C++ przez michulo Obywatel (1,240 p.)

2 wersje programu
W pierwszej lista jest tworzona tak:
 Lista *lista1 = new Lista;
w drugiej tak:
struct Lista lista1;

2 wersja nie dzieła prawidłowo w miejscu //tu nigdy nie wchodzi 

 

Nie mam pomysłu, ktoś pomoże?

 

#include <iostream>
#include <ctime>
#include <iomanip>
#include <cstdlib>

/*
Napisz program, który:
1. generuje n liczb losowych i tworzy z nich liste z dowiazaniami
2. wyswietla liste.
*/
using namespace std;

struct Element {
    int liczba;
    Element *next;
};

struct Lista {
    Element *glowa;

    Lista ();  //konstruktor
    void DodajPozycje(int i); // dodaje pozycjê do listy glowa
    void WyswietlListe(); // wyœwietla listê wskazywan¹ przez glowa
    void Kasuj ();
    void BladPrzydzialu();
}  ;



int main() {
    int n = 10;
    srand(time(NULL));
    Lista *lista1 = new Lista;
    //struct Lista lista1 ;


    for (int i = 0; i <n; i++) {
        lista1->DodajPozycje(rand()%100);
    }
    lista1->WyswietlListe();
    lista1->Kasuj();
}

///// STRUKTURALNE

Lista::Lista ( ) {
    Element *glowa = nullptr;
    cout <<"konstruktor"<<endl;
}

void Lista::DodajPozycje(int i ) {
    if (glowa == nullptr) {
              cout <<"dodaje jako pierwszy : "<<i <<endl;
        glowa = new Element;
        cout <<"dodaje: "<<i <<endl;
        if (glowa == nullptr) {
            BladPrzydzialu();
        }
        glowa->liczba = i;
        glowa->next = nullptr;
    } else {
        //Element *last = glowa;
         cout <<"dodaje: "<<i <<endl;
        Element *temp = new Element;
        if (temp == nullptr) {
            BladPrzydzialu();
        }
        temp->liczba = i;
        temp->next= glowa;
        glowa = temp;
    }
}

void Lista::WyswietlListe() {
    Element *last = glowa;
    for (int i = 1; last != nullptr; i++)
    {
        cout <<setw(7)<<last->liczba<<"  ";
        last = last->next;
        if (i%4 == 0) {
            cout<<endl;
        }
    }
    cout <<endl;
}

void Lista::Kasuj () {
    Element *tmp;
    while (glowa != nullptr) {
        tmp = glowa;
        glowa = glowa->next;
        //    cout <<"kasuje "<<tmp->liczba<<endl;
        delete tmp;
    }

}

void Lista::BladPrzydzialu()
{cout <<"nie udlo sie przydzielic pamieci"<<endl;
                     exit (1);}

Wersja 2

#include <iostream>
#include <ctime>
#include <iomanip>
#include <cstdlib>

/*
Napisz program, który:
1. generuje n liczb losowych i tworzy z nich listê z dowi¹zaniami
2. wyœwietla tê listê.

*/
using namespace std;

struct Element {
    int liczba;
    Element *next;
};

struct Lista {
    Element *glowa;

    Lista ();  //konstruktor
    void DodajPozycje(int i); // dodaje pozycjê do listy glowa
    void WyswietlListe(); // wyœwietla listê wskazywan¹ przez glowa
    void Kasuj ();
    void BladPrzydzialu();
}  ;

int main() {
    int n = 10;
    srand(time(NULL));
    //Lista *lista1 = new Lista;
    struct Lista lista1 ;


    for (int i = 0; i <n; i++) {
        lista1.DodajPozycje(rand()%100);
    }
    lista1.WyswietlListe();
    lista1.Kasuj();
}

///// STRUKTURALNE

Lista::Lista ( ) {
    Element *glowa = nullptr;
    cout <<"konstruktor"<<endl;
}

void Lista::DodajPozycje(int i ) {
    if (glowa == nullptr) {     //tu nigdy nie wchodzi 
              cout <<"dodaje jako pierwszy : "<<i <<endl;
        glowa = new Element;
        cout <<"dodaje: "<<i <<endl;
        if (glowa == nullptr) {
            BladPrzydzialu();
        }
        glowa->liczba = i;
        glowa->next = nullptr;
    } else {
        //Element *last = glowa;
         cout <<"dodaje: "<<i <<endl;
        Element *temp = new Element;
        if (temp == nullptr) {
            BladPrzydzialu();
        }
        temp->liczba = i;
        temp->next= glowa;
        glowa = temp;
    }
}

void Lista::WyswietlListe() {
    Element *last = glowa;
    for (int i = 1; last != nullptr; i++)
    {
        cout <<setw(7)<<last->liczba<<"  ";
        last = last->next;
        if (i%4 == 0) {
            cout<<endl;
        }
    }
    cout <<endl;
}

void Lista::Kasuj () {
    Element *tmp;
    while (glowa != nullptr) {
        tmp = glowa;
        glowa = glowa->next;
        //    cout <<"kasuje "<<tmp->liczba<<endl;
        delete tmp;
    }

}

void Lista::BladPrzydzialu()
{cout <<"nie udlo sie przydzielic pamieci"<<endl;
                     exit (1);}

 

1 odpowiedź

+1 głos
odpowiedź 18 czerwca 2018 przez RafalS VIP (122,820 p.)
wybrane 19 czerwca 2018 przez michulo
 
Najlepsza

Jeśli zmieniasz tylko te linijki to bardzo dziwne, że działa jedna, bo obydwie nie powinny:

Lista::Lista() {
	Element *glowa = nullptr;
	cout << "konstruktor" << endl;
}

to jest bez sensu.

glowa to tutaj zmienna lokalna niszczona po wyjściu z destruktora. Jak chcesz ustawić składową to napisz:

glowa = nullptr;

lub gdy masz konflikt nazw np z argumentami to tak:

this->glowa = nullptr;

 

Podobne pytania

+1 głos
1 odpowiedź 138 wizyt
pytanie zadane 16 stycznia 2017 w Inne języki przez agit45 Obywatel (1,110 p.)
0 głosów
4 odpowiedzi 219 wizyt
0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 17 października 2020 w C i C++ przez Bartek030 Obywatel (1,460 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...