Jednosmerný lineárny zoznam
Riešenia
Úloha 7
#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: ");
/* pridanie prvého prvku do prázdneho zoznamu */
if (*z == NULL) {
*z = (TPrvok*)malloc(sizeof(TPrvok));
scanf("%d", &((*z)->cislo));
(*z)->dalsi = NULL;
*k = *z;
}
else { /* pridanie ďalších prvkov na koniec zoznamu */
novy = (TPrvok*)malloc(sizeof(TPrvok));
scanf("%d", &(novy->cislo));
novy->dalsi = NULL;
(*k)->dalsi = novy;
*k = novy;
}
while (getchar() != '\n') /* vyprázdnenie buffera */
;
}
--------------------------------------------------------------------------------
void vloz_za(TPrvok *za, TPrvok **novy)
{
*novy = (TPrvok*)malloc(sizeof(TPrvok)); /* vygeneruje sa nový prvok */
(*novy)->cislo = za->cislo; /* skopíruje sa hodnota z predch. prvku */
(*novy)->dalsi = za->dalsi; /* prepojenie */
za->dalsi = *novy;
}
--------------------------------------------------------------------------------
void zdvoj_prvky(TPrvok *p, TPrvok **k)
{
TPrvok *vlozeny;
/* za každý prvok vložíme nový prvok s rovnakou hodnotou */
while (p != NULL) {
vloz_za(p, &vlozeny); /* p je pointer na prvok ZA ktorý sa vkladá */
p = vlozeny->dalsi; /* zdvojujú sa len pôvodné prvky zoznamu,
práve vložený prvok sa "preskočí" */
}
*k = vlozeny;
/* dvojili sme aj posledný prvok pôvodného zoznamu, máme nový koniec */
}
--------------------------------------------------------------------------------
void vypis(TPrvok *p)
{
while (p != NULL) {
printf("%d ", p->cislo);
p = p->dalsi;
}
}
--------------------------------------------------------------------------------
int main(void) /* hlavný program */
{
TPrvok *zac, *kon;
int c;
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);
zdvoj_prvky(zac, &kon);
/* výstup */
printf("\nUpraveny zoznam: ");
vypis(zac);
getch();
return(0);
}
|