Problem: Program dodaje kolejny element na koniec listy ale jest problem z dodaniem na jej początek.
Rozwiązanie: wystarczyło dodać *liczby = temp2; Trudno zauważyć w tym C cokolwiek, trzeba sobie wyobrażać te adresy etc.

#include "stdio.h"
#include "stdlib.h"

typedef struct Wszystkie_liczby Liczby;
struct Wszystkie_liczby
{
	int liczba;
	Liczby *wsk;
};

Liczby *Kolejna(int liczba)
{
	Liczby *wynik = (Liczby *)malloc(sizeof(Liczby));
	wynik -> liczba = liczba;
	wynik -> wsk = NULL;
	return wynik;
}

void Dodaj_liczbe(Liczby **liczby, int liczba, int poczatek0_koniec1)
{
	if ((*liczby) == NULL)
	{
		(*liczby) = Kolejna(liczba);
		return;
	}
	if ( poczatek0_koniec1 == 0 )
	{
		Liczby *temp = Kolejna(liczba);
	        temp -> wsk = (*liczby);
	        *liczby = temp;
		return;
	}
	Liczby **temp = &((*liczby) -> wsk);
	while((*temp) != NULL) temp = &((*temp) -> wsk);
	*temp = Kolejna(liczba);
}

void Czysc_pamiec(Liczby **liczby)
{
	if ((*liczby)==NULL) return;
	Liczby *pom;
	while((*liczby)!=NULL)
	{
		pom = (*liczby);
		(*liczby) = (*liczby) -> wsk;
		free(pom);
	}
}

void Wyswietl_wszystko(Liczby *liczby)
{
	if(liczby == NULL) printf("\n\nBrak elementow do wyswietlenia !");
	int i = 0;
	while(liczby != NULL)
	{
		i++;
		printf("\n%d. %d", i, liczby -> liczba);
		liczby = liczby -> wsk;
	}
}

void menu(Liczby **liczby, int *opcja)
{
	int liczba;
	system("cls");
	switch(*opcja)
	{
		case 1:
			{
				printf("\nDodawanie liczby na poczatek listy: ");
				printf("\n\nWprowadz liczbe: ");
				scanf("%d", &liczba);
				Dodaj_liczbe(liczby, liczba, 0);
				printf("\n\n\n\n");
			}
			break;
		case 2:
			{
				printf("\nDodawanie liczby na koniec listy: ");
				printf("\n\nWprowadz liczbe: ");
				scanf("%d", &liczba);
				Dodaj_liczbe(liczby, liczba, 1);
				printf("\n\n\n\n");
			}
			break;
		case 3:
			{
				printf("\nWyswietlanie wszystkich liczb z listy: ");
				Wyswietl_wszystko(*liczby);
				printf("\n\n\n\n");
				system("pause");
			}
			break;
		case 4:
			{
				printf("\nZwalnianie pamieci - usuwanie listy: ");
				Czysc_pamiec(liczby);
				printf("\n\n\n\n");
			}
			break;
		default:
			{
				printf("\nWybrales zla opcje ! Sprobuj ponownie...\n\n\n\n");
			}
			break;
	}
}

int main()
{
	Liczby *liczby = NULL;
	int opcja = 1;
	while(opcja != 0)
	{
		system("cls");
		printf("\n0. Wyjdz z programu,");
		printf("\n1. Dodaj liczbe na poczatek listy,");
		printf("\n2. Dodaj liczbe na koniec listy,");
		printf("\n3. Wyswietl wszystkie liczby,");
		printf("\n4. Zwolnij pamiec.");
		printf("\n\nWprowadz liczbe: ");
		scanf("%d", &opcja);
		if(opcja == 0) return 0;
		menu(&liczby, &opcja);
	}
	Czysc_pamiec(&liczby);
	system("pause");
}