Zásobník
Priehradkové triedenie
Program EXE
/* pripojenie potrebných hlavičkových súborov */
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
/* symbolické konštanty */
#define K 5
#define N 7
typedef struct prvok {
char cifry[K]; /* pole cifier daného čísla */
struct prvok *dalsi;
} TPrvok;
--------------------------------------------------------------------------------------
void vloz(long cislo, TPrvok **v)
{
int j;
/* nový prvok */
TPrvok *pom = (TPrvok*)malloc(sizeof(TPrvok));
/* "rozbitie" čísla na cifry */
for (j = K-1; j >= 0; j--) {
pom->cifry[j] = cislo % 10;
cislo = cislo / 10;
}
pom->dalsi = *v;
*v = pom; /* nový vrch zásobníka */
}
--------------------------------------------------------------------------------------
void presun(TPrvok **p1, TPrvok **p2) /* presun prvku z jedného zásobníka do iného */
{
TPrvok *pom;
pom = *p1;
*p1 = (*p1)->dalsi;
pom->dalsi = *p2;
*p2 = pom;
}
--------------------------------------------------------------------------------------
void vstup(TPrvok **v) /* vytvorenie hlavného zásobníka */
{
long cislo;
int i;
clrscr();
printf("\nZadaj postupne %d najviac %d-cifernych prirodzenych cisel:\n", N, K);
for (i = 1; i <= N; i++) {
printf ("%d. cislo = ", i);
scanf("%ld", &cislo);
vloz(cislo, v); /* vlož prvok do zásobníka */
}
}
--------------------------------------------------------------------------------------
void vypis(TPrvok *p)
{
int i, j;
for (i = 1; i <= N; i++) {
printf("\n%d. cislo : ", i);
for (j = 0; j < K; j++) printf("%d",p->cifry[j]);
p = p->dalsi;
}
}
--------------------------------------------------------------------------------------
void tried(TPrvok **v)
{
TPrvok *priehradka[10]; /* pomocné zásobníky */
int i, j;
/* vytvorenie prázdnych priehradok */
for (i = 0; i < 10; i++) priehradka[i] = NULL;
/* čísla majú K cifier, preto K prechodov */
for(i = K-1; i >= 0; i--) {
/* z hlavného zásobníka do priehradok */
while (*v != NULL) presun(v, &priehradka[(*v)->cifry[i]]);
/* z priehradok spä? do hlavného zásobníka */
for (j = 0; j < 10; j++) {
while (priehradka[j] != NULL) presun(&priehradka[j], v);
}
}
}
--------------------------------------------------------------------------------------
void main(void) /* hlavný program */
{
TPrvok *vrch;
/* vytvorenie prázdneho hlavného zásobníka */
vrch = NULL;
/* načítanie vstupnej číselnej postupnosti */
vstup(&vrch);
clrscr();
printf("\n\nPovodny zasobnik\n" );
vypis(vrch);
tried(&vrch);
/* výstup */
printf("\n\nUtriedeny zasobnik\n" );
vypis(vrch);
getch();
}
|