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);
}
|