Zmierzyłem się z wyzwaniem stworzenia algorytmu do wstawienia na górę listy połączonej. Ustawiłem wskaźnik, aby śledzić początek listy.
#include "Entry.h"
int main(void)
{
struct entry list;
struct entry *listPtr = &list;
list.value = 100;
n1.value = 200;
n2.value = 300;
n3.value = 400;
initList(&list);
struct entry insert;
insert.value = 1000;
update(&insert, &n2);
return 0;
}
Ćwiczenie sugeruje, że mogę użyć metody aktualizacji, aby wstawić nowy wpis na początku listy. Jak mogę to zrobić?
#include <stdio.h>
#include <stdbool.h>
struct entry
{
int value;
struct entry *next;
}n1, n2, n3, end;
void initList(struct entry *list)
{
list->next = &n1;
n1.next = &n2;
n2.next = &n3;
n3.next = &end;
end.value = 0;
}
void update(struct entry *insert, struct entry *after)
{
insert->next = after->next;
after->next = insert;
}
Odpowiedzi:
1 dla odpowiedzi № 1Możesz łatwo zmienić update
funkcja do
struct entry *update(struct entry *insert, struct entry *before, struct entry *after)
{
insert->next = after;
if (before != NULL)
{
before->next = insert;
return before;
}
return insert;
}
gdzie insert
to jest wpis do wstawienia, before
jest węzłem przed wstawionym, oraz after
jest węzłem po tym, który został wstawiony. Funkcja zwraca nowy wpis, jeśli jest wstawiany jako pierwszy wpis, i before
Inaczej.
Aby przejść do listy, użyj
list_to_prepend_to = update(node_to_insert, NULL, list_to_prepend_to);
Na przykład w kodzie możesz użyć
listPtr = update(&insert, NULL, &list);
while (listPtr)
{
printf("%dn", listPtr->value);
listPtr = listPtr->next;
}
aby dodać pozycję do listy i wydrukować listę. Aby wstawić na środku listy, nie potrzebujesz wartości zwracanej:
update(&insert, &list, &n1);
To sprawi insert
drugi wpis na twojej liście.
0 dla odpowiedzi nr 2
Przekazujesz adres n2 do funkcji aktualizacji. n2 nie jest wierzchołkiem elementu listy. Zostanie wstawiony element b / w n2 i koniec. Aby wstawić element po pierwszym elemencie, najwyższy
aktualizacja (& wstaw i & list);
Aby dodać nowy element do listy
struct entry new_element;
new_element.next = & list;
new_element.value = some_value;