Listy jednokierunkowe - jak zrozumieć ?

0

Czytam już coś koło 3h o listach jednokierunkowych i nadal nie wiele umiem. Znacie może stronę gdzie jest to dość jasno wytłumaczone ? Chodzi o język C.

0

Czego nie rozumiesz?

Nie znasz struktur w c, nie wiesz jak używać malloc czy samej idei nie rozumiesz?

0

idee rozumiem, struktury w miarę możliwości znam. Jednak nie umiem napisać tej listy.

0

@nowicjusz35 - zasada jest taka sama, bez względu na język (no chyba że język nie wspiera wskaźników); Najpierw musisz zrozumieć jak taka lista wygląda i jak działa, aby wiedzieć jak się do niej dobrać; Następnie uczysz się z kursów używania struktur i wskaźników; Jak już będziesz to umiał, to zaimplementowanie prostej listy to formalność - wystarczy rozpisać problem i po kolei pisać kolejne funkcje;

Napisz więc dokładnie czego nie rozumiesz lub czego nie umiesz oprogramować, a coś się doradzi; Przy czym nie zapomnij sam czegoś zrobić i pokazać w poście jakiś kod.

0

http://edu.i-lo.tarnow.pl/inf/alg/001_search/0086.php

Masz tam wszystko co ci potrzebne.
Jak wiesz jak mniej więcej wyglądają struktury to szybko ogarniesz i napiszesz to w c.
A jak nie rozumiesz czegoś to zadaj konkretne pytanie.

0

Jeżeli do tej pory jeszcze nie wiesz czego tak naprawdę nie rozumiesz, to obstawiam że po prostu nie rozumiesz idei właśnie. Bo jakbyś kodu nie rozumiał to byś podał np. że nie rozumiesz wskaźników albo nie rozumiesz struktur.

0

Wydaję mi się, że rozumiem. Tworzę strukturę,a w niej wskaźnik do następnego elementu oraz jakąś zmienna do zapisu danych.

I teraz nie wiem jak się poruszać po tej liście. Bo jeśli mam np. struct typedef Nazwa , to żeby stworzyć drugi element listy to trzeba wpisać taki kod np.
Nazwa *wsk
wsk->i nie wiem na co

1

@nowicjusz35 - tworzenie listy to nic innego jak tworzenie kolejnych węzłów (alokowanie dla nich pamięci), uzupełnianie w dane oraz wpisanie wskaźnika na nowy węzeł w odpowiednie pole z poprzedniego węzła listy;

Jeśli nowy węzeł dodajesz na końcu listy, to wystarczy stworzyć nowy węzeł, w poprzednim węźle ustawić wskaźnik na nowy węzeł, a w tym nowym węźle ustawić wskaźnik na kolejny węzeł na null, bo kolejnego nie ma; Wstawianie nowego węzła oznacza dodatkowo ustawienie wskaźnika na kolejny węzeł w nowo utworzonym węźle;

Masło maślane, ale ideę powinieneś łyknąć; Spróbuj coś napisać a zobaczysz, że nie taki diabeł straszny.

0

Jak do takiego czegoś stworzyć nowy element ?

#include <stdio.h>
#include <stdlib.h>

typedef struct Zeszyt
{
    int wartosc;
    int *nastepny;
}pierwszy;

Zeszyt *NowyWezel;

 

Coś w tym stylu: ?

Zeszyt *NowyWezel
{
    int *wskaznik;
    wskaznik = &pierwszy;
    wskaznik->wartosc = 4;
    nastepny = wskaznik;
}
0

pomoże ktoś napisać prostą liste składającą się np.z dwóch elementów ? Bo nic mi nie wychodzi.

0

Na temat różnych lista masz pełno materiałów w internecie. Chociażby pierwszy lepszy wynik z googli: http://staff.iiar.pwr.wroc.pl/wojciech.bozejko/elearning/Wyk3_listy.pdf

0

Czytałem i ten link ale nadal nie umiem

0

Jeśli mam takie coś:

typedef struct element{
    int x;
    struct element *n;
} el_listy;
 
el_listy *first; 

to el_listy jest obiektem struktury element ? to tak można po prostu obiektem wskaźnik stworzyć ?

0

Jest ktoś mi w stanie pomóc z tymi listami, bo nadal nic. Czytam i czytam i nic z tego nie wynoszę.

0

Napisałem na ten temat artykuł, robienie listy w javie krok po kroku powinieneś zrozumieć (bardziej łopatologicznie chyba się nie da):
http://strefakodera.pl/algorytmy/abstrakcyjne-struktury-danych/abstrakcyjne-struktury-danych-lista

jak masz jakieś pytania to pisz ;-)

0

Ok już patrzę, choć javy nie miałem. A możesz odpowiedzieć mi na te pytanie: http://4programmers.net/Forum/1110348

0
nowicjusz35 napisał(a):

Ok już patrzę, choć javy nie miałem.

Moim zdaniem na Javie łatwiej zrozumieć (nie ma wskaźników).

nowicjusz35 napisał(a):

