Funkcja dodająca nowy element do listy.

0

Witam. Mam niby banalną rzecz którą chciałbym wykonać, a mianowicie napisać funkjcę która doda mi nowy element do listy.
Pobierenie elementow listy oraz sama struktura wyglądają następująco:

 typedef struct znak 
	{
		unsigned char pojedynczy;			   //element
		struct znak *nastepna;				   //wskaznik na kolejny element listy
	}znak;
 
int main()
{
	znak *glowny = NULL;
    znak *poprzedni, *biezacy;
	printf(" \n\nProgram obliczajacy funkcje haszujaca dla podanego przez uzytkowanika tekstu.\n\n");
    printf(" \n Podaj tekst. (enter konczy pobieranie tekstu) ");
   
	while((z = getchar()) != '\n')
    {
        biezacy = (znak *)malloc(sizeof(biezacy));						//pobieranie
        if(glowny == NULL)												//znakow
            glowny = biezacy;											//do 
        else															//listy
            poprzedni->nastepna = biezacy;
        biezacy->nastepna = NULL;
		biezacy->pojedynczy = z;
        poprzedni = biezacy;
        i++;
		dlugosc = i;
    }

	biezacy = (znak *)malloc(sizeof(biezacy));
		poprzedni->nastepna = biezacy;
	biezacy->nastepna = NULL;
	biezacy->pojedynczy = '\0';		  //dodaje NULL na koncu stringa
	poprzedni = biezacy;
	i++;

	biezacy = (znak *)malloc(sizeof(biezacy));
	poprzedni->nastepna = biezacy;
	biezacy->nastepna = NULL;
	biezacy->pojedynczy = 128;		  //dodaje 10000000(bitowa 1) do listy
	poprzedni = biezacy;
	i++;

	// wstaw_element(poprzedni, nowszy, 128);

(.....)

A oto co sam napisałem i od dobrych paru godzin próbuję modyfikować na różnoraki sposób, ażeby zadziałało..

void wstaw_element(znak *aktualny,znak  *nowy, unsigned char a)
{
	while(aktualny->nastepna != NULL)
		aktualny = aktualny->nastepna;
	nowy = (znak *)malloc(sizeof(nowy));						  //funkcja wstawiajca element do listy
	aktualny->nastepna = nowy;
	nowy->pojedynczy = a;
	nowy->nastepna = NULL;
	aktualny = nowy;
	i++;
} 

Proszę o jakieś podopowiedzi.
Pozdrawiam.

0

Zmieniasz wartość argumentu, tj. wskaźnik tylko w jej ciele. Na zewnątrz wciąż będzie wskazywał na oryginalną wartość. Możesz użyć np. wskaźnik na wskaźnik (znak **aktualny).

0

Dzięki za odpowiedź!
Jednak nie do końca rozumiem co piszesz.

0

Widzę teraz, że w sumie nie zmieniasz tego parametru w tej funkcji, co nie zmienia faktu, że ten kod jest delikatnie mówiąc nieelegancki.

Z drugiej strony, na cholerę Ci w ogóle lista? Jeden, jednobajtowy znak zajmuje ci.. 5 albo 9 bajtów. Do tego do każdego znaku musisz tworzyć nowy element.. nie jest to zbyt wydajne. Stwórz jakiś sensowny bufor i jak będzie ci brakować miejsca to wywołaj realloc (też nie co jeden znak, czasami jest tak, że miejsca brakuje i realloc będzie musiało skopiować cały napis gdzie indziej).

char *napis = NULL, znak;
int i, j;

for(i = 0, j = 0; (znak = getchar()) != '\n'; i++)
{
	// `j` to ilość powiększeń bufora, a `j^2` to rozmiar bufora

	if(i == j * j)
	{
		j++;
		napis = (char*)realloc(napis, sizeof(char) * j * j);
	}

	napis[i] = znak;
}
napis = (char*)realloc(napis, sizeof(char) * i);
napis[i] = '\0';
0

Ale niestety muszę ten program wykonać przy użyciu list.
Mam jeszcze pytanie czy da się zrobić pustą tablicę?
Bo przy tworzeniu w przyporządkowują jej się przypadkowe elementu, a chciałbym zrobić żeby nic tam się nie znajdowało.

1 użytkowników online, w tym zalogowanych: 0, gości: 1