Stos konstruktor kopiujacy problem

0

Witam

Całkowicie nie idzie mi stworzenie konstruktora kopiującego dla stosu.

#ifndef STOS_H_INCLUDED
#define STOS_H_INCLUDED

class Stos
{
	private:
	  struct LIFO
	  {
	  	int liczba;
	  	LIFO *nastepny;
	  };
	  LIFO *wierzcholek;
	public:
	  Stos();
	  ~Stos();
	  Stos(const Stos &);
	  int z_wierzchu();
	  void usun_z_wierzchu();
	  void poluz_na_stos(int);
	  bool pusty();
};

#endif // STOS_H_INCLUDED
 
 #include "stos.h"
#include <cstdlib>
#include <iostream>

Stos::Stos()
{
	wierzcholek=NULL;
}

void Stos::poluz_na_stos(int liczba1)
{


	LIFO *nowy=new LIFO;
	nowy->liczba=liczba1;
	nowy->nastepny=wierzcholek;
	wierzcholek=nowy;

}

void Stos::usun_z_wierzchu()
{


	if(wierzcholek)
	{
		LIFO *pom=wierzcholek;

	wierzcholek=wierzcholek->nastepny;
	if(wierzcholek)
	delete pom;
	}

}

int Stos::z_wierzchu()
{
	return wierzcholek->liczba;
}

bool Stos::pusty()
{
	return (wierzcholek==NULL);
}

Stos::~Stos()
{
	delete wierzcholek;
}

Stos::Stos(const Stos &sto)
{

if(sto.wierzcholek==NULL)
wierzcholek=NULL;
else
{
LIFO *nowy=new LIFO;
LIFO *pom=sto.wierzcholek;

nowy->liczba=pom->liczba;
nowy->nastepny=wierzcholek;
wierzcholek=nowy;





}
}

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


int main()
{
	char znak;
	int wartosc;
	int pom=0;
Stos nowa;

std::cout<<"podaj litere\nd)dodaj do stosu\n"
<<"p)usun z stosu\nr)koniec programu\n";


while(std::cin>>znak && znak!='r')
{
	switch(znak)
	{
		case 'd':
		std::cout<<"podaj liczbe jaka dodac do stosu\n";
		std::cin>>wartosc;
		nowa.poluz_na_stos(wartosc);
		std::cout<<"wartosc z wierzchu to:: "<<nowa.z_wierzchu()<<std::endl;
		break;
		case 'p':

		if(nowa.pusty()==true)
		std::cout<<"pusty\n";
		else
		nowa.usun_z_wierzchu();
		break;
	}


}
Stos nowy(nowa);

nowy.poluz_na_stos(111);
std::cout<<nowy.z_wierzchu()<<std::endl;
nowy.usun_z_wierzchu();
std::cout<<nowy.z_wierzchu()<<std::endl;
nowy.usun_z_wierzchu();
std::cout<<nowy.z_wierzchu()<<std::endl;
    return 0;
}
0
  1. "nie idzie" to po 60 w zupełnie innej kwestii.
  2. Wyobraź sobie, że masz 10 książek ułożone jedna na drugiej i chcesz je wszystkie przemieścić z łóżka na biurko. Co w takiej sytuacji zrobisz? Weźmiesz pierwszą z góry, czy wszystkie po kolei?
  3. Nie używaj polskich nazw identyfikatorów.
0
  1. Wyobraź sobie, że masz 10 książek ułożone jedna na drugiej i chcesz je wszystkie przemieścić z łóżka na biurko. Co w takiej sytuacji zrobisz? Weźmiesz pierwszą z góry, czy wszystkie po kolei?

kwestia dyskusyjna wszystko zależy od wagi i rozmiaru książek.

z konstruktorem sobie poradziłem.

Kiedy tak naprawdę używamy konstruktora kopiującego lub przypisania? sądziłem że jak korzystamy z wskaźników lub tablic i konstruktor kopiujący domyślny ma problemy lecz w tym programie domyślny działa dobrze.

 Stos::Stos(const Stos &sto)
{

if(sto.wierzcholek==NULL)
wierzcholek=NULL;
else
{
wierzcholek=new LIFO;
wierzcholek->liczba=sto.wierzcholek->liczba;

LIFO *pom=wierzcholek;
LIFO *copy=new LIFO;

copy=sto.wierzcholek->nastepny;

while(copy!=NULL)
{
	pom->nastepny=new LIFO;
	pom=pom->nastepny;
	pom->liczba=copy->liczba;


	copy=copy->nastepny;
}
pom->nastepny=NULL;

delete pom;
delete copy;


}
}
0

Przypisanie:

a = b;

KK:

return a;
funkcja(a);
b(a);
0

masz wycieki pamięci:

  • usun_z_wierzchu()
  • w twoim konstruktorze kopiującym
Stos::Stos(const Stos &sto):wierzcholek(0)
  {
   for(LIFO *prev=0,*i=sto.wierzcholek;i;prev=pom,i=i->nastepny)
     {
      LIFO *pom=new LIFO;
      pom->liczba=i->liczba;
      pom->nastepny=0;
      (prev?prev->nastepny:wierzcholek) =pom;
     }
  }

a jak dodasz konstruktor do LIFO:

LIFO(int liczba,LIFO *nastepny=0):liczba(liczba),nastepny(nastepny) {}

to:

Stos::Stos(const Stos &sto):wierzcholek(0)
  {
   for(LIFO *prev=0,*i=sto.wierzcholek;i;prev=pom,i=i->nastepny) (prev?prev->nastepny:wierzcholek)=new LIFO(i->liczba);
  }

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