hej, temat pytania dużo mówi o problemie .Stworzyłem własną (co najlepsze działającą) implementacje listy w C++ .
Dodawanie ,usuwanie i pokazywanie elementów listy działa jak najbardziej ok ,teraz stwierdziłem że dodam jeszcze możliwość posortowania naszej struktury danych ,wykorzystałem do tego Bubble sort ponieważ ten algorytm jest bardzo prosty i najbardziej nadaje się dla początkujących do posortowania czegoś innego niż zwykła tablica . Algorytm nie działa pod tym względem że wykonuje się wiecznie :/ .Będę bardzo wdzięczny za pomoc ,pod spodem podam kod funkcji "sortującej" oraz całego programu (na wszelki wypadek)
*wiem ,program napisany po polsku to zło ... ale to moja pierwsza jeszcze nie doskonała implementacja listy i pisząc po polsku było łatwiej mi się skupić i przeanalizować kod po chwili przerwy
funkcja sortująca:
//to jest sortowanie babelkowe na start bo najprostsze (jak to ogarne to dam quicksort ,lub mergesort)
void sort(lista *&pierwszy_element) { //dostajemy wskaznik na pierwszy element
lista *iterator = pierwszy_element; //okresla ile razy mamy powtarzac petle zewnetrzna jak to jest w tym algorytmie sortowania
lista *temp = pierwszy_element->nastepna; //zaczynamy od pierwszego elementu+1 (jakas symulacja tego jak sortujemy na normalnych tablicach)
lista *bufor; //bufor do zamiany tablic
while (iterator) { //powtarzamy wszystyko dla iloscy elementow
while (temp) { //powtarzamy dla temp zavczynajacego sie od 2 elementu (nie 1 bo numerujemy wlasnie od jedyni a nie od zera)
if ((temp->poprzednia) > (temp)) { //jezeli wczesniejszy element bedzie wiekszy od tego obecnego to zamienamy :
bufor = temp; //biezocy element trafia do bufora
temp = temp->poprzednia; //zamiana
temp->poprzednia = bufor; //odcytanie z bufora
}
temp = pierwszy_element->nastepna;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Cały program :
#include "stdafx.h" //NAPISANE POD VS ,biblioteki są w tym pliku
using namespace std;
struct lista {
int dane;
lista *nastepna = nullptr;
lista *poprzednia = nullptr;
};
void usun_poczatek(lista *&pierwszy_element) {
lista *deleteBufor = pierwszy_element;
pierwszy_element = pierwszy_element->nastepna;
pierwszy_element->poprzednia = nullptr;
delete deleteBufor;
}
void usun_koniec(lista *&ostatni_element) {
lista *deleteBufor = ostatni_element;
ostatni_element = ostatni_element->poprzednia;
ostatni_element->nastepna = nullptr;
delete deleteBufor;
}
void usun_wybrany_element(lista *&pierwszy_element, lista *&ostatni_element, int number) {
int i = 1;
lista *temp = pierwszy_element;
do {
if ((i < number) && (temp->nastepna)) { i++; temp = temp->nastepna; }
else if ((i < number) && (!temp->nastepna)) { cout << "error!" << endl; break; }
else if (i <= number) { break; }
} while (true);
if (temp == pierwszy_element) {
lista *deleteBufor = pierwszy_element;
pierwszy_element = pierwszy_element->nastepna;
pierwszy_element->poprzednia = nullptr;
delete deleteBufor;
}
else if (temp == ostatni_element) {
lista *deleteBufor = ostatni_element;
ostatni_element = ostatni_element->poprzednia;
ostatni_element->nastepna = nullptr;
delete deleteBufor;
}
else {
lista *deleteBufor = temp;
temp = temp->poprzednia;
temp->nastepna = temp->nastepna->nastepna;
temp = temp->nastepna->nastepna;
temp->poprzednia = temp->poprzednia->poprzednia;
delete deleteBufor;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void dodaj_na_poczatek(lista *&pierwszy_element, lista *&ostatni_element, int wartosc) {
lista *nowy_element = new lista;
nowy_element->dane = wartosc;
if (!pierwszy_element) {
nowy_element->nastepna = nowy_element->poprzednia = nullptr;
pierwszy_element = ostatni_element = nowy_element;
}
else {
nowy_element->nastepna = pierwszy_element; //biezaczy pierwszy eleemnt
nowy_element->poprzednia = nullptr; //nic jeszcze nie ma prze nia
pierwszy_element->poprzednia = nowy_element; //biuezacy pierwszy eleemnt
pierwszy_element = nowy_element; //staje sie on pierwszym pierwszym elementem listy
}
}
void dodaj_na_koniec(lista *&ostatni_element, lista *&pierwszy_element, int wartosc) {
lista *nowy_element = new lista;
nowy_element->dane = wartosc;
if (!pierwszy_element) {
nowy_element->nastepna = nowy_element->poprzednia = nullptr;
pierwszy_element = ostatni_element = nowy_element;
}
else {
nowy_element->nastepna = nullptr;
nowy_element->poprzednia = ostatni_element;
ostatni_element->nastepna = nowy_element;
ostatni_element = nowy_element;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
void pokaz_cala_lista(lista *pierwszy_element) {
lista *temp = pierwszy_element;
while (temp) {
cout << temp->dane << " ";
temp = temp->nastepna;
}
}
int pracuj_na_numerze_listy(lista *pierwswzy_element, int number) {
int i = 1;
lista *temp = pierwswzy_element;
do {
if ((i < number)&&(temp->nastepna)) { i++; temp = temp->nastepna; } //jezeli jwszcze nie doszlismy do wyznaczonego numeru i sa nastepne szufladki struktory to szukaj dalej
else if ((i < number) && (!temp->nastepna)) { return 0; break; } //jezeli jeszcze nie dotarlismy do konca a szufladki sie skonczyly to blad i zwracamy 0
else if (i <= number) { return temp->dane; break; } //jezeli dotarlismy do konca to zwracamy dane
} while (true);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//to jest sortowanie babelkowe na start bo najprostsze (jak to ogarne to dam quicksort ,lub mergesort)
void sort(lista *&pierwszy_element) { //dostajemy wskaznik na pierwszy element
lista *iterator = pierwszy_element; //okresla ile razy mamy powtarzac petle zewnetrzna jak to jest w tym algorytmie sortowania
lista *temp = pierwszy_element->nastepna; //zaczynamy od pierwszego elementu+1 (jakas symulacja tego jak sortujemy na normalnych tablicach)
lista *bufor; //bufor do zamiany tablic
while (iterator) { //powtarzamy wszystyko dla iloscy elementow
while (temp) { //powtarzamy dla temp zavczynajacego sie od 2 elementu (nie 1 bo numerujemy wlasnie od jedyni a nie od zera)
if ((temp->poprzednia) > (temp)) { //jezeli wczesniejszy element bedzie wiekszy od tego obecnego to zamienamy :
bufor = temp; //biezocy element trafia do bufora
temp = temp->poprzednia; //zamiana
temp->poprzednia = bufor; //odcytanie z bufora
}
temp = pierwszy_element->nastepna;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
lista *pierwszy_element = nullptr;
lista *ostatni_element = nullptr;
dodaj_na_poczatek(pierwszy_element, ostatni_element, 10);
dodaj_na_poczatek(pierwszy_element, ostatni_element, 134);
dodaj_na_poczatek(pierwszy_element, ostatni_element, 98);
dodaj_na_poczatek(pierwszy_element, ostatni_element, 956);
dodaj_na_poczatek(pierwszy_element, ostatni_element, 9);
dodaj_na_poczatek(pierwszy_element, ostatni_element, 74);
dodaj_na_poczatek(pierwszy_element, ostatni_element, 908);
pokaz_cala_lista(pierwszy_element);
cout << endl;
sort(pierwszy_element);
pokaz_cala_lista(pierwszy_element);
cout << endl;
_getch();
return 0;
}