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