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 */
}
|