Jednosmerný lineárny zoznam

Riešenia


Úloha 10

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

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

-----------------------------------------------------------------------------
void pridaj(TPrvok **z, TPrvok **k)
{
	TPrvok *novy;

	clrscr();
	printf("\nZadaj cislo: ");

	if (*z == NULL) {
		*z = (TPrvok*)malloc(sizeof(TPrvok));
		scanf("%d", &((*z)->cislo));
		(*z)->dalsi = NULL;
		*k = *z;
	}
	else {
		novy = (TPrvok*)malloc(sizeof(TPrvok));
		scanf("%d", &(novy->cislo));
		novy->dalsi = NULL;
		(*k)->dalsi = novy;
		*k = novy;
	}
	while (getchar() != '\n') /* vyprázdnenie buffera */;
}
-----------------------------------------------------------------------------
void uprav(TPrvok **z, TPrvok **k, int max)
{
	TPrvok *pom, *predch;


	/* prvky zo začiatku zoznamu sa odoberajú iným spôsobom ako prvky vo vnútri zoznamu */
	while ((z != NULL) && ((*z)->cislo == max)) {
		pom = *z;
		*z = (*z)->dalsi;
		free((void*)pom);
	}

	if (*z == NULL)  *k = NULL;
	else {
		predch = *z;  /* predch je ukazovateľ na predchodcu odoberaného prvku */
		pom = (*z)->dalsi; /* pom je ukazovateľ na testovaný prvok */
		while (pom != NULL) {
			if (pom->cislo == max) {
				predch->dalsi = pom->dalsi;
				free((void*)pom);
				pom = predch->dalsi;
			}
			else {
				predch = predch->dalsi;
				pom = pom->dalsi;
			}
		}
	}

	/* ak sme odobrali posledný prvok, máme nový koniec zoznamu */
	if (predch->dalsi == NULL)  *k = predch;
}
-----------------------------------------------------------------------------
int najdi_maximum(TPrvok *p)   /* vráti hodnotu maxima */
{
	int m = p->cislo;

	p = p->dalsi;
	while (p != NULL) {
		if (p->cislo > m) m = p->cislo;
		p = p->dalsi;
	}

	return (m);
}
-----------------------------------------------------------------------------
void vypis(TPrvok *p)
{
	while (p != NULL) {
		printf("%d ", p->cislo);
		p = p->dalsi;
	}
}
-----------------------------------------------------------------------------
int main(void)
{
	TPrvok *zac, *kon;
	int c;
	int max;

	zac = kon = NULL;

	clrscr();
	printf("Vytvorenie zoznamu celych cisel\n");

	/* vstup */
	do {
		pridaj(&zac, &kon);
		printf("\nEste? a/n");
		c = getch();
	} while (c != 'n');

	clrscr();
	printf("\Povodny zoznam: ");
	vypis(zac);
	max = najdi_maximum(zac);
	uprav(&zac, &kon, max);  /* úprava zoznamu */

	/* výstup */
	printf("\nUpraveny zoznam: ");
	vypis(zac);

	getch();
	return (0);
}