Jednosmerný lineárny zoznam

Riešenia


Úloha 8

Úloha sa dá samozrejme riešit rôzne. Jednou z možností je aj úprava zoznamu priamo na vstupe. My sme pridanie nového prvku pred označeny prvok vyriešili metódou výmeny hodnôt nového a označeného prvku.


#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

typedef struct uzol {
    int znak;
    struct uzol *dalsi;
} TUzol;

--------------------------------------------------------------------------
void vytvor_zoznam(TUzol **z)
{
  TUzol *pom, *k; /* pomocné ukazovatele */
  int c; /* znak zo vstupu */

  printf("zadaj retazec ukonceny *: ");

  *z =  k = NULL;
  /* vytvorenie prvého prvku, ak bola zadaná * zoznam zostane prázdny */
  if ((c = getchar()) != '*') {
    *z = (TUzol*)malloc(sizeof(TUzol));
    (*z)->znak = c;
    (*z)->dalsi = NULL;
    k = *z;

   /* pridávanie ďalších prvkov do zoznamu
      zadávanie zo vstupu končí *, ktorá už nepatrí do zoznamu */

   while ((c = getchar()) != '*') {
      pom = (TUzol*)malloc(sizeof(TUzol));
      pom->znak = c;
      pom->dalsi = NULL;
      k->dalsi = pom;
      k = pom;
    }
  }
}
--------------------------------------------------------------------------
void vypis(TUzol *p)
{
   while (p != NULL) {
      printf("%c ", p->znak);
      p = p->dalsi;
   }
}
--------------------------------------------------------------------------
void vloz_pred(TUzol **pred, char co)
{
  char pom;
  TUzol *novy ;

  novy = (TUzol*)malloc(sizeof(TUzol));   /* vytvorí sa nový uzol */
  pom = (*pred)->znak; /* výmena hodnôt nového a  označeného uzla */ 
  (*pred)->znak = co;
  novy->znak = pom;

  novy->dalsi = (*pred)->dalsi;  /* vloženie nového ZA označený uzol */
  (*pred)->dalsi = novy;
  *pred  = novy; /* naspät do funkcie uprav "vyvezieme" ukazovateľ na práve pridaný uzol */
}
--------------------------------------------------------------------------
void uprav(TUzol *z)
{
   TUzol *p, *vlozeny;

   p = z;

   /* prechádzame zoznamom uzol po uzle */
   while (p != NULL) {
     if ((p->znak == 'a') || (p->znak == 'A')) {
       vloz_pred(&p, '#'); /* pred uzol na ktorý ukazuje p vložíme nový s hodnotou '#' */
       }                      
     p = p->dalsi;
   }
}
--------------------------------------------------------------------------
void main()
{
  TUzol *zac;

  clrscr();
  vytvor_zoznam(&zac);  /* vstup */

  clrscr();
  printf("\nPovodny  zoznam: ");
  vypis(zac);

  uprav(zac);   /* úprava zoznamu */

  printf("\nUpraveny zoznam: "); /* výstup */
  vypis(zac);

  getch();
}