Witam, wzorując się na jednym z kodów wyskrobałem listę, do której mogę dodawać kolejne przedmioty (i to działa), problem jest gdy chcę coś usunąć, ponieważ niekoneicznie usuwa ten element który ja chcę. Oto kod:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX1 30
#define MAX2 20
typedef struct{ //struktura Przedmioty
char nazwa_przedmiotu[MAX1];
int punkty_ects;
struct Przedmioty *next;
}Przedmioty;
void dodaj(Przedmioty **lista, Przedmioty *nowy){ //dodanie wezla do listy
nowy -> next = NULL;
if(!(*lista))
*lista = nowy;
else{
Przedmioty *ptr = *lista;
while(ptr->next)
ptr = ptr -> next;
ptr -> next = nowy;
}
}
void dodaj_przedmiot(Przedmioty **lista){ //dodaje przedmiot do listy
Przedmioty *nowy = (Przedmioty*)malloc(sizeof(Przedmioty));
printf("Podaj nazwe przedmiotu oraz ilosc punktow ECTS: \n");
scanf("%s %d",nowy->nazwa_przedmiotu,&(nowy->punkty_ects));
dodaj(lista,nowy);
}
void wypisz_liste(Przedmioty *lista){ //wypisywanie listy
Przedmioty *ptr = lista;
if(!lista)
printf("Lista jest pusta!");
else
printf("Oto przedmioty na liscie:\n");
int i=1;
while(ptr){
printf("%d. %s %d\n",i, ptr -> nazwa_przedmiotu, ptr -> punkty_ects);
ptr = ptr -> next;
i++;
}
printf("\n");
}
int usun(char *nazwa, Przedmioty **lista){ //usuwanie z listy
Przedmioty *poprzedni = NULL;
Przedmioty *ptr = *lista;
while((!ptr) && ((!strcmp(ptr->nazwa_przedmiotu,nazwa)))){
poprzedni = ptr;
ptr = ptr -> next;
}
if(!ptr)
return 0;
else{
if(!poprzedni){
(*lista) = (*lista) -> next;
free(ptr);
}
else{
poprzedni -> next = ptr -> next;
free(ptr);
}
return 1;
}
}
int main(void){
Przedmioty *lista = NULL;
int opcja=1;
char nazwa[MAX1];
while(opcja){
printf("\nMENU:\n");
printf("0. Wyjscie z programu\n");
printf("1. Dodaj przedmiot\n");
printf("2. Usun przedmiot\n");
printf("3. Wyswietl liste przedmiotow\n");
printf("Twoj wybor: ");
scanf("%d",&opcja);
printf("\n");
switch(opcja){
case 1:
dodaj_przedmiot(&lista);
break;
case 2:
printf("Podaj nazwe przedmiotu ktory chcesz usunac: ");
scanf("%s",nazwa);
usun(nazwa,&lista);
break;
case 3:
wypisz_liste(lista);
break;
}
}
return 0;
}
Siedzę nad tym już trochę i nic mi nie przychodzi do głowy, jakby ktoś mógł mi pomóc to byłoby fajnie ;)