[C]Problem z usuwaniem z listy(1 przypadek)

0

Witam, potrzebuje napisać funkcję która usuwa z listy parzyste elementy, no i prawię mi się udało ale mam w dwóch przypadkach problemy:
1: Gdy lista zawiera samą dwójkę to funkcja wyświetlająca liste nie powinna nic wyświetlić.
1: Gdy lista zawiera liczby np. 2 2 3 to funkcja wyświetlająca wyświetla: jakis adres? a potem 3 czyli jakbym czegoś po drodze nie zwolnił jakieś z tych dwóch liczb parzystych ale nie wiem .

Przyznam szczerze że od niedawna operuje na listach i może to tylko jakiś głupi błąd ? Z góry byłbym wdzięczny za pomoc :)


typedef struct el
{
        int dane;
        struct el *nast;
}element;


element *usun_parzyste(element *t)
{
        element *q,*p,*r;
        int dane;
        q=t;
        r=q;
        if(q==NULL) return t;
        while(q->nast!=0)
        {
                if(q->dane%2==0)
                {
                                if(q->nast->nast!=0)
                                {
                                        dane=q->nast->dane;
                                        p=q->nast;
                                        q->nast=q->nast->nast;
                                        q->dane=dane;
                                        free(p);
                                }
                                else
                                {
                                        p=q;
                                        q=q->nast;
                                        r->nast=q;
                                        free(p);
                                }
                }
                else
                {
                        r=q;
                        q=q->nast;
                }

        }
        if(q->dane%2==0)
        {
                p=q;
                free(p);
                r->nast=0;
        }
        return t;
 
0

Ależ nakręciłeś!!!

element *usun_parzyste(element *t)
  {
   int drop=1;
   element head,*i;
   head.nast=t;
   for(i=&head;i->nast;drop^=1)
     {
      if(drop)
        {
         free(i->nast);
         i->nast=i->nast->nast;
        }
      else i=i->nast;
     }
   return head.nast;
  }

i to wszystko!

0

Nie do końca rozumiem ten program. co to znaczy drop^=1?

0
lupek123 napisał(a):

Nie do końca rozumiem ten program. co to znaczy drop^=1?

xor -> nieparzysta liczba jedynek tak wiec użyteczne

0

Sama funkcja i tak źle działa, czasami wyrzuca liczby parzyste, czasami nieparzyste. Nie rozumiem ciągle gdzie tutaj w tej funkcji są sprawdzone poszczególne wartości w liście?

Oczywiście przez parzyste rozumiem zawartości pola dane a nie parzyste wystąpienia .

1

Nie czytałem twego ... "kodu" więc jak widać źle zrozumiałem co to znaczy parzysty - wywalam parzyste w sensie kolejności.
Zmień warunek i będzie wywalać wg innego warunku.

0

Ok dzięki działa :)

Ps. Może ktoś polecić jakieś dobre źródło informacji na temat list i wskaźników ? Bo trochę się w tym zaczynam gubić :/

0

@lupek123 jedno dobre? wiem, że jest kilka w miarę rozproszonych po internecie. użyj google i trochę tu, trochę tam to trzeba przetrenować i bynajmniej nie jest to nauki na 1h tylko trochę więcej ;p

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