Powiedzmy, że mam taki węzeł do tego:

struct node{
    data_t data;
    struct node* prev;
    struct node* next;
};

Zwykle podróżowałem przez listę, używając adresów Poprzednie / następne zapisane na liście.

Jeśli nie jestem pomylony, gdy mam type_t *cursor i po prostu zrób cursor++ wskazuje na następny obszar danych jego typu;

Zastanawiałem się więc, czy mogę po prostu usunąć prev / Next wskaźniki z struktury i podróży na liście, dodając / odejmowanie na a struct node *cursor , aby zapisać na przydzielonej pamięci.

Może gdybym usunąć wspomniane wskazówki, nie jest zagwarantowane, że węzły będą przylegać do siebie w kolejności, w jakiej zostały przydzielone? Czy w tym rozumowaniu jest coś innego, co może zrobić błędy?

Moja nadzieja byłaby taka, że jeśli malloc dziesięć struktury, a następnie weźmie struct node* cursor na adresie głowy listy i zrób {x1}} Dostaję 7. węzeł listy, ale może mi się mylę i nie działa tak?

0
wattbatt 1 sierpień 2020, 12:25

2 odpowiedzi

Najlepsza odpowiedź

Jeśli twój węzeł są przydzielany jeden po drugim, nie można udać się do następnego / poprzedniego przez included wskaźnik do jednego z nich, ponieważ nie możesz przypuszczać, że sąsiedztwo w pamięci

Moja nadzieja byłaby taka, że jeśli malloc dziesięć struktury, a następnie weź skórkę strukturą * na adres główny listy i do kursora = kursor + 7 Dostaję 7. węzeł listy, ale może mi się mylę i nie działa i nie działa że?

Możesz to zrobić, zaletą jest wskaźnik prev / Next, więc zapamiętaj tylko Data Oszczędzanie, czas dostępu do elementu jest również natychmiastowy, a nie na o (n) , Wadą jest wadą, w której chcesz dodać / usunąć elementy, ponieważ musisz przenieść te po.

Uwaga Posiadanie tablicy można uzyskać również dostęp do elementu z indeksiem, a nie wskaźnikowi do tego elementu.

Funkcja realloc umożliwia zmianę rozmiaru dynamicznej tablicy, zarówno do dodawania lub usuwania elementów z końca

2
bruno 1 sierpień 2020, 09:51

" mogę iść tam iz powrotem na liście tylko z wskaźnikiem algebry i usunąć poprzednie / następne wskazówki? "

"Może, jeśli zdejmieję wspomniane wskazówki, nie jest zagwarantowane, że węzły będą przylegać do siebie w kolejności, w jakiej zostały przydzielone? "

Możesz iść tam iz powrotem, jeśli masz statyczną lub dynamicznie przydzieloną tablicę struct node. Wtedy gwarantuje, że każdy element jest przechowywany w kolejnej kolejności i można użyć arytmetyki wskaźnika.

Niestety, w większości przypadków przy użyciu połączonych list, tak nie jest tak, jak każdy węzeł jest przydzielany oddzielnie.

" zastanawiałem się, czy mogę po prostu usunąć prev / next wskaźniki z struktury i podróży na liście, dodając / odejmowanie do struct node *cursor, aby zapisać na przydzielonej pamięci. "

Jak powiedział powyżej, tylko wtedy, gdy przydzielasz tablicę node. W przeciwnym razie, jeśli każdy node jest przydzielany oddzielnie, a następnie nie możesz lub lepiej, że jest to niezdefiniowane zachowanie według dowolnej próby.

Standard C zakazuje zwiększenia wskaźnika po jednym obok agregatu lub obiektu skalarnego.

Nie wspominając o tym, że oczywiście zalewając wskaźnik, który wskazuje po agregatowi lub skalarnym obiektowi, nie jest również dozwolone.

" moja nadzieja byłaby taka, że jeśli ja malloc() dziesięć struktur, a następnie weź następnie kursor struct node* na adresie głowy listy i zrobić {x2}} Dostaję 7. węzeł listy, ale Może się mylę i nie działa tak? "

Działa tylko wtedy, gdy jesteś malloc() wszystkie dziesięć struktur za pomocą jednego połączenia do malloc. Następnie struktury są przechowywane sąsiednie w pamięci i wskaźnik arytmetyki gwarantowanej do pracy.

Należy również pamiętać, że musisz użyć cursor = cursor + 6;, aby dostać się do węzła 7 TH, a nie cursor = cursor + 7; jako indeksowanie uruchamia się w 0, a nie 1.

1
RobertS supports Monica Cellio 1 sierpień 2020, 12:43