C- dynamiczna lista jednokierunkowa

0

Witam

Mam napisać funkcję która będzie usuwać pierwszy element listy oraz funkcję która będzie usuwać wszystkie elementy listy.

Napisałem kod i wszystko jest w porządku oprócz tego że nie moge usunąć PIERWSZEGO elementu listy, pozostałe po wywołaniu funkcji i ich wartości usuwają się, problem tkwi tylko w pierwszym elemencie. Bardzo proszę o pomoc.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct punkt
{
  int x;
  int y;
  struct punkt *nast;
} el_listy; 

el_listy *pierwszy;

void dodaj_do_listy (el_listy *lista, int liczba)
{
  el_listy *wsk, *nowy;
  wsk = lista;
  while (wsk->nast != NULL)
  { 
     wsk = wsk->nast; /* przesuwamy wsk aż znajdziemy ostatni element */
  }
  nowy =(el_listy*) malloc (sizeof(el_listy));
  nowy->x = liczba;
  nowy->nast = NULL;
  wsk->nast = nowy; /* podczepiamy nowy element do ostatniego z listy */
}

void wypisz_liste(el_listy *lista)
{
  el_listy *wsk=lista;
  while( wsk != NULL )
  {
     printf ("%d \n", wsk->x);
     wsk = wsk->nast;
  }
}

void usun_z_listy(el_listy *lista, int element)
{
  el_listy *wsk=lista;
  while (wsk->nast != NULL)
  {
     if (wsk->nast->x == element) /* musimy mieć wskaźnik do elementu poprzedzającego */
     {
        el_listy *usuwany=wsk->nast; /* zapamiętujemy usuwany element */
        wsk->nast = usuwany->nast;   /* przestawiamy wskaźnik next by omijał usuwany element */
        free(usuwany);               /* usuwamy z pamięci */
     }
     else
     {
        wsk = wsk->nast;           /* idziemy dalej tylko wtedy kiedy nie usuwaliśmy */
     }                             /* bo nie chcemy zostawić duplikatów */
  }
}

int main ()
{

  pierwszy =(el_listy*) malloc (sizeof(el_listy));
  pierwszy->x =2;
  pierwszy->nast = NULL;

  dodaj_do_listy (pierwszy, 3);
  dodaj_do_listy (pierwszy, 4);
  dodaj_do_listy (pierwszy, 5);

  wypisz_liste(pierwszy);

  usun_z_listy(pierwszy, 3);

  wypisz_liste(pierwszy);

  getchar();
} 
0

Zaczynając od:

wsk->nast->x

Pomijasz pierwszy element w liście. Zrób sobie jakiś wskaźnik który będzie wskazywał na pierwszy element w liście.

0

A zauważyłeś że też nie możesz dodać do tej listy pierwszy element?
Poczytaj tu: http://4programmers.net/Forum/C_i_C++/234479-lista_jednokierunkowa

1

proponuję Ci żeby lista zawierała również wskaźnik do ostatniego elementu. Nie będziesz musiał /* przesuwamy wsk aż znajdziemy ostatni element */

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