Edycja n-tego pola w liście

0

Witam, otóż borykam sie z problemem. Mianowicie nie wiem jak edytować n'te pole w liście. Mój pomysł jest taki, zrobić zmienną:

node *tmp = (node*)malloc(sizeof(node));

a później iść do wybranego miejsca przez użytkownika programu po przez pętle for. Ale niestety nie mam pojęcia jak to zrobić. Poprosił bym o radę :)

0

wszystko zalezy od struktury jaka masz. I skoro chcesz konkretny obiekt w liscie zmienic, to musisz jakos te obiekty rozpoznac

Wiec lecisz po liscie i sprawdzasz czy warunek spelniony, jezeli tak to masz ten konkretny obiekt z listy i mozesz go zmienic jak Ci sie podoba

1

Jeżeli chcesz całkowicie zmienić element, czyli że będzie pod innym adresem pamięci to robisz tak:

Jeżeli jest to lista kierunkowa to musiałbyś iść do pola n-1, nazwijmy go a.
Wtedy używając wskaźnika (a->next) uzyskujesz pole n które chcesz podmienić zmienną tmp.
Teraz do tmp->next musisz przypisać a->next->next (czyli element n+1) a do a->next adres tmp.

Choć nie widzę powodu aby to robić skoro masz strukturę. Wtedy robisz tą pętlę for (dopóki el->next nie jest null) i jak już znajdziesz to zmieniasz odpowiednio dane które chcesz.

0

Dziękuję, za pomoc!

1

@atmal: pytacz nie napisał, że potrzebuje reorganizować listę w miejscu istnienia n-tego węzła. Napisał tylko tyle, że potrzebuje się do niego dostać, ale nie wie w jaki sposób tego dokonać. ;)

Samo dobranie się do konkretnego elementu nie jest trudne (mogłem pomieszać *):

*node findNthNode(node *head, int n)
{
  node *nth = head;
  
  while(nth != null && n > 0)
  {
    nth = nth->next;
    n--;
  }
  
  return nth;
}

Węzeł zwrócony z funkcji można spokojnie edytować. Dla pustej listy lub zbyt dużego n zwrócony zostanie null.

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