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

// struktura dla listy jednokierunkowej
struct ListaInt {
	int liczba;
	struct ListaInt* next;
} Lista;

int main() {
	struct ListaInt *head, *nowy, *tmp = NULL;

	int liczba, i, deleted = 0;
	printf("Podaj liczbe: ");
	scanf_s("%d", &liczba);
	// tworzenie głowy
	head = malloc(sizeof(Lista));
	head->liczba = liczba;
	head->next = NULL;
	tmp = head;

	// tworzenie ogona
	for (i = 0; i<3; i++){
		printf("Podaj liczbe: ");
		scanf_s("%d", &liczba);
		// tworzenie miejsca w pamieci dla obiektu
		nowy = malloc(sizeof(Lista));
		// wpisywanie wartosci w pola struktury
		nowy->liczba = liczba;
		nowy->next = NULL;
		// tmp wskazuje na "jeden wczesniej" dzieki temu poprzedni element listy moze wskazywac na juz istniejacy element
		tmp->next = nowy;
		tmp = nowy;
	}

	//tworzenie nowej glowy
	printf("Podaj liczbe: ");
	scanf_s("%d", &liczba);
	// tworzenie miejsca w pamieci dla obiektu
	nowy = malloc(sizeof(Lista));
	// wpisywanie wartosci w pola struktury
	nowy->liczba = liczba;
	// wskazujemy na stara glowe
	nowy->next = head;
	head = nowy;

	// usuwanie elementu o konkretnej liczbie
	printf("Podaj liczbe do skasowania: ");
	scanf_s("%d", &liczba);
	// aby przeszukac liste należy wskaźnik tmp ustawić na pierwszy element
	tmp = head;
	// usowanie glowy
	if (head->liczba == liczba)
	{
		head = head->next;
		free(tmp);
		deleted = 1;
	}
	//w przeciwnym razie przeszukujemy liste
	//tworze pomocniczy element do kasowania
	struct ListaInt *aktualny = NULL, *poprzedni = NULL;
	while (!deleted&&tmp->next != NULL){
		if (tmp->next->liczba == liczba)
		{
			aktualny = tmp -> next;
			tmp->next = tmp -> next -> next;
			free(aktualny);
			deleted = 1;
		}
		poprzedni = tmp;
		tmp = tmp->next;
	} 
	if (!deleted&&tmp->liczba == liczba)
	{
		poprzedni->next = NULL;
		free(tmp);
	}



	// aby wyswietlic listę należy wskaźnik tmp ustawić na pierwszy element
	tmp = head;
	do{
		printf("liczba to: %d\n", tmp->liczba);
		tmp = tmp->next;
	} while (tmp != NULL);

	// ewentualnie mozna for
	tmp = head;
	/*for (i = 0; i<5; i++){
		printf("liczba to: %d\n", tmp->liczba);
		tmp = tmp->next;
	} */
	system("pause");
	return 0;
}
