Lista jednokierunkowa - To do list - pomoc dla nooba

0

Cześć!

0
  1. Na początek daruj se wczytywanie z plików, skup się na porządnym stworzeniu listy np funkcja addBack po poprawkach powinna wyglądać mniej więcej tak:
void dodajElement(Lista **glowa, int d, int m, int y, string tresc_zadania)
{
        Lista *nowy = new Lista;
        nowy->d = d;
        nowy->m = m;
        nowy->y = y;
        nowy->tresc_zadania = tresc_zadania;
        nowy->nastepny = NULL;

        Lista *tmp = *glowa;
        if (tmp != NULL)
        {
            while(tmp->nastepny) tmp = tmp->nastepny;
            tmp->nastepny = nowy;
        }
        else
        {
            *glowa = nowy;
            (*glowa)->nastepny = NULL;
        }
}
  1. Makaronizmy utrudniają czytanie kodu źródłowego.
  2. Prototyp funkcji wczytywanie_danych_do_listy nie zgadza się z jej użyciem w funkcji main no i wygląda jakbyś chciał wczytać z jednego pliku dane do jednego elementu listy a pewnie nie o to chodzi?
1

@czaffik:
Aj, aj, aj... nie przewijaj listy za każdym razem na sam koniec, szukając ostatniego elementu. Zamiast tego przechowuj go w osobnym wskaźniku na boku i na nim operuj dokładając nowe elementy. Co gdyby kontener miał milion elementów, a Ty chciałbyś dołożyć pojedynczo kolejny milion? Przewijałbyś te listę za każdym razem na koniec? To bez sensu :)

Można zrobić coś a' la:

#include <iostream>
using namespace std;

template<class T>
class list
{
private:
	struct node
	{
		T value;
		node *next;
		node(const T& value) : value(value), next(nullptr) {}
	};

	node *root;
	node *last;

public:
	list() : root(nullptr), last(nullptr) {}

	void addFirst(const T& value)
	{
		node *nd = new node(value);
		nd->next = this->root;
		this->root = nd;

		if (!last) this->last = nd;
	}

	void addLast(const T& value)
	{
		node *nd = new node(value);

		if (!last) this->root = this->last = nd;
		else
		{
			this->last->next = nd;
			this->last = nd;
		}
	}

	~list()
	{
		node *temp = this->root;
		while (temp)
		{
			node *current = temp;
			temp = temp->next;
			delete current;
			current = nullptr;
		}
	}
};


int main()
{
	list<int> list;
	list.addLast(5);
	list.addFirst(10);
	list.addFirst(20);
	list.addFirst(30);
	list.addFirst(40);
	list.addLast(60);
	list.addFirst(70);
	list.addLast(80);
	list.addLast(90);
	return 0;
}
0

Ok, poprawiłem kilka rzeczy, ale teraz mam problem z czymś innym.

0
  1. Nie przesuwaj elementów po "głowie", stwórz tymczasowy element i przypisz do niego wskaźnik "z głowy" i dopiero po nim iteruj:
void drukowanie_listy(sLista *&glowa)
{
    sLista *element = *glowa;
   // i tak dalej

W ten sposób głowa ciągle jest tam gdzie być powinna, czyli na początku a nie w .... na końcu.
2. Chyba nie ma innego wyjścia, przewijać i sprawdzać czy element ma założony przez ciebie numer, jeśli tak kasować, jeśli nie to jechać dalej:

void usun_element(sLista *&glowa, unsigned int numer) 
{
    if (numer == 1) usuwanie_pierwszego_elementu(glowa);
      
    unsigned int i = 1;
    sLista *e = glowa;

    while(e->nastepny)
    {
        i++;
        e = e->nastepny;
        if (i == numer)
        {
            e->nastepny = e->nastepny;
            delete e;
            break;
        }
    }
}

Uwaga, mogłem się machnąć, pokazuje mniej więcej jak to może wyglądać, chociaż można by też wprowadzić do struktury Element własność numerPorządkowy etc.

@grzesiek51114:
Zgadzam się, ale co jeśli wykładowca czy kto ich tam uczy wymyślił sobie że najpierw pokarze im to w takiej postaci a potem wyskoczy z błyskotliwym wnioskiem że to się nie nadaje do większych ilości danych? Pokrzyżowałeś jego plany xD

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