Uf... myślałem, że będzie lepiej, ale się pomyliłem. Zaczynamy
1) funkcja struct stackpri *push_stackpri(struct stackpri *head, int key, int prio)
- po co jest twór spr ?
- po co jest twór guard ?
- po co jest ten fragment kodu ?
if(head)
{
while(spr->next)spr=spr->next;
spr->next=guard;
guard->prio=prio;
guard->next=NULL;
}
Nic nie wnosi do kodu...
2) ta sama funkcja struct stackpri *push_stackpri(struct stackpri *head, int key, int prio)
Warunek:
//...
else //jeśli priorytet głowy jest mniejszy od priorytetu nowego elementu
{
while(tmp->next->prio!=prio) tmp=tmp->next; //aż będzie istniał następny element i priorytet następnego mniejszy od priorytetu nowego
newel->next=tmp->next->next; //wskazanie na następny element nowego jest zmienione
newel->nextpri=tmp->next; //podnosimy tamten element do góry
tmp->next=newel; //cd
if(!newel->next)tail=newel;
}
Dane wejściowe z Twojego kodu. Przeanalizuj sobie, że uruchamiasz tą funkcję ze "stosem" który ma jeden element i wchodzisz do w/w warunku. Co się dzieje...
linia: while(tmp->next->prio!=prio) tmp=tmp->next;
skoro mamy tylko jeden element i next wskazuje na NULL'a, to dlaczego odpytujesz prio z NULL'a ? Przeciez next jeszcze nie istnieje... tutaj jest pierwsze naruszenie pamięci.
ta sama historia niżej, linia:
newel->next=tmp->next->next;
Skoro nie ma next, to odwołania się do next->next to kolejne naruszenie pamięci.
3) Tak jak ktoś wcześniej zauważył funkcję
int stack_empty(struct stackpri *head)
używasz jak zmiennej:
if(!stack_empty)
4) Zarządzanie pamięcią. W funkcji struct stackpri *push_stackpri(struct stackpri *head, int key, int prio)
alokujesz pamięc, a kto ja później posprząta?
Okej, aby pójść krok dalej, napisz proszę jak ma działać ten Twój algorytm bo z kodu ciężko wywnioskować. Nie ma tam logiki, która jest jasna.