Usuwanie pierwszego elementu stosu

0

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);
	}
} 
1

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ą.

0

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!

0

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

0

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ć.

1

_
no ile można pytać o listę jednokierunkową i opartym na niej stosie >:I

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