C++ lista jednokierunkowa

0

Cześć,

mam kod listy jednokierunkowej, uporządkowanej, program się kompiluje, wszystko jest ok, jednak staram się go zrozumieć, większość zakomentowałem, aby jakoś to sobie wytłumaczyć, ale jak na razie wskaźniki to nie jest moja mocna strona, mogę liczyć na pomoc w wytłumaczeniu tego ostatniego fragmentu kodu? - od curr=head

#include <iostream>

struct Node {       //zdefiniowanie struktury
    int value;
    Node* next;

    Node(int valueP) {
        value = valueP;
        next = NULL;
    }
}
class List {
private:
    Node* head;         //tworzenie g³owy listy
public:
    List() {
        head = NULL;        //na samym pocz¹tku lista powinna byæ pusta
    }
    ~List() {       //destruktor
        Node* toDelete;

        while (head) {     //dopoki head nie jest null
            toDelete = head;
            head = head->next;  //przesunąć headem po kolejnych elementach listy
            delete toDelete;
        }
    }
    void add(int value)
    {
        if (head == NULL) {                
            head = new Node(value);     //inicjowanie nowego elementu
            return;
        }
        Node* curr;                 //wskaźnik na element listy gdzie ma być dodana kostka

        if (value < head->value) {      //dodawanie uporzadkowane
            curr = new Node(value);     //tworzy nowy element
            curr->next = head;      //następnym elem. po naszym nowym ma być ten który był headem
            head = curr;            //head od teraz musi pokazywać na nowy element
            return;
        }
  ----------
         curr = head;           
         Node* next = curr->next;
        while (next)
        {
            if (value == next->value) {     
                return;
            } if (value < next->value) {
                curr->next = new Node(value);  
                curr->next->next = next;        
                return;
            }
            curr = next;
            next = curr->next;
        }
        curr->next = new Node(value);
    }
2

Node* head; //tworzenie g³owy listy nope, to tylko definicja elementu klasy

Co do fragmentu: wcześniej sprawdzasz, czy należy dodać na początku listy. Jeśli tak nie jest (czyli w części, o którą pytasz), przesuwasz curr na element ostatni lub taki, którego następny jest ≥ wartości wstawianej, i przed nim dodajesz nowy element.

1

ta lista ma byc uporzadkowana od najmniejszej do najwiekszej while(next) czyli powtarzaj dopoki next nie jest nullem (czyli dopoki koniec listy nie zostal osiagniety. Jesli wartosc ktora chcemy dodac jest rowna next->value czyli upraszczajac list[i+1] gdzie i to indeks miedzy 0, len(list) to nic nie robimy oprocz wyjscia z funkcji (chyba chodzi o to w tej implementacji ze nie ma duplikatow.) Jesli jest mniejsza od list[i+1] to wstawiasz tą wartosc miedzy list[i] a list[i+1] tak ze upraszczajac: temp=list[i+1], list[i+1]=value, list[i+2]=temp, po tym zwracasz z funkcji. Jesli doszlismy do konca listy (wyszlismy z while(next)) bez wychodzenia z funkcji to znaczy ze element ktory chcemy dodac do listy jest wiekszy od wszystkich obecnych elementow listy. Wiec dodajemy go do konca. Mozesz traktowac liste jednokierunkowa jako taki prymitywny rodzaj tablicy, w ktorej masz "wylaczony" swobodny dostep do elementow, mozesz wybrac element jedynie poprzez przez przejscie od poczatku listy az do jego napotkania. Jednak na ten moment chyba latwiej bedzie jesli potraktujesz wskaznik curr jako wskaznik na obecny element (czyli list[i]) oraz wskaznik next jako wskaznik na nastepny element (czyli list[i+1]). Jakis czas temu rozwiazalam zadanie na leetcode w ktorym trzeba bylo sprawdzac palindromy na liscie jednokierunkowej, wiec da sie korzystac z tej struktury jednak nie jest ona zbyt praktyczna

0

ok, dziękuje za odpowiedz, czyli jeśli while(next) zajmuje się sortowaniem, to" if (value < head->value)" za co odpowiada?

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