lista jednokierunkowa a wskaźnik do wskaźnika

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

typedef struct REF
{ int value; struct REF * next; } ref;

void push(int x, ref **h) {
   ref *p; p=(ref*)malloc(sizeof(ref));

   if(p!=NULL)
   	{ p->value=x; p->next=*h;*h=p;}
} //push
void druklista(ref *h)
{
  printf("{");
   while(h!=NULL)
   	{
         printf("%d",h->value);
         h=h->next;
         if (h!=NULL) printf(",");
      }
  printf("}\n");
}

int main(){
ref* list;
push(1,&list);
push(2,&list);
push(3,&list);

druklista(list);
}

Nie rozumiem dlaczego w funkcji push musi być wskaźnik do wskaźnika a nie sam wskaźnik do h czy chodzi o to że jak mamy wskaźnik do wskaźnika to wklejamy całą listę a tak to byśmy wklejali pierwszy element?

2

Chodzi o to, żeby funkcja nie pracowała na kopii wskaźnika tylko na oryginalnym wskaźniku. No, bo cóż z tego, że będziesz dokładać elementów do kopii skoro nie jest dostępna poza funkcją. Nie wklejasz całej listy - wklejasz jedynie wskaźnik, bo tak naprawdę wszystko w C jest przekazywane przez wartość, nawet wskaźniki. Dlatego masz **wsk żeby nie przekazać przez wartość jego kopii.

PS: W ogóle nazywaj zmienne po imieniu i jakoś bardziej formatuj kod, bo nawet w przypadku prostej listy w Twoim kodzie ciężko połapać się z tym p, h etc...

0

a czy jeśli alokujemy pamięć dynamicznie w stylu c
tzn.

 p=(ref*)malloc(sizeof(ref));

to w (ref*) my dajemy kompilatorowi znać że chcemy wskaźnikowy typ ref?

1

Dajesz znać, ze to co wypluje malloc ma być typu ref*. Nominalnie malloc zwraca void* ale jeżeli chodzi o C to konwersja nie jest konieczna.

0

Tylko nie rozumiem w takim razie że w przypadku tej funkcji nawet jak nie stosuje podwójnego wskaźnika to mi i tak w main() zwraca posortowane i dlaczego?

 void sortlista(ref*h){

ref*p,*r;int naj;
while(h!=NULL){
    naj=h->value;r=h;p=h->next;
    while(p!=NULL)
    {
        if(p->value>naj){naj=p->value;r=p;}
        p=p->next;
    }
    if(r!=h){r->value=h->value; h->value=naj;}
    h=h->next;
    }
}//sortlista 0(n^2)

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