Listy jednokierunkowe - dodawanie przed wybrany element

0

Cześć !

Chciałbym się poradzić czy dobrze rozumiem, zapisany kod bo niestety zapętla mi się on i nie widzę błędu.

Tak wygląda moja struktura listy

struct Slista
{
	string napis;
	Slista* nastepny;
};

i sprawiający kawałek kodu.

	if (pozycja == 1)
	{
		aktualny = new Slista;
		cin.ignore();
		getline(cin, aktualny->napis);
		aktualny->nastepny = glowa;
		glowa = aktualny;
	}
	else if (pozycja > 1 && pozycja != n)
	{
		nastepny = glowa;
		for (int i = 1; i < pozycja; i++)
		{
			aktualny = aktualny->nastepny;
		}
		aktualny = new Slista;
		aktualny->nastepny->nastepny = kolejny;
		cin.ignore();
		getline(cin, aktualny->napis);
	}

Nie jestem do konca przekonany jestem czy dobrze rozumuje zapisywanie przed wybrany element do list jednokierunkowych.
W else if postanowiłem najpierw określić za pomocą pętli for adres wskaznika na pozycji ntej.
Nastepnie tworze nowy kubełek dla aktualnego. W nastepnej linii okreslam ze nastepny adres kolejnego wskaznika.
No i na koncu zapisuje w aktualnym nowy napis.
Niestety tak zapisana funkcja zapetla sie.
Prosiłbym o jakieś wskazówki jak to rozwiązać.
Pozdrawiam

0

Nie wiem za bardzo jak zachowuje się zmienna pozycja i co dzieje się poza ifem, więc z tym niewiele pomogę.

  1. Czym objawia się zapętlenie? - to niekoniecznie będzie związane z błędem w ifie.
    Odnośnie zrozumienia gałęzi else if:
        nastepny = glowa;
        for (int i = 1; i < pozycja; i++)
        {
            aktualny = aktualny->nastepny;
        }
        aktualny = new Slista;
        aktualny->nastepny->nastepny = kolejny;
        cin.ignore();
        getline(cin, aktualny->napis);
  • Raz jest nastepny zmienną, potem przypisujesz kolejny, mam wrażenie, że to miała być jedna zmienna, ale mogę się mylić. Tu coś nie gra.
  • Jeżeli chcesz wstawić węzeł przed już istniejący, który nie jest głową listy, musisz zapamiętać wskaźnik na jego poprzednik. Tu tego może brakować - w zależności od tego co mają znaczyć zmienne pozycja oraz aktualny.
  • Za wcześnie tworzysz nowy element, w efekcie nadpisujesz wartość, której szukałeś w pętli. Teraz aktualny->nastepny ma niezdefiniowaną wartość.
    Jak dla mnie, popraw nazwy zmiennych tak, żeby były jednoznaczne i dobrze opisywały czym są, będzie o wiele łatwiej czytać i interpretować kod.

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