Dodawanie elementu na koniec listy

0

Witam mam napisany kod jednak nie rozumiem do końca jego działania

struct lista
{
    int data;
    struct lista *next;
};
struct lista *create(int data)
{
    struct lista *new = malloc(sizeof(struct lista));
    if(new != NULL)
    {
        new -> data = data;
        new -> next = NULL;
    }
    return new;
};

void push_back(struct lista *list, int data)
{
    struct lista *new = malloc(sizeof(struct lista));
    struct lista *tmp = list;
    if(new != NULL)
    {
        while(tmp -> next != NULL)
        {
            tmp = tmp -> next;
        }
        new -> data = data;
        new -> next = NULL;
        tmp -> next = new;

    }

};
void print(struct lista *lista)
{
    while(lista != NULL)
    {
        printf("%d ",lista->data);
        lista = lista -> next;
    }
}
int main()
{
    struct lista *list = NULL;
    list = create(1);
    push_back(list,4);
    push_back(list,2);
    push_back(list,8);
    print(list);
}

Cały kod działa poprawnie. Do listy elementy są dodawane na koniec. Jednak nie rozumiem jakim cudem push_back edytuje listę jeżeli działamy na nowej strukturze tmp. Wcześniej miałem zapis list = tmp jednak jak się okazało jest niepotrzebne.

2
JustSomeRandom napisał(a):

Jednak nie rozumiem jakim cudem push_back edytuje listę jeżeli działamy na nowej strukturze tmp.

To jest wskaźnik na tę samą strukturę, który przesuwasz kolejno na następne struktury aż do ostatniej.

3

Ten kod co podałeś wylewa kąpiel z dzieckiem.
Zaletą list dowiązywanych jest kosz dodawania O(1), zrobiłeś z tego koszt O(N).

https://4programmers.net/Forum/C_i_C++/262765-listy_dodawanie_pierwszego_el?p=1203991#id1203991

1

@JustSomeRandom: Tak jak pisali przedmówcy:

  • nie działasz na nowej strukturze, tylko tworzysz nowy WSKAŹNIK dla istniejącej struktury
  • dodaj sobie węzeł "head" w strukturze żeby nie musieć przy każdym dodawaniu lecieć przez całą listę
2

Tu masz lekko poprawiony kod (dodałem nową funkcję i użyłem dodatkowo już istniejacej).
Poprawka robi dokładnie to samo, ale czytelniej i wszystko powinno być jasne.

Patrząc na ten kod i biorąc pod uwagę ile ostatnio widziałem pytań o kod z książek i kursów z internetu, które były straszne, to ten kod jest dobry.
Ten push_back ma tą wadę, że nie działa na pustej liście (a moim zdaniem powinien).
Jeszcze mnie uwiera mieszanka języka polskiego i angielskiego.

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