Ciao gente, stato facendo un esercizio sulla creazione di linked list e rimozione di un elemento all'interno di essa. Tutto funziona e riesco a rimuovere gli elementi con l'apposita funzione "Remove Element" TRANNE che se provo a rimuovere il primo elemento della lista, nel codice sotto sarebbe il numero 10 "RemoveElement(NumberList, 10);"
Sospetto che il problema stia nel fatto che la funzione RemoveElement( ) prenda l'argument List come pointer to reference, e quando all'interno della funzione modifico dove punta il NumberList con le righe:
non sto di fatto modificando il NumberList usato come argument nella chiamata alla funzione. Infatti il crash penso sia dovuto al fatto che quando eseguo il codice e faccio cout della List, il primo elemento della mia list cerca ancora di accedere all'address che ho "rilasciato" (tramite delete) nel codice sopra.
E' quello il problema, giusto?
E se si, come faccio a far sì che il codice sopra faccia quello che voglio io, ovvero far si che il pointer al primo elemento della mia List punti al secondo elemento nel caso il primo dovesse venire rimosso?
Sospetto che il problema stia nel fatto che la funzione RemoveElement( ) prenda l'argument List come pointer to reference, e quando all'interno della funzione modifico dove punta il NumberList con le righe:
Codice:
NumberList = p_current->p_next;
delete p_current;
non sto di fatto modificando il NumberList usato come argument nella chiamata alla funzione. Infatti il crash penso sia dovuto al fatto che quando eseguo il codice e faccio cout della List, il primo elemento della mia list cerca ancora di accedere all'address che ho "rilasciato" (tramite delete) nel codice sopra.
E' quello il problema, giusto?
E se si, come faccio a far sì che il codice sopra faccia quello che voglio io, ovvero far si che il pointer al primo elemento della mia List punti al secondo elemento nel caso il primo dovesse venire rimosso?
Codice:
#include <iostream>
using namespace std;
struct Number
{
int Num = 0;
Number* p_next = NULL;
};
Number* AddElement(Number* NumberList)
{
Number* p_new_num = new Number;
p_new_num->Num = NumberList->Num + 1;
p_new_num->p_next = NumberList;
return p_new_num;
}
void RemoveElement(Number *& NumberList,int n)
{
Number* p_current = NumberList;
Number* p_previous_temp = NULL;
//While not at the end of the list
while (p_current != NULL)
{
//If we found the element that need to be removed from list
if (p_current->Num == n)
{
//If we are at the first element in the list
if (p_previous_temp == NULL)
{
//List now has a new first element
NumberList = p_current->p_next;
delete p_current;
return;
}
//Every other element that is not the first one
else
{
p_previous_temp->p_next = p_current->p_next;
delete p_current;
return;
}
}
//Advance the two pointers
p_previous_temp = p_current;
p_current = p_current->p_next;
}
}
int main()
{
Number* NumberList = new Number;
for (int i = 0; i < 10; i++)
{
NumberList = AddElement(NumberList);
}
Number* p_temp = NumberList;
RemoveElement(NumberList, 5);
RemoveElement(NumberList, 3);
RemoveElement(NumberList, 7);
RemoveElement(NumberList, 9);
RemoveElement(NumberList, 10);
while (p_temp != NULL)
{
cout << p_temp->Num << " ";
p_temp = p_temp->p_next;
}
}