Źle działające wstawianie elementu do listy

0

Cześć!
Mam problem z wstawianiem elementu do listy na konkretne miejsce. Chcę, aby gotowy adres do wydarzenia(rekord) był wstawiany chronologicznie tj. żeby każde poprzedzające wydarzenie było wcześniej a następne później. O ile wstawianie jako pierwszy element działa dobrze, o tyle już w środku listy nic się nie dzieje. Latałem z debuggerem i wskazywał, że nic się nie dzieje z pierwotną listą. Gdy wypisuję to tylko wtedy widze moje wydarzenie, gdy jest wstawione jako pierwsze.

void inputEvent(Lista *&list, Lista *&data)
{
    if(!data)
        return;
    Lista *tmp=list;
    if(data->event.month<=list->event.month)
    {
        if(data->event.day<list->event.day&&data->event.month==list->event.month)
        {
        data->next=list;
        list=data;
        return;
        }
        if(data->event.month<list->event.month)
        {
            data->next=list;
            list=data;
            return;
        }
    }
    else
    {
        while(tmp->next)
        {
            if(data->event.month<=tmp->next->event.month)
            {
                if(data->event.day<tmp->next->event.day&&data->event.month==tmp->next->event.month)
                {
                data->next=tmp->next;
                tmp->next=data;
                return;
                }
                if(data->event.month<list->event.month)
                {
                    data->next=tmp->next;
                    tmp->next=data;
                    return;
                }
            }
            tmp=tmp->next;
        }
    }
} 

Z góry dzięki za pomoc

0

Jeżeli lista pusta zaczynasz od sięgania pod ten nullptr

0

Akurat program jest tak skonstruowany, że lista nigdy nie jest pusta.

1

Jeżeli program skonstruowano tak że lista nigdy nie jest pusta zaś dodawane dane mogą być puste to wywal ten program i zacznij od nowa.

  1. Nie używaj innego niż angielskie nazewnictwo: http://4programmers.net/Forum/1208091
  2. Zrób sensowne przekazywanie danych List **list
  3. Dane przykazuj przez pojedynczy wskaźnik List *data
  4. Zrób osobno funkcję porównującą najlepiej operator <.
  5. Po uwzględnieniu powyższego cały kod będzie wyglądać następująco:
void inputEvent(List **list,List *data)
  { 
   while((*list)&&(**list<*data)) (*list)=&((*list)->next);
   data->next=(*list)->next;
   (*list)=data;
  }
0

Dzięki za rozwiązanie problemu,wydaje mi się, że rozumiem ideę tego kodu. Mam jeszcze parę pytań co do twojego kodu. Na czym polega różnica między użyciem "&" a "*" w tych kodach? Dlaczego w definicji także używasz * ?
Dopiero się uczę programować, więc każda dawka wiedzy mi się przyda :D

0
Mały Młot napisał(a):

Dzięki za rozwiązanie problemu,wydaje mi się, że rozumiem ideę tego kodu.
Sądząc po dalszych pytaniach - nie.

Mały Młot napisał(a):

Na czym polega różnica między użyciem "&" a "*" w tych kodach?
Oczekujesz dwuwierszowego streszczenia rozdziałów wskaźniki i referencje?

Mały Młot napisał(a):

Dlaczego w definicji także używasz * ?
Nie używam w definicji czy w czymkolwiek jeszcze używam wg potrzeb.

Mały Młot napisał(a):

Dopiero się uczę programować, więc każda dawka wiedzy mi się przyda :D
Więc zacznij od rozdziałów wskaźniki i referencje aby dać rady zrozumieć ten kod.

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