Cześć!
- 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;
}
}
- Makaronizmy utrudniają czytanie kodu źródłowego.
- 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?
@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;
}
Ok, poprawiłem kilka rzeczy, ale teraz mam problem z czymś innym.
- 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