Błąd przy kopiowaniu listy

0

Witam!
Piszę listę 2 kierunkową i wywala mi taki błąd:
<image>Bez tytułu</image>
Oto kod:

void dodaj(lista *dodawana_lista)
		{
			if(pierwszy==NULL)
			{
				obiekt=new element(0,dodawana_lista->wartość(0));
				pierwszy=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=NULL;
				aktualny=obiekt;
			}
			else
			{
				aktualny=pierwszy;
				while(!aktualny->następny==NULL)
				{
					aktualny=aktualny->następny;
				}
				obiekt=new element(aktualny->id+1, dodawana_lista->wartość(0));
				aktualny->następny=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=aktualny;
				aktualny=obiekt;
			}
			unsigned long long int ilość=dodawana_lista->ilość();
			unsigned long long int i=1;
			while(i<ilość)
			{
				obiekt=new element(aktualny->id+1, dodawana_lista->wartość(i));
				aktualny->następny=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=aktualny;
				aktualny=obiekt;
				i++;
			}//w tym miejscu jest błąd po ostatnim obrocie tej pętli
		} 
0

Zdjęcie z błędem w załączniku

0

Tu jest kod tej listy:

 template <typename typ>
	class lista
	{
	private:
		class element
		{
		public:
			element *następny;
			element *poprzedni;
			unsigned long long int id;
			typ wartość;
			element(unsigned long long int parametr_identyfikator, typ parametr_wartość)
			{
				id=parametr_identyfikator;
				wartość=parametr_wartość;
			}
			element(unsigned long long int parametr_identyfikator)
			{
				id=parametr_identyfikator;
				wartość=NULL;
			}
		};
		element *obiekt;
		element *aktualny;
		element *pierwszy;
	public:
		void operator=(lista wynik)
		{
			równa(wynik);
		}
		void operator+=(lista dodawana_lista)
		{
			dodaj(&dodawana_lista);
		}
		void operator+(typ wartość)
		{
			dodaj(wartość);
		}
		void operator-(unsigned long long int identyfikator)
		{
			usuń(identyfikator);
		}
		void operator()(unsigned long long int identyfikator, typ nowa_wartość)
		{
			edytuj(identyfikator,nowa_wartość);
		}
		bool operator==(lista porównanie)
		{
			unsigned long long int ilość=ilość();
			if(ilość!=porównanie.ilość())
			{
				return false;
			}
			else
			{
				for(unsigned long long int i=0;i<ilość;i++)
				{
					if(wartość(i)!=porównanie.wartość(i))
					{
						return false;
					}
				}
			}
			return true;
		}
		bool operator>(lista porównanie)
		{
			if(ilość()>porównanie.ilość())
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		bool operator<(lista porównanie)
		{
			if(ilość()<porównanie.ilość())
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		bool operator>=(lista porównanie)
		{
			unsigned long long int ilość=ilość();
			if(ilość!=porównanie.ilość())
			{
				if(ilość<porównanie.ilość())
				{
					return false;
				}
			}
			else
			{
				for(unsigned long long int i=0;i<ilość;i++)
				{
					if(wartość(i)!=porównanie.wartość(i))
					{
						return false;
					}
				}
			}
			return true;
		}
		bool operator<=(lista porównanie)
		{
			unsigned long long int ilość=ilość();
			if(ilość!=porównanie.ilość())
			{
				if(ilość>porównanie.ilość())
				{
					return false;
				}
			}
			else
			{
				for(unsigned long long int i=0;i<ilość;i++)
				{
					if(wartość(i)!=porównanie.wartość(i))
					{
						return false;
					}
				}
			}
			return true;
		}
		typ operator[](int identyfikator)
		{
			return wartość(identyfikator);
		}

		void dodaj()
		{
			if(pierwszy==NULL)
			{
				obiekt=new element(0);
				pierwszy=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=NULL;
			}
			else
			{
				aktualny=pierwszy;
				while(!aktualny->następny==NULL)
				{
					aktualny=aktualny->następny;
				}
				obiekt=new element(aktualny->id+1);
				aktualny->następny=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=aktualny;
			}
		}
		void dodaj(typ wartość)
		{
			if(pierwszy==NULL)
			{
				obiekt=new element(0, wartość);
				pierwszy=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=NULL;
				aktualny=obiekt;
			}
			else
			{
				aktualny=pierwszy;
				while(!aktualny->następny==NULL)
				{
					aktualny=aktualny->następny;
				}
				obiekt=new element(aktualny->id+1, wartość);
				aktualny->następny=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=aktualny;
			}
		}
		void dodaj(typ *wartość, unsigned long long int ilość)
		{
			if(pierwszy==NULL)
			{
				obiekt=new element(0, wartość[0]);
				pierwszy=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=NULL;
				aktualny=obiekt;
			}
			else
			{
				aktualny=pierwszy;
				while(!aktualny->następny==NULL)
				{
					aktualny=aktualny->następny;
				}
				obiekt=new element(aktualny->id+1, wartość[0]);
				aktualny->następny=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=aktualny;
				aktualny=obiekt;
			}
			for(unsigned long long int i=1;i<ilość;i++)
			{
				obiekt=new element(aktualny->id+1, wartość[i]);
				aktualny->następny=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=aktualny;
				aktualny=obiekt;
			}
		}
		void dodaj(lista *dodawana_lista)
		{
			if(pierwszy==NULL)
			{
				obiekt=new element(0,dodawana_lista->wartość(0));
				pierwszy=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=NULL;
				aktualny=obiekt;
			}
			else
			{
				aktualny=pierwszy;
				while(!aktualny->następny==NULL)
				{
					aktualny=aktualny->następny;
				}
				obiekt=new element(aktualny->id+1, dodawana_lista->wartość(0));
				aktualny->następny=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=aktualny;
				aktualny=obiekt;
			}
			unsigned long long int ilość=dodawana_lista->ilość();
			unsigned long long int i=1;
			while(i<ilość)
			{
				obiekt=new element(aktualny->id+1, dodawana_lista->wartość(i));
				aktualny->następny=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=aktualny;
				aktualny=obiekt;
				i++;
			}
		}
		void usuń(unsigned long long int identyfikator)
		{
			if(pierwszy!=NULL)
			{
				aktualny=pierwszy;
				if(pierwszy->id==identyfikator)
				{			
					if(pierwszy->następny==NULL)
					{
						pierwszy=NULL;
						aktualny=NULL;
					}
					else
					{
						pierwszy=pierwszy->następny;
						pierwszy->poprzedni=NULL;
					}
				}
				else
				{
					while(true)
					{
						if(aktualny==NULL)
						{
							break;
						}
						if(aktualny->id==identyfikator)
						{
							if(aktualny->następny!=NULL)
							{
								aktualny->następny->poprzedni=aktualny->poprzedni;
								aktualny->poprzedni->następny=aktualny->następny;
							}
							else
							{
								aktualny->poprzedni->następny=NULL;
							}
							break;
						}
						aktualny=aktualny->następny;
					}
				}
				unsigned long long int i=0;
				aktualny=pierwszy;
				while(true)
				{
					if(aktualny==NULL)
					{
						break;
					}
					aktualny->id=i;
					aktualny=aktualny->następny;
					i++;
				}
			}
		}
		void usuń_adres(element *adres)
		{
			if(adres!=NULL)
			{
				if(adres->następny==NULL)
				{
					aktualny->poprzedni->następny=NULL;
				}
				else if(adres->poprzedni==NULL)
				{
					aktualny->następny->poprzedni=NULL;
				}
				else
				{
					aktualny->następny->poprzedni=aktualny->poprzedni;
					aktualny->poprzedni->następny=aktualny->następny;
				}
				unsigned long long int i=0;
				aktualny=pierwszy;
				while(true)
				{
					if(aktualny==NULL)
					{
						break;
					}
					aktualny->id=i;
					aktualny=aktualny->następny;
					i++;
				}
			}
		}
		void edytuj(unsigned long long int identyfikator, typ nowa_wartość)
		{
			aktualny=pierwszy;
			while(true)
			{
				if(aktualny==NULL)
				{
					break;
				}
				else
				{
					if(aktualny->id==identyfikator)
					{
						aktualny->wartość=nowa_wartość;
						break;
					}
					aktualny=aktualny->następny;
				}
			}
		}
		void równa(lista wynik)
		{
			delete[] obiekt;
			pierwszy=NULL;
			aktualny=NULL;
			dodaj(&wynik);
		}
		void czyść()
		{
			delete[] obiekt;
			aktualny=NULL;
			pierwszy=NULL;
		}
		void sortuj_rosnąco()
		{
			element *adres=NULL;
			element *tmp=pierwszy;
			aktualny=pierwszy;
			while(true)
			{
				if(aktualny==NULL)
				{
					break;
				}
				else
				{
					typ min=aktualny->wartość;
					while(true)
					{
						if(tmp==NULL)
						{
							break;
						}
						if(tmp->wartość<=min)
						{
							min=tmp->wartość;
							adres=tmp;
						}
						tmp=tmp->następny;
					}
					typ tmp_wartość=aktualny->wartość;
					aktualny->wartość=adres->wartość;
					adres->wartość=tmp_wartość;
				}
				aktualny=aktualny->następny;
				tmp=aktualny;
			}
		}
		void sortuj_malejąco()
		{
			element *adres=NULL;
			element *tmp=pierwszy;
			aktualny=pierwszy;
			while(true)
			{
				if(aktualny==NULL)
				{
					break;
				}
				else
				{
					typ min=aktualny->wartość;
					while(true)
					{
						if(tmp==NULL)
						{
							break;
						}
						if(tmp->wartość>=min)
						{
							min=tmp->wartość;
							adres=tmp;
						}
						tmp=tmp->następny;
					}
					typ tmp_wartość=aktualny->wartość;
					aktualny->wartość=adres->wartość;
					adres->wartość=tmp_wartość;
				}
				aktualny=aktualny->następny;
				tmp=aktualny;
			}
		}
		unsigned long long int ilość()
		{
			if(pierwszy==NULL)
			{
				return NULL;
			}
			aktualny=pierwszy;
			unsigned long long int wynik=0;
			while(true)
			{
				if(aktualny==NULL)
				{
					break;
				}
				wynik++;
				aktualny=aktualny->następny;
			}
			return wynik;
		}
		unsigned long long int szukaj(typ wartość)
		{
			aktualny=pierwszy;
			while(true)
			{
				if(aktualny==NULL)
				{
					break;
				}
				if(aktualny->wartość==wartość)
				{
					return aktualny->id;
					break;
				}
				aktualny=aktualny->następny;
			}
			return NULL;
		}
		element *szukaj_adres(typ wartość)
		{
			aktualny=pierwszy;
			while(true)
			{
				if(aktualny==NULL)
				{
					break;
				}
				if(aktualny->wartość==wartość)
				{
					return aktualny;
					break;
				}
				aktualny=aktualny->następny;
			}
			return NULL;
		}
		element *adres(unsigned long long int identyfikator)
		{
			aktualny=pierwszy;
			while(true)
			{
				if(aktualny==NULL)
				{
					break;
				}
				if(aktualny->id==identyfikator)
				{
					return aktualny;
					break;
				}
				aktualny=aktualny->następny;
			}
			return NULL;
		}
		typ wartość(unsigned long long int identyfikator)
		{
			aktualny=pierwszy;
			while(true)
			{
				if(aktualny==NULL)
				{
					break;
				}
				if(aktualny->id==identyfikator)
				{
					return aktualny->wartość;
					break;
				}
				aktualny=aktualny->następny;
			}
			return NULL;
		}

		lista()
		{
			pierwszy=NULL;
			aktualny=NULL;
			obiekt=NULL;
		}
		lista(long long int ilość)
		{
			obiekt=new element(0);
			pierwszy=obiekt;
			obiekt->następny=NULL;
			obiekt->poprzedni=NULL;
			aktualny=pierwszy;
			for(long long int i=1;i<ilość;i++)
			{
				obiekt=new element(aktualny->id+1);
				aktualny->następny=obiekt;
				obiekt->następny=NULL;
				obiekt->poprzedni=aktualny;
				aktualny=aktualny->następny;
			}

		}
		~lista()
		{		
			delete[] obiekt;
			delete[] aktualny;
			delete[] pierwszy;
		}
	};

Jeśli możecie sprawdzicie też inne błędy bo ten błąd jednak nie pojawia się tylko przy kopiowaniu.

0

operator= bazuje na konstruktorze kopiującym którego nie ma.

0
_13th_Dragon napisał(a):

operator= bazuje na konstruktorze kopiującym którego nie ma.

A czy funkcja void dodaj(lista *dodawana_lista) nie jest konstruktorem kopiującym?

0

Ale to chyba nie wyjaśnia tego błędu (chyba) pamięci który jest w załączniku.

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