Usuwanie elementow z listy przez wartosc

0

Stworzyłem listę jednokierunkowa i trzy funkcje dodawanie elementu, usuwanie i wyświetlanie. Wszystko działa po za usuwaniem elementu ze środka lub końca listy. Mógłby mi ktoś pomóc ?

 

#include<iostream>
#include<string>
using namespace std;
 
struct osoba	
{
	string imie;
	string nazwisko;
	osoba *nastepny;			//wsk na nastepna osobe
	osoba();					//konstruktor
};

osoba::osoba()
{
	nastepny=0;
}

struct lista
{
	osoba *pierwszy;									//wsk na pierwsza osobe
	void dodaj(string imie , string nazwisko);			// funkcja dodajaca elemnty listy
	void wyswietl();									//funkcja wyswietlajaca elemnty listy
	void usun(string imie);								//funkcja usuwajaca elemnty listy
	lista();					//konstruktor

};

void lista::dodaj(string imie, string nazwisko)
{
	osoba *nowa = new osoba;			//nowy lement osoba
	nowa->imie = imie;
	nowa->nazwisko = nazwisko;

	if(pierwszy == 0)					//jezeli ejst to pierwszy elemnt listy
	{
		pierwszy = nowa;
	}
	else                                  //jezeli to nie jest pierwszy element
	{
		osoba *temp = pierwszy;
		while(temp->nastepny)
		{
			temp=temp->nastepny;
		}
		temp->nastepny = nowa;
		nowa->nastepny=0;															
	}
	
	
}

void lista::wyswietl()
{
	osoba *temp=pierwszy;								//wskaznika na pierwszy elemnt listy
	while(temp)
	{
		cout<<temp->imie<<"   "<<temp->nazwisko<<endl;
		temp=temp->nastepny;
	}
}

void lista::usun(string imie)
{
	osoba *temp=pierwszy;
	int licznik=1;									//licznik zliczajacy ktory to elemnt listy
	while(temp)		
	{
		if(temp->imie==imie)						//jesli znajdzie element o podanym imieniu
		{
			if(temp==pierwszy)						//jesli trzeba usunac pierwszy element	
			{
				pierwszy=temp->nastepny;
			}
			else if(temp!=pierwszy && temp->nastepny!=0)			//jesli srodkowy elemnt
			{
				osoba *temp2=pierwszy;
				for(int i=0 ; i<(licznik-1) ; i++)					
				{
					temp2->nastepny;								//wsk na elemnt (n-1)
				}
				temp->nastepny = temp2;								//przypisanie elemntowi (n-1) wskaznika na (n+1)
			}
			else                                                 //jesli osttani element
			{
				temp->nastepny=0;

			}

		}
		licznik++;
		temp=temp->nastepny;
	}
}

lista::lista()
{
	pierwszy=0;
}

int main()
{
	lista *LISTA= new lista;
	string imie, nazwisko;
	for(int i=0 ; i<5; i++)
	{
		cin>>imie;
		cin>>nazwisko;
		LISTA->dodaj(imie,nazwisko);
	}
	cin>>imie;
	LISTA->usun(imie);
	LISTA->wyswietl();
    system("pause");
}
0

Wg Twojego rozumowania to else if mógłby wyglądać tak:

else if(temp->nastepny != 0) {
    osoba *temp2=pierwszy;
    while(temp2->nastepny != temp)
        temp2 = temp2->nastepny;
    temp2->nastepny = temp->nastepny;
}

Ostatniego elsa spróbuj sam. Najlepiej narysuj sobie to na kartce, wtedy wszystko jest jasne. Możesz też poszukać w Internecie jak to powinno być porządnie zrobione.

0

zdecydowanie za dużo nakombinowałeś:

void lista::usun(const string &imie)
  {
   for(osoba **i=&pierwszy;*i;)
     {
      osoba *curr=*i;
      if(curr->imie==imie)
        {
         *i=curr->nastepny;
         delete curr;
        }
      else i=&(curr->nastepny);
     }
  }

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