Lista Jednokierunkowa c++ pomoc

0

Witam , mam problem otóż : mam listę a w niej dane i chcę skasować z niej dane które podam (w moim wypadku to 2) mam taki kod

#include <iostream>
using namespace std;

struct lista
{
	lista *next;
	int dane;
};

int wypelnij(lista *&list , int dane)
{
	lista *pomoc = new lista;
	pomoc->next = list;
	pomoc->dane = dane;
	list  = pomoc;

	return 0;
}

void wypisz(const lista* wyp)
{

	while(wyp != NULL )
	{
		cout << wyp->dane << endl;
		wyp = wyp->next ;
	}

	return;
}

void kasuj(lista *&kas , int da)
{

	lista *pomoc= kas;
    
	while(pomoc->next != NULL)
	{
		if(pomoc->dane == da)
		{
			lista *pom = pomoc->next;
			delete pomoc;
			pomoc=pom;

		}
		else
		{
			pomoc = pomoc->next ;
		}

		 
	}
	delete pomoc;

	return ;
}

int main()
{
	lista *wsk=NULL;

	wypelnij(wsk,1);
	wypelnij(wsk,2);
	wypelnij(wsk,3);
    
	kasuj(wsk,2);
       wypisz(wsk);
	

	cin.get();

 return 0;
}

Ale wywala błąd;/ siedzę nad tym z 7H i nie wiem jak to zrobić dzięki za pomoc;

EDIT // Tu błąd który wywala kompilator : Unhandled exception at 0x00411581 in HackMeTre.exe: 0xC0000005: Access violation reading location 0xfeeefef2. czyli coś z odczytem pamięci.

0

Masz dwa razy:
delete pomoc.

0

while(pomoc->next != NULL) zamień na:
while(pomoc!=NULL) // w zasadzie te !=NULL mozna sobie pominac i wystarczy samo while(pomoc)

poza tym takie rozwiazanie bedzie zle dzialac przy usuwaniu pierwszego elementu

0

@krwq : Wiem ;)

Po skasowaniu 2 pomoc wyświetla złe wyniki

Wyniki z programu :
3
37558936
37556904
37555240
37547192

Może jakieś pomysły?
bo ja już sam nie wiem...

1
void kasuj(lista *&kas , int da)
{
  lista *pomoc = kas;
  lista *prev = NULL;

  while(pomoc != NULL && pomoc->dane != da)
  {
    prev = pomoc;
    pomoc = pomoc->next;
  }

  if (pomoc != NULL)
  { 
    if (prev != NULL)
      prev->next = pomoc->next;
    else // pomoc jest pierwszym wezlem
      kas = kas->next;

    delete pomoc;
  }
}
0

Dzięki działa jak należy :)

0

Nie będę zaśmiecał forum i napiszę tu : ulepszyłem nieco ta listę i dodałem ile ma kasować wybranych danych i chcę dodać od kąd ma je usuwać tzn od którego elementu z listy i wszystko było by ok tylko że gdy ma wykasować element który znajduje się na końcu listy to przy wyświetlaniu danych program wpada w pętle ;/ ale tak się dzieje tylko gdy ma kasować od wybranego elementu

oto kod :

 #include <iostream>

using namespace std;

struct lista
{
	lista *next;
	int dane;
};
//-----------------------------------------------------------------------
lista *wypelnij(lista *&list , int dane)
{
	lista *pomoc = new lista;
	pomoc->next = list;
	pomoc->dane = dane;
	list  = pomoc;

	return 0;
}
//---------------------------------------------------------------------
void wypisz(const lista* wyp)
{

	while(wyp != NULL)
	{
		cout << wyp->dane << endl;
		wyp = wyp->next ;
	}

	return;
}
//-----------------------------------------------------------------------
void kasuj(lista *&kas , int da , int ilosc , int miejsce)

{
	lista *pomoc = kas;
    lista *prev = NULL;
	while(miejsce)	
	{  

		if(pomoc != NULL)
		{
			prev = pomoc;
	        pomoc = pomoc->next;
		}
        		
		miejsce--;		
	}
    
	while(ilosc)
	{
	while(pomoc != NULL && pomoc->dane !=da)
    {
			prev = pomoc;
            pomoc = pomoc->next;
	}

    if (pomoc != NULL)
    { 		
        if (prev != NULL)
		{
			prev->next = pomoc->next;
		}
    else // pomoc jest pierwszym wezlem 
		kas = kas->next;
   
    delete pomoc;
	pomoc=kas;
    }
	ilosc--;
}
	return ;
}
//----------------------------------------------------------------------
int main()
{
	lista *wsk=NULL;

	wypelnij(wsk,2);
	wypelnij(wsk,2);
	wypelnij(wsk,2);
	wypelnij(wsk,2);
	wypelnij(wsk,2);
    
	kasuj(wsk,2,5,0); // kasuj(wskaznik,dane,ilosc,miejsce)
        wypisz(wsk);

	cin.get();

 return 0;
}

Dzięki za pomoc;

1

Czyli chcesz zacząć przeszukiwać listę od miejsce. Następnie usunąć ilosc węzłów, które w polu dana mają da.
Najpierw jak powinna wyglądać koncepcja, później implementacja.
Przesuwasz się po liście o miejsce węzłów. Zaczynasz szukać węzła z daną równą da. Usuwasz go. Szukasz kolejnego, aż znajdziesz w sumie ilosc.

void kasuj(lista *&kas, int da, int ilosc, int miejsce)
{
    lista *node = kas;
    lista *prev = NULL;
    
    for(int i=0; i < miejsce && node != NULL; i++)
    {
        prev = node;
        node = node->next;
    }
    if (node == NULL) return;
    
    
    while (ilosc > 0 && node != NULL) // !!! może okazać się że już doszedłeś do końca, a nie znalazłeś "ilosc" węzłów do usunięcia
    {
        while(node != NULL && node->dane != da)
        {
            prev = node;
            node = node->next;
        }
 
        if (node != NULL)
        {                 
            if (prev != NULL)
                prev->next = node->next;
            else // pomoc jest pierwszym wezlem 
                kas = kas->next;
 
            delete node;
            node = prev->next; // !!! węzeł prev już sprawdzałeś, jego dana nie pasowała do "da", dlatego dalej szukasz od kolejnego, a nie od początku listy
        }
        ilosc--;
    }
}

Zobacz linijki z komentarzami zaczynające się od !!!

1

zmień to na
if (prev != NULL && prev->next !=NULL) node = prev->next;
else break;

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