Przez usunięcie elementu rozumiem zwolnienie zaalokowanej wcześniej dla niego pamięci. Nie wiem jak to możliwe, ale free(head) robi nieskończoną pętle, tzn działanie programu nigdy się nie kończy i jakieś krzaczki ciągle wyskakują. Jak wywalam tą linijke free(head) z kodu to tej pętli nie ma. Ostatniego elementu mi dobrze nie usuwa, bo funkcja wyświetlająca zawartosc listy pokazuje, że ostatni element;/ Tu jest mój cały kod programu:
#include <stdio.h>
#include <stdlib.h>
/* Struktury */
struct ksiazka{
char tytul[256];
};
struct lista{
struct lista *next;
struct ksiazka ks;
};
/* Funcje użyte w programie */
void zapisz(int n);
struct lista* wczytaj_baze(int n);
void wyswietl(struct lista* head);
struct lista* dodaj(struct lista* head);
struct lista* usun(struct lista* head);
int main(int argc, char *argv[])
{
int n, liczba_ksiazek_do_usuniecia, i=0, liczba_ksiazek_do_dodania;
struct lista* head=NULL;
printf("Ile ksiazek chcesz pobrac z pliku??\n");
scanf("%d", &n);
// zapisz(n);
if(n<=0){
head=NULL;
} else{
head=wczytaj_baze(n);
}
printf("Stan listy po wczytaniu %d ksiazek z pliku: \n", n);
wyswietl(head);
printf("Ile ksiazek chcesz dolozyc??\n");
scanf("%d", &liczba_ksiazek_do_dodania);
while(i<liczba_ksiazek_do_dodania && liczba_ksiazek_do_dodania>0){
dodaj(head);
i++;
}
i=0;
printf("Stan listy po dodaniu %d ksiazek: \n", liczba_ksiazek_do_dodania);
wyswietl(head);
printf("Ile ksiazek chcesz usunac??\n");
scanf("%d", &liczba_ksiazek_do_usuniecia);
while(i<liczba_ksiazek_do_usuniecia && liczba_ksiazek_do_usuniecia>0){
usun(head);
i++;
}
i=0;
printf("Stan listy po usunieciu %d ksiazek: \n", liczba_ksiazek_do_usuniecia);
wyswietl(head);
system("PAUSE");
return 0;
}
void zapisz(int n){
FILE *plik;
struct ksiazka ks;
int i=0;
plik = fopen("dane.bin","wb");
system("CLS");
while(i<n){
printf("\nTytul ksiazki : ");
scanf("%s",&ks.tytul);
fwrite(&ks,sizeof(ks),1,plik);
i++;
}
fclose(plik);
printf("\n Zapisano do pliku... \n");
getch();
}
struct lista* wczytaj_baze(int n)
{
int i=0;
struct ksiazka ks;
FILE *plik;
struct lista* nowy=NULL;
struct lista* head=NULL;
struct lista* ogon=NULL;
if(n<=0){
return NULL;
}
if ((plik = fopen("dane.bin", "rb")) == NULL)
{
printf("Blad otwarcia pliku \n");
return NULL;
}
fread(&ks, sizeof(ks), 1, plik);
nowy=(struct lista*)malloc(sizeof(struct lista));
nowy->next = NULL;
nowy->ks=ks;
head=nowy;
ogon=nowy;
i++;
while (fread(&ks, sizeof(ks), 1, plik)==1 && i<n) {
nowy=(struct lista*)malloc(sizeof(struct lista));
nowy->next = NULL;
nowy->ks=ks;
ogon->next=nowy;
ogon=nowy;
i++;
}
fclose(plik);
return head;
}
void wyswietl(struct lista* head){
if(head==NULL){
printf("Lista jest pusta!! \n");
} else{
do{
printf("%s\n",head->ks.tytul);
head=head->next;
}while(head);
}
}
struct lista* dodaj(struct lista* head){
char tytul[40];
struct lista *ogon=head;
struct lista* nowy=NULL;
//ustawienie ogona na koniec listy
if(ogon->next != NULL){
do{
ogon=ogon->next;
}while(ogon->next!=NULL);
}
printf("Podaj tytul ksiazki: ");
scanf("%s", tytul);
nowy=(struct lista*)malloc(sizeof(struct lista));
strcpy(nowy->ks.tytul,tytul);
nowy->next=NULL;
ogon->next=nowy;
ogon=nowy;
return head;
}
struct lista* usun(struct lista* head){
struct lista* tmp=NULL;
struct lista* tmp1=NULL;
if(head==NULL){
printf("Lista juz jest pusta");
return NULL;
}
if(head->next == NULL){
head=NULL;
free(head); //<--------------------------------------------------to coś powoduje pętle, gdy nie ma head=NULL przed. A head=NULL nie usuwa elementu
return head;
} else {
tmp=head;
tmp1=head;
tmp=tmp->next;
while(tmp->next!=NULL){
tmp=tmp->next;
tmp1=tmp1->next;
}
tmp1->next=NULL;
free(tmp);
return head;
}
}