Nie mam pojęcia po co jest ta pętla:
while(P!=NULL && P->nazwa!="mleko")
{
P=P->next;
}
Btw. porównanie `P->nazwa!="mleko"` porównuje wskaźniki (adresy), ciągi znaków w C porównuje się za pomocą strcmp.
W drugiej pętli warunek `P->nazwa == "mleko"` jest zarówno niepoprawny (wyjaśnione powyżej) jak i niepotrzebny (tutaj nie wiem co ci powiedzieć, bo serio - nie wiem po co).
suma += P->nazwa;
Pomijając, że to się w ogóle nie skompiluje: wystarczy `++suma;`. suma ma zawierać liczbe elementów o nazwie mleko, tak?
To
P=P->next;
Nie powinno być wewnątrz ifa. Chcemy przejść do następnego elementu zawsze. Obecnie masz możliwość wpadnięcia w nieskończoną pętlę.
w niektórych strukturach danych stosuje się w funkcji typ argumentu (tTowar *P) albo (wTowar P). Czym się to różni i czy któreś z nich jest błędem?
wTowar to typedef (alias dla nazwy typu) oznaczający dokładnie tTowar*. Więc nie - niczym się nie różni i żadno nie jest błędne.