Lista dwukierunkowa

0

Witajcie , mam problem z listą dwukierunkową , która ma być sortowana od razu przy dodawaniu. Gdy sprawdzam program przy użyciu debugera wszystko wyświetla się poprawnie ale gdy uruchamiam program normalnie zostaje wyświetlona tylko jedna liczba.
Może ktoś z was znajdzie przyczynę. Z góry dziękuje za pomoc.

#include < iostream>
#include < string>
#include <fstream>
#include <ctime>

using namespace std;
//------------------------------ Struktura-------------------------------
struct Liczby
{
	int a;
	Liczby *next;
	Liczby *prev;
	

};
Liczby * head=0;
Liczby *tail = 0;

//------------------------------Deklaracja Funkcji -----------------------------
void dodawanie(Liczby *&temp);
void kasowanie(Liczby *temp);
void wyswietlanie(Liczby *temp);
int wczytanie();
// ----------------------------Deklaracja Zmiennych
int X, k1, k2, k3, k4;

// ----------------------------MAIN -------------------------------------
void main()
{
	Liczby *wsk;
	wczytanie();
	int i = 0;
	while (i < 5)
	{
		dodawanie(wsk);
		i++;
	}
	wyswietlanie(wsk);
	kasowanie(wsk);
	

}

//--------------------------------Wczytanie Pliku-------------------------------
int wczytanie()
{
	// Wczytywanie z pliku wartości X, k1, k2, k3, k4
	fstream plik;
	plik.open("inlab02.txt");
	if (plik.is_open())
	{
		plik >> X;
		plik >> k1;
		plik >> k2;
		plik >> k3;
		plik >> k4;

		plik.close(); //Uwaga! Niezamkniety plik to klopoty. Jak konczysz pracowac z plikiem zamknij go.
		return X, k1, k2, k3, k4;

	}
	else
	{
		cout << "Blad otwierania pliku!" << endl;
	}
	return 0;
}
//-------------------------------Dodawnie wartosci do listy -------------------
void dodawanie(Liczby *&temp)
{
	
	
	
		srand(time(NULL));
		int losowa = 10 + rand() % 10000;
		temp = head;
		do
		{


			if (head == NULL)
			{
				// Lista jeste pusta , tworzymy pierwszy obiekt
				temp = new Liczby;
				temp->a = losowa;
				head = temp;
				tail = temp;
				temp->next = 0;
				temp->prev = 0;
			}
			else if (temp->next == NULL && temp->a < losowa)
			{
				// Czyli nasz obiekt będzie tym oststnim na liscie
				temp->next = new Liczby;
				temp->next->prev = temp;
				temp = temp->next;
				temp->next = NULL;
				temp->a = losowa;
				tail = temp;

			}
			else if (temp->a < losowa && temp->next->a > losowa)
			{
				Liczby *nowy = new Liczby;
				nowy->a = losowa;
				temp->prev->next = nowy;
				nowy->prev = temp->prev;
				temp->prev = nowy;
				nowy->next = temp;


			}
			temp = temp->next;
		} while (temp != NULL);
}
//-------------------------------Wyswietlanie listy-------------------------
void wyswietlanie(Liczby *temp)
{
	temp = head;
	while (temp != NULL)
	{
		cout << temp->a << endl;
		temp = temp->next;
	}
}
// ------------------------------Kasowanie listy------------------------------
void kasowanie(Liczby *temp)
{
	temp = head;
	Liczby*pomoc;
	pomoc = temp;
	pomoc = pomoc->next;
	while (pomoc != NULL)
	{

		delete temp;
		temp = pomoc;
		pomoc = pomoc->next;
	}
	delete pomoc;
}
1

Masz źle przemyślany projekt, nie dodaje się do listy w środek.
Masz źle napisane: dodawanie oraz kasowanie.
Na tym forum ten temat pojawiał się setki razy, w połowie z tych przypadków podano gotowy działający kod.
Znajdź i porównaj.

0

To jak chcesz dodać coś co jest pomiędzy jeśli się nie dodaje w środek ? Bo nie rozumiem twojej wypowiedzi .

2

W środek to drzewo binarne.
Albo zwykła tablica.
Wstawianie w środek to - całkowite zwycięstwo technologii nad zdrowym rozsądkiem.

0

Trochę dziwnie gdyż mój prof. z Struktur Danych tak właśnie nam to tłumaczył ... :)

1

Wiec albo spyta was czy już zrozumieliście czemu nie należy tak robić albo trzeba go gnać brudną miotłą z tego stanowiska.

0

Oj widzę , że masz długi staż na tym forum, w opisie masz napisane że piszesz w tylu językach a nie wiesz że aby było to najbardziej optymalne to listę dwukierunkową sortuje się przy dodawaniu. A dodawanie do środka jest to norma. Myślałem że znajdę tutaj kogoś o większej wiedzy.

4

Nie. Listy nie sortuje się przy dodawaniu (bo strasznie to nie optymalne koszt O(N) ), na to są drzewa binarne (koszt O(log(N)) ). Listy sortuje się ewentualnie raz na końcu.
Mam nadzieje że twoja olbrzymia wiedza z dziedziny struktur danych pozwala ci poprawnie porównać O(N) i O(log(N))

0

Tak pozwala, ale jeśli masz napisać program który wykorzystuje listę dwukierunkową , nie możesz użyć tablicy a sortowanie ma się odbyć przy dodawaniu no to musisz to wykonać jak jest w poleceniu.

1

Było już setki razy, wraz z tym beznadziejnym dodawaniem w środek, przy czym nie tylko poprawnie działające ale jeszcze 3-4 razy krótsze.

0

Okey bez pomocy waszego forum dałem sobie radę...więc zamykajcie temat czy jakoś tak.

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