Napisałem listę wskaźnikową i podczas tworzenia 1000 elementów, a następnie ich usuwania w drugiej pętli nie dość że pamięć zajmowana przez program nie maleje to na dodatek rośnie. W przypadku gdy tworzę i usuwam po pierwszym elemencie okazuje się że program zajmuje mniej pamięci niż przy jego odpaleniu. Prosiłbym o jakieś wskazówki :)
Oto klasa
plik .h:
#include <string>
using namespace std;
struct Punkt{
float x;
float y;
float z;
Punkt * nastepny; // wskaznik na nastepny element listy
};
class Lista
{
Punkt *pierwszy; // wskaznik na pierwszy element listy
public:
void dodaj(string wybor,float x,float y, float z);
void wstaw(int nr,float x,float y, float z);
void usun(int nr);
int wyszukaj(float x, float y,float z);
Lista(void);
~Lista(void);
};
.cpp :
#include "Lista.h"
#include <iostream>
#include <string>
using namespace std;
Lista::Lista(void)
{pierwszy = 0; // zerowanie wskaznika wskazujacego na poczatek listy ( bo jest pusta)
}
void Lista::dodaj(string wybor,float x,float y, float z){ // dodaje element na koniec listy, przyjmuje stringa (p lub k) ktory mowi o tym,
// gdzie ma byc dodany punkt (poczatek lub koniec) oraz wspolrzedne do struktury
Punkt * nowy = new Punkt; // tworzymy nowy element listy
nowy->x = x;
nowy->y = y;
nowy->z = z;
nowy->nastepny = NULL; // ustawiamy wskaznik nowego elementu na 0
if (pierwszy == 0){ // przypadek gdy lista jest pusta
cout << "dodaje pierwszy"<<endl;
pierwszy = nowy; // ustawiamy wskaznik listy na pierwszy jej element na nowo stworzony element
}
else if((wybor == "p")&&(pierwszy != 0)){ // przypadek gdy lista nie jesty pusta i dodajemy element na poczatek
cout << "dodaje na poczatek"<<endl;
nowy->nastepny = pierwszy; // nowy element wskazuje na ten ktory byl wczeesniej pierwszy
pierwszy = nowy; // wskaznik wskazujacy na pierwszy element listy wskazuje na nowy element
}
else if((wybor == "k")&&(pierwszy != 0) ) // przypadek gdy lista nie jesty pusta i dodajemy element na koniec
{ cout << "dodaje na koniec"<<endl;
Punkt *temp = pierwszy; // tworzymy zmienna pomocnicza sluzaca do przemieszczania sie po tablicy
while(temp->nastepny){ // petla sluzaca do przemieszczenia sie wskaznikiem temp do ostatniego elementu tablicy
temp = temp->nastepny;
}
temp->nastepny = nowy; // byly ostatni element wskazuje na nowy element
}
}
void Lista::wstaw(int nr,float x,float y, float z){ // wstawia element w dowolne miejsce listy, przyjmuje numer miejsa w ktorym ma znajdowac sie ten element oraz wspolrzedne do struktury
if (nr == 1){
Punkt * nowy = new Punkt; // tworzymy nowy element listy
nowy->x = x;
nowy->y = y;
nowy->z = z;
nowy->nastepny = pierwszy; // nowy element wskazuje na ten ktory byl wczesniej pierwszy
pierwszy = nowy; // wskaznik wskazujacy na pierwszy element listy wskazuje na nowy element
}
if (nr> 1){
Punkt * nowy = new Punkt; // tworzymy nowy element listy
nowy->x = x;
nowy->y = y;
nowy->z = z;
Punkt* temp = pierwszy; // pomocniczy wskaznik
int j= 1; // zmienna pomocnicza sluzaca do identyfikowania numeru obiektu na ktorym sie znajdujemy
while(temp->nastepny){ // przechodzimy na nastepny element do momentu az bedziemy przed interesujacym nas miejscem
if(j+1==nr)break;
temp = temp->nastepny;
}
if(temp->nastepny == 0 && j != nr) //wskazanie elementu przekraczajacego liste
if (temp->nastepny == 0 && j == nr){ // przypadek gdy dodajemy element na koniec listy
temp ->nastepny = nowy;
nowy ->nastepny = 0;
}
if (temp->nastepny != 0 && j == nr){ // przypadek gdy istnieje element na miejscu na ktore chcemy dodac
nowy->nastepny = temp ->nastepny; // nowo powstaly element wskazuje teraz na ten ktory znajdowal sie na jego miejscu
temp->nastepny = nowy; // element na miejscu nizszym od interesujacego nas wskazuje na nowy element
}
}
}
void Lista::usun(int nr){ // usuwa element z listy, przyjmuje nr elementu ktory ma usunac
if (nr == 1){ // usuwanie pierwszego elementu
cout <<"usuwam pierwszy"<<endl;
Punkt *temp = pierwszy; // tworzymy wskaznik ktory wskazuje na poczatek listy
pierwszy = temp->nastepny; // wskaznik na pierwszy element listy wskazuje teraz na drugi element listy
delete temp; // usuwamy byly pierwszy element listy
}
if (nr >1){
Punkt *temp = pierwszy; // tworzymy wskaznik ktorym bedziemy sie poruszac po liscie i ustawiamy go na poczatek listy
int j = 1; // tworzymy zmienna pomocnicza ktora pomoze nam znalesc nasz element
while (temp){ // ustawianie wskaznika przed miejsce ktore nas interesuje
if(j+1 == nr){
break;
}
temp = temp->nastepny;
j++;
}
if(temp->nastepny == 0 && nr!=j){} //wskazanie elementu przekraczajacego liste - nie rob nic
else if(temp->nastepny->nastepny == 0){ // jesli usuwamy ostatni element listy;
cout << "usuwam ostatni element"<<endl;
delete temp->nastepny;
temp->nastepny = 0;
}
else if(temp->nastepny->nastepny != 0){ // jesli usuwamy element ktowy nie jest ani pierwszy ani ostatni
cout << "usuwam srodkowy element"<<endl;
Punkt *temp2 = temp->nastepny; // wskaznik przechowujacy adred interesujacego nas elementu
temp->nastepny = temp->nastepny->nastepny; //element przed usuwanym elementem wskazuje na element za nim
delete temp2; // usuwamy nas interesujacy element
}
}
}
int Lista::wyszukaj(float x,float y,float z){ // wyszukuje element o konkretnych wspolrzednych
return 0;
}
oraz main przy ktorym wystepuje problem :
#include "Lista.h"
#include "cstdlib"
int main(){
Lista *oLista = new Lista;
system("pause");
for(int i = 1; i<=1000;++i)
{
oLista->dodaj("k",1,1,2);
}
system("pause");
for(int i = 1000; i>=1;--i)
{
oLista->usun(i);
}
system("pause");
return 0;
}