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

Problem z wskaznikiem

0 głosów
303 wizyt
pytanie zadane 11 marca 2018 w C i C++ przez lambdag Obywatel (1,310 p.)
edycja 11 marca 2018 przez Patrycjerz
struct node{
    int x;
    node *next;
};
void add(node *node1, int value)
{
    node *temp = new node;
    temp->x = value;
    temp->next = 0;
    if(node1 == 0)
    {
        temp->next = node1;
    }
    else{
    node *temp1 = node1;
    while(temp1->next != 0)
    {
        temp1 = temp1->next;
    }
     temp1->next = temp;
     //node1 = temp1;
    }
}
void print(node *node1)
{
     while(node1!= 0)
    {
        cout << node1->x << endl;
        node1 = node1->next;

    }

}
int main()
{
    node *start = 0;
     add(start, 5);
     add(start, 5);
     add(start, 5);
     add(start, 5);
    print(start);
    return 0;
}

Głównie to ta instrucja if(node1 == 0) { temp->next = node1; } nie działa, na pewno robię coś złe ale btw.. problem jest z głowa jak nie mam nic czyli wskaznik na zero no to chce go ustawić na "tempa" no i się pewnie ustawia ale w taki sposób że nie wiem jak, proszę o pomoc jakbym zrobił w main()...  node *start = new node; start->x = 3; start->next = 0; to wtedy wszystko śmiga.

1 odpowiedź

+1 głos
odpowiedź 11 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)

Funkcja add nie trzyma się kupy. Po pierwsze, cały czas przesyłasz do funkcji head z wartością NULL, więc funkcja stoi w martwym punkcie. Po drugie, w if dodajesz element na początek listy, zaś w else już na koniec. Nieco konsekwencji. Kod poprawiony powinien wyglądać tak:

struct node{
    int x;
    node *next;
};
void add(node **node1, int value)
{
    node *temp = new node;
    temp->x = value;
    temp->next = 0;
    if(*node1 == 0)
    {
        *node1 = temp;
    }
    else{
    node *temp1 = *node1;
    while(temp1->next != 0)
    {
        temp1 = temp1->next;
    }
     temp1->next = temp;
     //node1 = temp1;
    }
}
void print(node *node1)
{
     while(node1!= 0)
    {
        cout << node1->x << endl;
        node1 = node1->next;
 
    }
 
}
int main()
{
    node *start = 0;
     add(&start, 5);
     add(&start, 5);
     add(&start, 5);
     add(&start, 5);
    print(start);
    return 0;
}
komentarz 11 marca 2018 przez lambdag Obywatel (1,310 p.)

Masz jakaś lekturę online o tym właśnie, bo tak sądziłem żeby użyć "dwóch gwiazdek" ale zbytnio jestem laikiem nie znasz jakieś lektury online? btw

void deletel(node *node1, int x)
{
    node *tmp = 0;
    int i = 0;
    node *temp2 = node1;
    while(i != x)
    {
        temp2 = temp2->next;
        i++;
    }
    tmp = temp2->next;
    i = 0;
    while(i != x-1)
    {
        node1 = node1->next;
        i++;

    }
    delete node1->next;
    node1->next = tmp;



}

Niby działa, pytanie czy dobrze?

1
komentarz 11 marca 2018 przez Patrycjerz Mędrzec (192,320 p.)
Co ta funkcja ma robić? Usuwać element o danym indeksie (0 to head)?

Wskaźniki same w sobie nie są trudne. Należy zapamiętać, że obiekt TYP* nazwa przechowuje adresy obiektów typu TYP. To wszystko. W naszym przypadku zmienna node** node1 przechowuje adresy zmiennych typu node*, czyli adresy wskaźników na node.
komentarz 12 marca 2018 przez lambdag Obywatel (1,310 p.)
Można tak powiedzieć że usuwa o danym indeksie tylko głowy nie usuwa bo się tak zastanawiam czy jeśli bym chciał usunąć głowe czy nie prościej po prostu "przepisać dane" z 1 członu do głowy i usunąć 1 człon w takim jednym wypadku?

Podobne pytania

0 głosów
2 odpowiedzi 989 wizyt
pytanie zadane 23 czerwca 2021 w C i C++ przez Eriss69 Gaduła (4,470 p.)
0 głosów
1 odpowiedź 274 wizyt
pytanie zadane 27 czerwca 2018 w C i C++ przez Piotr Lis Obywatel (1,310 p.)
0 głosów
1 odpowiedź 1,051 wizyt

93,692 zapytań

142,611 odpowiedzi

323,220 komentarzy

63,220 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...