Jednosmerný lineárny zoznam
Riešenia
Úloha 11
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
typedef struct prvok {
int hodnota;
struct prvok *dalsi;
} TPrvok;
---------------------------------------------------------------------
TPrvok *vytvor(int n)
{
TPrvok *prvy = (TPrvok*)malloc(sizeof(TPrvok)); /* vytvorenie prvého prvku */
TPrvok *novy, *pom;
int i, x;
printf("prvok = ");
scanf("%d", &(prvy->hodnota));
prvy->dalsi = NULL;
for (i = 2; i <= n; i++) {
printf("prvok = ");
scanf("%d", &x); /* načítanie hodnoty zo vstupu */
pom = prvy; /* pomocou ukazovateľa pom prechádzame zoznamom */
/* nájdeme správne miesto pre nový prvok */
int b = 1;
while ((x > pom->hodnota) && b) {
if (pom->dalsi != NULL) pom = pom->dalsi;
else b = 0;
}
/* po skončení cyklu while pom ukazuje na prvok, pred ktorý treba vloži?
nový prvok resp. ukazuje na posledný prvok, ak je x zatiaľ najvačšia hodnota
*/
novy = (TPrvok*)malloc(sizeof(TPrvok)); /* alokujeme pamä? pre nový prvok */
if ((pom == prvy) && (x < pom->hodnota)){ /* pridanie na začiatok */
novy->hodnota = x;
novy->dalsi = prvy;
prvy = novy;
}
else if (!b) { /* pridanie na koniec */
pom->dalsi = novy;
novy->hodnota = x;
novy->dalsi = NULL;
}
else { /* pridanie do vnútra na správne miesto */
novy->hodnota = pom->hodnota; /* výmena hodnôt */
pom->hodnota = x;
novy->dalsi = pom->dalsi; /* nový vkladáme ZA */
pom->dalsi = novy;
}
}
return(prvy);
}
---------------------------------------------------------------------
void vypis(TPrvok *p)
{
while (p != NULL) {
printf("%d ", p->hodnota);
p = p->dalsi;
}
}
---------------------------------------------------------------------
void main(void) /* hlavný program */
{
TPrvok *zoznam;
int n;
clrscr();
printf("Pocet prvkov zoznamu N = ");
scanf("%d", &n);
if (n>0) {
zoznam = vytvor(n);
printf("\nUsporiadany zoznam: ");
vypis(zoznam);
}
else printf("Zoznam musi obsahovat aspon 1 prvok!");
getch();
}
|