• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Stworzenie listy [C]

Object Storage Arubacloud
0 głosów
149 wizyt
pytanie zadane 14 stycznia 2018 w C i C++ przez lambdag Obywatel (1,310 p.)

Witam chciałbym dodać do listy elementy, zrobiłem taki kod ale coś jest nie tak..

#include <stdio.h>
#include <stdlib.h>
struct node{
    int w;
    struct node *next;


};
void filllist(struct node *list)
{
    int i;
    struct node *p;
   for(i = 0; i < 10 ; i++){
     p = (struct node*) malloc(sizeof(struct node));
     p->w = i;
     p->next = list;
     list = p;

}



}
void printlist(struct node *list)
{
    struct node *p;
    p = list;
    while(p != NULL )
    {
        printf("%d", p->w);
        p = p->next;


    }

}
int main()
{
    struct node *list = (struct node*) malloc(sizeof(struct node));
    list->next = 0;
    list->w = 5;
    filllist(list);
    printlist(list);
    return 0;
}

Wyświetla tylko 5..

1 odpowiedź

+1 głos
odpowiedź 14 stycznia 2018 przez tangarr Mędrzec (154,860 p.)

Końcówka funkcji filllist jest błędna. Powinno być
 

p->next = 0;
list->next = p;

W tej chwili gubisz cały ogon.

Zmienna list wewnątrz funkcji filllist jest kopią oryginalnego wskaźnika, dlatego nadpisywanie jego wartości nie ma wpływu na resztę programu.

komentarz 14 stycznia 2018 przez lambdag Obywatel (1,310 p.)
Dzięki a mógłbyś powiedzieć jakby to wygląda w odwrotną stronę tzn miałbym output

98765432105?

Czyli dodawałbym "coś" na początek, dołączałbym...
1
komentarz 14 stycznia 2018 przez tangarr Mędrzec (154,860 p.)

Mam nadzieję, że nie boisz się wskaźników.

 

void filllist(struct node **list)
{
    int i;
    struct node *p;
    for(i = 0; i < 10 ; i++){
        p = (struct node*) malloc(sizeof(struct node));
        p->w = i;
        p->next = *list;
        *list = p;
}

A potem wywołanie:
 

filllist(&list);

 

komentarz 14 stycznia 2018 przez lambdag Obywatel (1,310 p.)
Mógłbyś to jakoś wyjaśnić :D dokładnie chodzi mi o struct node **list ;D
1
komentarz 14 stycznia 2018 przez tangarr Mędrzec (154,860 p.)

Wszystkie argumenty przekazywane do funkcji są lokalnymi kopiami (nie dotyczy referencji, ale to C++). To, że możesz modyfikować dane przekazane przez wskaźnik możliwe jest tylko dzięki operatorowi wyłuskania -> i operatorowi gwiazdki (nie mam pojęcia jak go nazwać).

#include <stdio.h>

int globalnaZmienna = 100;

void test(int *wskaznik) {
    wskaznik = &globalnaZmienna;
    printf("test: %d\n", *wskaznik);
}

void test2(int **wskaznik) {
    *wskaznik = &globalnaZmienna;
}

int main() {
    int zmienna = 666;
    int *wskaznik = &zmienna;
    printf("main: %d\n", *wskaznik);
    test(wskaznik);
    printf("main: %d\n", *wskaznik);
    test2(&wskaznik);
    printf("main: %d\n", *wskaznik);
    return 0;
}

Może ten przykład trochę ci rozjaśni sytuację.

1
komentarz 14 stycznia 2018 przez tangarr Mędrzec (154,860 p.)

Może ten przykład będzie trochę lepszy:
 

include <stdio.h>
  
void test(int *wskaznik) {
    printf("test - adres wskaznika: %p\n", &wskaznik);
}

void test2(int **wskaznik) {
    printf("test2 - adres wskaznika: %p\n", &(*wskaznik));
    printf("test2 - adres wskaznika: %p\n", wskaznik);
}

int main() {
    int zmienna = 666;
    int *wskaznik = &zmienna;
    printf("main - adres wskaznika: %p\n", &wskaznik);
    test(wskaznik);
    test2(&wskaznik);
    return 0;
}

Wszystkie wskaźniki wskazują na zmienną zmienna (wartość 666).
Ten przykład pokazuje, że wskaźnik też leży w pewnym miejscu w pamięci.
Sztuczka zastosowana w funkcji test2 pozwala na zmodyfikowanie wskaźnika wskaznik z funkcji main.

komentarz 14 stycznia 2018 przez lambdag Obywatel (1,310 p.)
Ciekawe ;)

Podobne pytania

+1 głos
1 odpowiedź 271 wizyt
pytanie zadane 31 sierpnia 2022 w C# przez Nabuchadonozor Gaduła (3,120 p.)
0 głosów
1 odpowiedź 265 wizyt
+1 głos
2 odpowiedzi 314 wizyt
pytanie zadane 28 lipca 2017 w HTML i CSS przez imklau Nałogowiec (42,090 p.)

92,626 zapytań

141,486 odpowiedzi

319,844 komentarzy

62,009 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...