Crashowanie programu

0

Witam,
mam następujacy kod

main.cpp

#include "lista.h"

using namespace std;

int main()
{
    LISTA l1;

    int Tablica[n] = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50};

            for(int i=0; i < n; i++)
            {
                OBIEKT *nowy = new OBIEKT;
                nowy->wartosc = Tablica[i];
                l1.dorzuc(nowy);
            }

    return 0;
}
 

lista.h

 const int n = 10;

typedef struct el
{
    int wartosc;
    struct el *nastepny;
}OBIEKT;

class LISTA
{
public:
    void dorzuc(OBIEKT *q);
    void wyswietl(OBIEKT *q);
private:
    typedef struct
    {
        OBIEKT *head;
        OBIEKT *tail;
    }WSK;
    WSK dane;
};

lista.cpp

#include "lista.h"
#include <iostream>

using namespace std;

void LISTA::dorzuc(OBIEKT *q)
{
    if(dane.head == NULL)
        dane.head = dane.tail = q;
    else
    {
        (dane.tail)->nastepny = q;
        dane.tail = q;
    }
}

 

Kompiluje program i gdy chce go uruchomić wyświetla że program przestał działać.
Nie wiem o co tutaj chodzi, i zwracam się z prośbą o pomoc.

0

Nigdzie nie zwalniasz pamięci, ale od tego program się nie wykrzacza.

Na pierwszy rzut oka nie widzę błędu. Debugowałby.

1
  1. typedef struct w c++? srsly?
  2. Nigdzie nie ustawiłeś że dane.head / dane.tail są nullami a w "dorzuć" sprawdzasz taki warunek...
2

Nigdzie nie ustalasz wartości dane.head oraz dane.tail, powinni zostać wyzerowani w konstruktorze klasy LISTA.
Kolejnym błędem będzie brak zerowania składowej nastepny.

#include <iostream>
using namespace std;
 
class LISTA
  {
   private:
   struct OBIEKT
     {
      int wartosc;
      OBIEKT *nastepny;
      OBIEKT(int wartosc):wartosc(wartosc),nastepny(0) {}
     } *head,*tail;
   public:
   LISTA():head(0),tail(0) {}
   ~LISTA() {} // Trzeba zrobić koniecznie
   void dorzuc(int wartosc) { tail=(tail?tail->nastepny:head)=new OBIEKT(wartosc); }
   void wyswietl();
  };

void LISTA::wyswietl()
  {
   for(OBIEKT *i=head;i;i=i->nastepny) cout<<i->wartosc<<' ';
  }

int main()
  {
   int Tablica[]={5, 10, 15, 20, 25, 30, 35, 40, 45, 50};
   const int n=sizeof(Tablica)/sizeof(*Tablica);
   
   LISTA L;
   for(int i=0;i<n;++i) L.dorzuc(Tablica[i]);
   L.wyswietl();

   return 0;
  }
0

Dobra dzięki Panowie, błędy naprawiłem, działa jak należy. Zamiast struct stosować class, zgadza sie?

2

struct NazwaStruktury
{
} ALIASY;

1

@Syriusz20 nie o to chodzi. W c++ struktura to jest de facto to samo co klasa tylko ze domyślny dostep do składników jest public. W szczególności: składnia jest taka sama. W C trzeba było robić typedef żeby nie musieć zawsze pisać struct przy nazwie typu strukturalnego. W C++ nie ma takiej potrzeby.

1 użytkowników online, w tym zalogowanych: 0, gości: 1