Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

4ever4

Alfabetyczne sortowanie listy w drzewie

Rekomendowane odpowiedzi

Witam mam problem, z którym nie potrafię sobie poradzić. Chodzi o to,aby wczytać dane z pliku do listy, sortując ją alfabetycznie.

przykładowy plik wejściowy:

 

gr1 kokos wlasciwy

gr2 mamutowiec olbrzymi

gr5 jesion wyniosly

gr8 dab japonski

gr4 wawrzyn szlachetny

gr2 baobab afrykanski

gr1 jodla pospolita

gr1 sosna wejmutka

 

 

plik wyjściowy powinien być postaci:

gr1

jodla pospolita

kokos wlasciwy

sosna wejmutka

 

gr2

baobab afrykanski

mamutowiec olbrzymi

 

gr4

wawrzyn szlachetny

 

gr5

jesion wyniosly

 

gr8

dab japonski

 

Ni jak moapisałem program wykorzystujący drzewo i listę. Wczytując zawartość pliku do listy, jeśli program napotka wyraz mniejszy od pierwszego na liście, to dany wyraz dokłada na początek listy. Natomiast, jeśli napotka większy od pierwszego na liście, to dokłada go na koniec listy. Przy takich warunkach program działa poprawnie. Natomiast jeśli dołożę warunek, aby lista była sortowana alfabetycznie-program nie działa(kompiluje się, ale crashuje). Prosiłbym o wskazanie przyczyny występowania takiej sytuacji można temu zapobiec, ponieważ nie mam pomysłu jak to zrobić. Poniżej przesyłam mój kod:

 

 

#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <fstream>
#include <string>

using namespace std;
fstream plik;

struct lista
{
string dana_reszta1;
string dana_reszta2;
lista* nastepna;
};

struct wezel
{
string dana;
lista* glowa;
wezel*lewe;
wezel*prawe;
};


void drukuj_drzewo (wezel* korzen)
{
if (korzen != nullptr)
{
	drukuj_drzewo(korzen->lewe);
	cout << korzen->dana << endl;
	lista*wsk = korzen->glowa;
	while (wsk != nullptr)
	{
		cout << wsk->dana_reszta1 << "  " << wsk->dana_reszta2 << endl;
		wsk = wsk->nastepna;
	}
	cout << endl;
	drukuj_drzewo(korzen->prawe);
}
}


void wstaw_drzewo_i_liste(wezel*&korzen, string zdanie1, string zdanie2, string zdanie3)
{
if (korzen == nullptr)
{
	korzen = new wezel;
	korzen->dana = zdanie1;
	korzen->lewe = nullptr;
	korzen->prawe = nullptr;
	korzen->glowa = new lista;
	korzen->glowa->dana_reszta1 = zdanie2;
	korzen->glowa->dana_reszta2 = zdanie3;
	korzen->glowa->nastepna = nullptr;


}
else if (((zdanie1.length() > korzen->dana.length()) || ((zdanie1 > korzen->dana) && (zdanie1.length() >= korzen->dana.length()))) && (zdanie1 != korzen->dana))
{
	wstaw_drzewo_i_liste(korzen->prawe, zdanie1, zdanie2, zdanie3);
}
else if (((zdanie1.length() < korzen->dana.length()) || ((zdanie1 < korzen->dana) && (zdanie1.length() <= korzen->dana.length()))) && (zdanie1 != korzen->dana))

{
	wstaw_drzewo_i_liste(korzen->lewe, zdanie1, zdanie2, zdanie3);
}
else
{


	if (korzen->dana == zdanie1)
	{
		lista*nowa = new lista;
		nowa->dana_reszta1 = zdanie2;
		nowa->dana_reszta2 = zdanie3;

		if ((nowa->dana_reszta1) < (korzen->glowa->dana_reszta1))
		{
			nowa->nastepna = korzen->glowa;
			korzen->glowa = nowa;
		}
		else
		{
		lista*wsk=korzen->glowa->nastepna;
		nowa->nastepna = korzen->glowa;

		while( ( (wsk->dana_reszta1) < (nowa->dana_reszta1) ) && (wsk != nullptr)   )
                               //Warunek przy którym program nie działa, ale ustawiając wyraz na początku pliku,który będzie znajdował się na końcu listy-
                                  program działa poprawnie,tzn sortuje alfabetycznie.


                          // (wsk != nullptr)  warunek przy którym program działa,ale nie sortuje alfabetycznie.    

		{
			wsk = wsk->nastepna;
			nowa->nastepna = nowa->nastepna->nastepna;
		}

		nowa->nastepna->nastepna = nowa;
		nowa->nastepna = wsk;
		}


	}
	else if (korzen->dana > zdanie1)
		wstaw_drzewo_i_liste(korzen->lewe, zdanie1, zdanie2, zdanie3);
		else
			wstaw_drzewo_i_liste(korzen->prawe, zdanie1, zdanie2, zdanie3);
}
}



int main()
{
string zdanie1;
string zdanie2;
string zdanie3;

plik.open("dane.txt", ios::in);
wezel*korzen = nullptr;


while(!plik.eof())
{
	plik >> zdanie1>>zdanie2>>zdanie3;
	wstaw_drzewo_i_liste(korzen, zdanie1,zdanie2,zdanie3);
}
drukuj_drzewo(korzen);


_getch;
system("pause");
return 0;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak wstawiasz kod, to korzystaj z tagów code (ikonka <>).

 

Kompilator nie zgłasza żadnych ostrzeżeń? Masz ustawioną flagę -Wall?

Jaki jest kod błędu? Próbowałeś uruchomić program pod debuggerem?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Masz takie wymagania, aby to było zrobione za pomocą listy i drzewa ? Da się to zrobić prościej chociażby vectorem i parą.

 

Na szybko ta linia:

while( ( (wsk->dana_reszta1) < (nowa->dana_reszta1) ) && (wsk != nullptr) )

co się stanie jeśli wsk jest nullem ? Hint - poczytaj o short circuit evaluation.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...