Nie zapisujące się dane w liście jednokierunkowej

0

Witam, mam problem z poniższym programem. Wypisuje on mi nazwę oraz autora ksiazki, lecz za kazdym razem cenę podaje jako 0. Nie wiem gdzie jest błąd, pomożecie?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define max_dl_aut 31
#define max_dl_tyt 41

typedef struct KSIAZKA{

	char * autor;//[max_dl_aut];
	char * tytul;//[max_dl_tyt];
	float * cena;
}Ksiazka;

typedef struct LISTA lista;
struct LISTA{

	Ksiazka ksiazka;
	lista * nastepny;
	// lista * poprzedni;
};
char * dodaj_napis();


lista* stworz_element()//char * autor,char *tytul, float * cena)
{
	lista *element;
	
	char *autor, *tytul;
	
 	float  * cena;
 	
	char bufor[41];
	printf("Autor ");dodaj_napis(bufor);
	autor = (char*)malloc(sizeof(char)*(max_dl_aut));
	strcpy(autor,bufor);
 
	printf("Tytul ");dodaj_napis(bufor);
	tytul = (char*)malloc(sizeof(char)*(max_dl_tyt));
 	strcpy(tytul,bufor);
 	
	printf("Cena:");scanf("%f",&cena);
	cena = (float *)malloc(sizeof(float));
 	
	element = (lista*)malloc(sizeof(lista));
	element->nastepny = NULL;
	
	element->ksiazka.autor = autor;
	element->ksiazka.tytul = tytul;
	element->ksiazka.cena = cena;
 
	return element;
}


lista * wypisz(lista * wskaznik)
{
	lista * list = wskaznik;
	while(list != NULL)
	{
		printf("Autor: %s\n Tytul %s\n Cena: %.2f\n", list->ksiazka.autor, list->ksiazka.tytul, list->ksiazka.cena);
		list = list->nastepny;
	}
}


int main(void){

int wyjscie = 1;
int wybor = 0;

lista * head = NULL;

while(wyjscie){

printf("1 - Dodaj element do listy\n");
printf("2 - Wypisz liste\n");
printf("3 - Zakoncz program\n");
printf("Wybor:");scanf("%d",&wybor);

fflush(stdin);

switch(wybor){

	case 1:
	head = stworz_element(head);
	break;
	
	case 2:
	head=wypisz(head);
	break;
	
	case 3:
	wyjscie=0;
	
	puts("\n\nNarka!");
	puts("Narka!");
	puts("Narka!");
	break;

			}

}

free(head);
return 0;
}






char * dodaj_napis(char *z, int ile){

		char * wynik;
		char * tutaj;

		wynik = fgets(z , ile, stdin);
if(wynik){
		tutaj = strchr(z, '\n');
	
		if(tutaj)
		*tutaj = '\0';
		else
			while(getchar() != '\n')
			continue;

		}
return wynik;
}
1

Wtf, dlaczego cenę zapisujesz jako float*?

0

Faktycznie, doszedlem do konkluzji. DOdalem argument do funkcji stworz_element oraz wywalilem wskaznik cena, tzn float * cena na float cena oraz w funkcji stworz_element usunalem alokowanie mallociem tylko dodawanie bezpośrednio do struktury wartości cena.

0

A powie mi ktoś czemu wypisuje mi tylko ostatni element listy?

0

Ponieważ Twoja zmienna head reprezentuje tak naprawdę ostatni element listy, który nigdzie nie jest wiązany z innymi.

W ogóle cała ta implementacja jest do kitu:
1.Formatowanie kodu.
2.Funkcja wypisz nic nie zwraca, chociaż - najwyraźniej - powinna (sam jestem ciekaw, co takiego może zwracać).
3.Funkcja dodaj_napis tak naprawdę wczytuje napis od użytkownika, chociaż wcale nie wynika to z jej nazwy.
4.Wskaż palcem miejsca w kodzie, gdzie modyfikujesz pole nastepny. Czegoś brakuje, prawda?

Jak poprawisz te trzy rzeczy, zobaczymy co dalej.

0

Niestety, nie wiem jak zapisać ten wskaźnik, wedlug punktu 4. Poradziłbyś jak to zrobić?

0

Z tego co widzę, kolejny błąd fflush(stdin); może nie zadziałać dodatkowo chyba trochę przekombinowałeś ze wskaźnikami i nie zwalniasz pamięci...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.