Dlaczego funkcja pop(ma ona usunąć pierwszy element listy) nie działa prawidłowo?
typedef struct list list;
struct list{
list* next;
int key;
}*head, *x;
void pop(list *head){
if (head){
list *p = head;
head = head->next;
free(p);
}
}
Dlaczego funkcja pop(ma ona usunąć pierwszy element listy) nie działa prawidłowo?
typedef struct list list;
struct list{
list* next;
int key;
}*head, *x;
void pop(list *head){
if (head){
list *p = head;
head = head->next;
free(p);
}
}
Bo funkcja pracuje na kopii argumentu i jego zmiana NIE JEST widoczna poza funkcją. Musiałbyś użyć tutaj podwójnego wskaźnika.
Przykład:
void funkcja(int parametr){
parametr = 1;
}
int main(){
int x = 0;
funkcja(x);
printf("%d",x);
return 0;
}
Taki kod wypisze ci nadal 0. Bo zmienna wewnątrz funkcji jest jedynie kopią.
jak już to to co napisał @Shalom wziąć sobie do serca i co najwyżej napisać funkcję:
void pop(list **head)
i dodatkowo nie ze stosu, bo to nie jest stos, ze stosu zdejmujemy tylko ostatni element!
Gdy użyję podwójnego wskaźnika program się nie kompiluje i wyskakują mi takie błędy:
'initializing' : cannot convert from 'list **' to 'list *'
left of '->next' must point to class/struct/union/generic type
'void pop(list **)' : cannot convert argument 1 from 'list *' to 'list **
ps. To jest stos... reszta mojego programu wygląda tak:
void push(list *x){
x->next = head;
head = x;
}
void main(){
int i = 0, n = 6, k=2;
for (i = 0; i < n; i++){
x = (list*)malloc(sizeof(list));
x->next = NULL;
x->key = i;
push(x);
}
getche();
}
head określa ostatni wprowadzony element
edit2. teraz zauważyłem, że nazwa tematu źle przedstawiła moje intencje xd Usunięcie pierwszego elementu 'od góry', czyli głowy
Bo wywołałeś do tej pory pop()
z jedną gwiazdką, a teraz ma dwie gwiazdki, więc samo wywołanie też musi się zmienić.
_
no ile można pytać o listę jednokierunkową i opartym na niej stosie >:I