Проласци кроз једноструко спрегнуту листу

У раду са једноструко спрегнутим листама често је потребно кретати се кроз листу, од елемента до елемента.

Најчешће је у питању обрада података у листи, претрага листе како би се нашао одговарајући елемент или тражење краја листе. У свим овим проласцима уводимо помоћни показивач tekuci и њему додељујемо вредност на први чвор листе коју уносимо споља, односно вредност адресе која је додељена првом чвору.

void ispis(struct lista *p)
{
   struct lista *tekuci;
   tekuci = p;
   printf("Uneli ste listu\n");
   while (tekuci != NULL)
   {
       printf("%d\t", tekuci -> podatak);
       tekuci = tekuci -> sl_adresa;
   }
}

Након тога проверавамо да ли показивач показује на неки елемент (има вредност различиту од NULL) и врши се обрада податка у том елементу (испис, упоређивање, израчунавање…). По завршетку обраде податка, помоћни показивач tekuci добија вредност показивача на следећи елемент, а читав поступак се понавља све док помоћни показивач tekuci има вредност различиту од NULL, тј. док показује на неки чвор. Када помоћни показивач tekuci добије вредност NULL, то значи да смо дошли до краја листе.

Написати програм за унос n елемената једноструко спрегнуте листе целих бројева и израчунавање и испис збира и средње вредности елемената. Користити претходно дефинисану функцију за унос листе.

Решење:

#include <stdio.h> 
#include <malloc.h> 
typedef struct lista  
{ 
    int podatak; 
    struct lista *sl_adresa; 
} Lista;

Lista *unos(int n); //funkcija za unos liste

int main(void) 
{
    //Unos elemenata liste 
    Lista  *prvi; 
    int n, i; 
    printf("Unesi broj elemenata: ");
    scanf("%d", &n);
    prvi = unos(n); //poziv funkcije za unos liste
    // Pristup elementima liste
    Lista *tekuci;
    tekuci = prvi;
    i = 0;
    int s = 0;
    while (tekuci != NULL)
    {
        s = s + tekuci -> podatak;
        i++;
        tekuci = tekuci -> sl_adresa;
    }
    printf("Zbir elemenata liste je %d\n", s);
    printf("Srednja vrednost elemenata liste je %.2f", (float)s / i);
    return 0;
}

Излаз:

Unesi broj elemenata: 4
Unesi vrednost: 5
Unesi vrednost: 6
Unesi vrednost: 2
Unesi vrednost: 3
Zbir elemenata liste je 16
Srednja vrednost elemenata liste je 4.00

Написати функцију за пребројавање елемената листе.

Решење:

int duzina(Lista *p)
{
    int broj = 0 ;
    while (p != NULL)
    {
        broj++;
        p = p -> sl_adresa;
    }
    return (broj);
}