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