Jednosmerný lineárny zoznam

Riešenia


Úloha 1

typedef struct prvok {
  int hodnota;
  struct prvok *dalsi;
} TPrvok;


void pridaj(TPrvok **z)
{
   TPrvok *novy = (TPrvok*)malloc(sizeof(TPrvok));

   printf("\nzadaj hodnotu prvku: ");
   scanf("%d",&(novy->hodnota));
   novy->dalsi = *z;  /* prepojenie nového prvku s nasledujúcim */ 
   *z = novy;         /* nový začiatok */
}
Jednosmerný zoznam, v ktorom budú ma prvky opačné poradie, než v akom sú zadané na vstupe, môžeme vytvori takto:
void main(void)
{
  TPrvok *z = NULL;

  for (int i = 1; i <= 20; i++) pridaj(&z);
   ...
}


Úloha 2

typedef struct prvok {
  int hodnota;
  struct prvok *dalsi;
} TPrvok;

TPrvok *vytvor(int n)
{
   TPrvok *prvy, *posl, *novy;

   /* pridanie prvého prvku */
   prvy = (TPrvok*)malloc(sizeof(TPrvok));
   scanf("%d", &(prvy->hodnota)); 
   prvy->dalsi = NULL;
   posl = prvy;

   /* ďalšie prvky pridávame postupne na koniec zoznamu */
   for (int i = 2; i <= n; i++) {
     novy = (TPrvok*)malloc(sizeof(TPrvok));
     scanf("%d", &(novy->hodnota));
     novy->dalsi = NULL;
     posl->dalsi = novy;
     posl = novy;
   }
   return(prvy); /* funkcia vracia pointer na začiatok zoznamu */
}
V hlavnom programe voláme funkciu nasledovným spôsobom:
void main(void)
{
   int n;
   TPrvok *z = NULL;

   scanf("%d", &n);
   z = vytvor(n)
   ...
}
Druhá čas úlohy - pozri riešenie ÚLOHY 1


Úloha 3

Zoznam zrušíme postupne - odstraňovaním prvkov zo začiatku zoznamu:

TPrvok *zrus(TPrvok *z)
{
  TPrvok *pom;

  while (z != NULL) {
    pom = z;           /* zapamätáme si pointer na prvý prvok */
    z = z->dalsi;     /* nový začiatok zoznamu */
    free((void*)pom); /* odstránenie prvku */  
  }
  printf("\nZoznam je zruseny!");
  return(z); /* funkcia vráti NULL - zoznam je prázdny */ 
}


Úloha 4

int kolko(TPrvok *z)
{
  int poc = 0;
  while (z != NULL) {
    if (z->hodnota % 5 == 0) poc++;
    z = z->dalsi;
  }

  return(poc);
}


Úloha 5

int test(TPrvok *z1, TPrvok *z2)
{
   /* kým nie sme na konci aspoň jedného zoznamu  */   
   while ((z1 != NULL) && (z2 != NULL)) { 
      if (z1->hodnota != z2->hodnota) return(0); /* našli sme 2 rôzne prvky */
      z1 = z1->dalsi;
      z2 = z2->dalsi;
   }
   if ((z1 == NULL) && (z2 == NULL)) return(1); /* zoznamy sú rovnaké */
   else return(0); /* zoznamy nemali rovnakú dĺžku */
}