listy dwukierunkowe

listy dwukierunkowe
KI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

Mam problem ze stworzeniem listy dwukierunkowej z pliku, której każdy wyraz przynależy do danej części struktury. Muszę je dodatkowo posortować zgodnie z dniami tygodnia. Próbowałem stworzyc funkcję, która np. pon daje na początek listy i nic. Przeczytałem wszystkie możliwe artykuły w internecie i nadal nic mi nie wychodzi.

Kopiuj
void pierwszy(dane1& L, string dzien)
{
    dane* p;

    p = new dane;   // tworzymy nowy element
    p-> dzien = 'pon';
    p->prev = NULL;
    p->next = L.head;
    L.head = p;
    
    if (p->next) p->next->prev = p;
    else L.tail = p;
}
Kopiuj
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#include <sstream>
using namespace std;
struct dane                  //struktura z danymi i wskaznikiem na nastepny element
{
    string godzina;
    string dzien;
    string grupa;
    string nazwisko;
    string przedmiot;
    dane* next,*prev;
   
};
struct dane1
{
    dane* head, * tail;
};

typedef dane* lista;
lista glowa = NULL;
lista wsk = NULL;


void dodawanie(lista& glowa, string godzina, string dzien, string grupa, string nazwisko, string przedmiot) // dodawanie nowego elementu do listy
{
    glowa = new dane;
    glowa->godzina = godzina;
    glowa->dzien = dzien;
    glowa->grupa = grupa;
    glowa->nazwisko = nazwisko;
    glowa->przedmiot = przedmiot;

    glowa->next = wsk;
    wsk = glowa;

};

void zapisz(lista glowa)//zapisywanie listy do osobnego pliku
{

    lista kolejny;
    kolejny = glowa;
    while (kolejny != NULL)
    {
        fstream plik_wyjsciowy;
        plik_wyjsciowy.open(kolejny->nazwisko + ".txt", ios::out | ios::app);
        plik_wyjsciowy << kolejny->godzina << " ";
        plik_wyjsciowy << kolejny->dzien << " ";
        plik_wyjsciowy << kolejny->grupa << " ";
        plik_wyjsciowy << kolejny->przedmiot << endl;
        kolejny = kolejny->next;
    }
    cout << "\n";
};
void zwolnij(lista& glowa)
{
    lista pom;
    while (glowa != nullptr)
    {
        pom = glowa;
        glowa = pom->next;
        delete pom;
    }
}
//void pierwzszy(dane1& L, string godzina, string dzien, string grupa, string nazwisko, string przedmiot)
//{
  ///  dane* p;

   // p = new dlistEl;   // tworzymy nowy element
  //  p-> godzina;
  //  p->  = dzien;
  //  p->data = grupa;
  //  p->data = nazwisko;
  //  p->data = przedmiot;
   // p->next = wers;
   // p->prev = wers->prev;
   // p->prev = NULL;
   // p->next = L.head;
   // L.head = p;
   // L.count++;
   // if (p->next) p->next->prev = p;
   // else L.tail = p;
//}


void pierwszy(dane1& L, string dzien)
{
    dane* p;

    p = new dane;   // tworzymy nowy element
    p-> dzien = 'pon';
    p->prev = NULL;
    p->next = L.head;
    L.head = p;
    
    if (p->next) p->next->prev = p;
    else L.tail = p;
}

int main()
{

    ofstream plik;
    string sciezka;
    //cout << "Wpisz nazwe/sciezke do pliku zawierajcego dane:";      linie polecenia
    //cin >> sciezka;
    plik.open("plan.txt");
    if (plik.is_open())
    {
        string wers;
        string godzina, dzien, grupa, nazwisko, przedmiot;
        cout << "Plik wczytano poprawnie!" << endl;
        int liczby;
        string a, b;
        while (!plik.eof())
        {

            getline(plik, wers);
            istringstream is(wers);   //dzielenie wersu  na czesci 

            is >> godzina >> dzien >> grupa >> nazwisko >> przedmiot;
            if (dzien = 'pon')
                pierwszy;
                
            
           // dodawanie(glowa, godzina, dzien, grupa, nazwisko, przedmiot);  //dodanie pobranych danych z pliku do listy

        }
    }
    else
    {
        cout << "Plik nie zostal wczytany, sprobuj ponownie" << endl;
    }

    zapisz(glowa);


    zwolnij(glowa);
    return 0;
}
lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
0

Tu Masz dokładnie opisaną i zaimplementowaną double linked list:
https://www.geeksforgeeks.org/doubly-linked-list/
Co do sortowania, list się nie sortuje bezpośrednio (to jest mega nieefektywne), kopiuje się do wektora, sortuje wektor i z powrotem do listy.

koszalek-opalek
  • Rejestracja: dni
  • Ostatnio: dni
0
lion137 napisał(a):

Co do sortowania, list się nie sortuje bezpośrednio (to jest mega nieefektywne), kopiuje się do wektora, sortuje wektor i z powrotem do listy.

Lepiej chyba -- zamiast kopiować do wektora zawartość listy -- skopiować tylko wskaźniki, posortować wg odpowiedniego klucza, a potem odpowiednio podoczepiać z powrotem w listę w nowej kolejności (o ile jest to własna implementacja listy).

KI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0
koszalek-opalek napisał(a):
lion137 napisał(a):

Co do sortowania, list się nie sortuje bezpośrednio (to jest mega nieefektywne), kopiuje się do wektora, sortuje wektor i z powrotem do listy.

Lepiej chyba -- zamiast kopiować do wektora zawartość listy -- skopiować tylko wskaźniki, posortować wg odpowiedniego klucza, a potem odpowiednio podoczepiać z powrotem w listę w nowej kolejności (o ile jest to własna implementacja listy).

Właśnie o to mi chodzi. Nie wiem tylko jak to napisać, znasz może jakiś przykład, na którym mógłbym bazować?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.