A możesz odpowiedzieć mi na te pytanie: http://4programmers.net/Forum/1110348.

Pokaż cały kod jaki zrobiłeś do tej pory chyba, że na Javie będziesz teraz robił to pisz ;)

0

@nowicjusz35 - tak patrzę na Twój kod (ten):

typedef struct element{
    int x;
    struct element *n;
} el_listy;
 
el_listy *first;

i odnoszę wrażenie, że jednak nadal nie masz pojęcia, jak powinna wyglądać reprezentacja listy... Każdy pojedynczy węzeł, bez względu na to czy jest pierwszym, ostatnim czy środkowym węzłem listy, musi posiadać jakieś dane oraz wskaźnik na kolejny węzeł;

W pseudokodzie deklaracja struktury jako pojedynczego węzła powinna wyglądać tak:

list_node_pointer = pointer of list_node;
list_node = struct{
  int data;
  list_node_pointer nextNode;
}

I teraz wszystkie węzły listy tworzysz używając jedynie typu list_node_pointer; To oczywiście pseudokod - w Pascalu deklaracja typów, na których opierałaby się lista, mogłaby wyglądać tak:

type
  PListNode = ^TListNode; // wskaźnik na strukturę węzła
  TListNode = record      // struktura węzła:
    Data: Integer;        // * dane węzła (tutaj liczba)
    Next: PListNode;      // * wskaźnik na kolejny węzeł listy
  end;

Analogicznie do wcześniejszego przykładu, typ TListNode definiuje to co posiada pojedynczy węzeł, a do stworzenia listy używany będzie jedynie wskaźnik na strukturę, czyli w tym przypadku PListNode;

W deklaracji występuje zapętlenie, albowiem deklaracja struktury wymaga wskaźnika na węzeł, a typ wskaźnika wymaga zdefiniowanej struktury; Jednak w najpopularniejszych językach takie zapętlenie nie jest problemem.

0

@nowicjusz35 - masz więc przykład w C:

typedef struct Node
{
  int Value;          /* wartosc przechowywana */
  struct Node* Next;  /* wskaznik na nastepny element */
} Node;

Źródło: http://www.matematyka.pl/98027.htm

0

Mam taki pojedyńczy węzeł:

typedef struct Kartka
{
    int wartosc;
    Kartka *nastepny;
} 

i nie wiem jak stworzyć kolejny węzeł

0

Normalnie deklarujesz wskaźnik na strukturę węzła, następnie alokujesz mu pamięć, uzupełniasz dane węzła (do pola z danymi wpisujesz jakąś liczbę, którą ma węzeł przechowywać, a do nastepny wpisujesz null) i zawartość tego wskaźnika wpisujesz do pola nastepny w ostatnim węźle listy;

Proponuję Ci najpierw nauczyć się obsługi wskaźników, bo jak widać z tym też masz problem; Nie wiesz jak się ich używa, nie wiesz jak alokować pamięć, a już bierzesz się za listy; Jeszcze za wcześnie, więc zaglądnij do jakiegoś kursu.

0

nie tworzysz go tutaj tylko w mainie uruchamiając metodę odpowiednią

węzę to obiekt robisz go raz (tzn. piszesz)

1

W podlinkowanym PDF'ie od @olek1 Masz opis jak dla idioty. Przeczytałeś to czy olałeś? Czytaj i wykonuj tę instrukcję krok po kroku to zrobisz tę listę. Jeśli nie rozumiesz musisz wrócić do wskaźników - alokowania struktur na stercie itd. Więcej samodzielności a nie gnasz na forum z każdą pierdołą.

0

Lista i dodawanie nowych elementów.
Bardzo prosty przykład w C++

#include <iostream>

using namespace std;
// struct z polem typu int i polem next typu Lista
struct Lista   
{
    int liczba;
    Lista *next;

};
// funkcja drukujaca liste
void drukuj(Lista *adres)
{
    while(adres!=NULL)
    {
        cout << adres->liczba << endl;
        adres = adres->next;  // przesuwamy się do następnego elementu 
    }

}

int main()
{
    Lista *head = NULL;  // pusta zmienna typu Lista
    int a = 234;
    int b = 456;
    int c = 212;

    // nowy element typu Lista
    Lista *nowy1 = new Lista;
    nowy1->liczba = a; 
    nowy1->next = head; // next wskazuje na head, czyli nowy1 jest podpięty do head
    head = nowy1;   // head jest teraz nowy1

    Lista *nowy2 = new Lista;
    nowy2->liczba = b;
    nowy2->next = head;  // nowy2 wskazuje na head, a head to jeszcze nowy1, teraz nowy2 wskazuje na nowy1
    head = nowy2;            // tutaj już head jest nowy2 i mamy nowy2 podpięty do nowy1

    Lista *nowy3 = new Lista;
    nowy3->liczba = c;
    nowy3->next = head;  // wskazuje na nowy2, czyli teraz jest nowy3->nowy2->nowy1
    head = nowy3;  // head jest teraz nowy3

    drukuj(head); // drukujemy liste

    return 0;
}

 

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