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