Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lista jednokierunkowa wstawienie elementu zamiast elementu o jakimś adresie

Ostatnio zmodyfikowano 2013-05-03 17:35
Autor Wiadomość
Mix
Temat założony przez niniejszego użytkownika
Lista jednokierunkowa wstawienie elementu zamiast elementu o jakimś adresie
» 2013-05-03 12:38:45
Witam,

Do swojego projektu potrzebuję funkcji wstawiającej jakiś element w miejsce innego elementu o określonym adresie. Napisałem coś takiego:

C/C++
void usun( SOtoczka *& adres )
{
    SOtoczka * tmp;
    tmp = new SOtoczka;
   
    if( adres != NULL )
    {
        tmp = adres;
        adres = adres->next;
        delete tmp;
    }
}

C/C++
void wstaw_za( SOtoczka * gdzie, SOtoczka * nowy )
{
    SOtoczka * tmp;
    tmp = new SOtoczka;
   
    if( gdzie != NULL )
    {
        tmp = gdzie->next;
        gdzie->next = nowy;
        nowy->next = tmp;
    }
}

C/C++
void wstaw_zamiast( SOtoczka *& zamiast, SOtoczka * nowy )
{
   
    wstaw_za( zamiast, nowy );
    usun( zamiast );
}


I teraz tak. Program wykonuje w QT. Całość jest zapisana w module, w którym później mam inną funkcję która ma wstawić określony element zamiast innego. Moja funkcja wstaw_zamiast działa jeśli odpalam ją w mainie w ten sposób, że tworzę bezpośrednio jakiś nowy element przypisuje wszystkim jego polom wartości, a następnie wstawiam zamiast np. glowa->next. Problem pojawia się kiedy chcę tę funkcje wywołać wewnątrz innej funkcji w tym samym module. Wówczas dostaję efekt taki:

Efekt
Efekt
 
Jak nie ciężko się domyślić punktem na miejsce którego miał być wstawiony nowy element, a co za tym idzie, który chciałem usunąć z listy jest punkt drugi od góry. Samo wstawianie działa, niestety nie działa usuwanie.

Co jest nie tak?
P-81872
Mix
Temat założony przez niniejszego użytkownika
» 2013-05-03 17:35:31
Dobra, doszedłem do nowego rozwiązania i teraz już usuwa elementy dopóki wskazany element nie okazuje się głową. Właściwie wtedy też go usuwa, ale potem dzieją się dziwne rzeczy takie jak np. element wraca za chwilę na swoje miejsce lub też przy kolejnym wypisaniu listy jako glowę wypisuje punkt o losowych danych (takich jak na screenie w poście wyżej).

Oto moja funkcja, prosiłbym o pomoc w napisaniu fragmentu usuwającego głowę:

C/C++
SOtoczka * usun( SOtoczka * glowa, SOtoczka * adres )
{
    SOtoczka * tmp = glowa;
    SOtoczka * prev = glowa;
    while( tmp != NULL )
    {
        if( tmp == adres )
        {
            if( tmp == glowa )
            {
                glowa = glowa->next;
                delete tmp;
                tmp = glowa;
                prev = glowa;
            }
            else
            {
                prev->next = tmp->next;
                delete tmp;
                tmp = prev->next;
            }
        }
        else
        {
            prev = tmp;
            tmp = tmp->next;
        }
    }
    return glowa;
}
P-81899
« 1 »
  Strona 1 z 1