Jednosmerný lineárny zoznam

Riešenia


Úloha 9

/* pripojenie potrebných hlavičkových súborov */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

/* definícia nového typu */
typedef struct student {
    char meno[30];
    int body;
    struct student *dalsi;
} TStudent;

--------------------------------------------------------------------------
int prazdny(TStudent *z) /* vráti "true" ak je zoznam prázdny */
{
  return(z == NULL);
}
--------------------------------------------------------------------------
void pridaj(TStudent **z, TStudent **k)
{
  TStudent *p;

  clrscr();

  if (*z == NULL) {  /* pridanie prvého prvku do prázdneho zoznamu */
    *z =(TStudent *) malloc(sizeof(TStudent));
    printf("meno studenta: ");
    gets((*z)->meno);
    printf("pocet bodov: ");
    scanf("%d" &((*z)->body));
    (*z)->dalsi = NULL;
    *k = *z;
  }
  else {  /* pridanie ďalších prvkov */
    p = (TStudent *)malloc(sizeof(TStudent));
    printf("meno studenta:");
    gets(p->meno);
    printf("pocet bodov: ");
    scanf("%d", &(p->body));
    p->dalsi = NULL;
    (*k)->dalsi = p;
    (*k) = p;
  }  
  while (getchar() != '\n') /* vyprázdnenie buffera */
    ;
}
--------------------------------------------------------------------------
void vypis(TStudent *p)
{
  clrscr();
  printf("VYPIS\n");

  while (p != NULL) { 
     printf("\nmeno:%s", p->meno); 
     printf("\nbody: %d \n",p->body);
     p = p->dalsi;
  }

  getch();
}
--------------------------------------------------------------------------
void zrus(TStudent **z, TStudent **k)    /* zrušenie zoznamu */
{
  TStudent *p;  /* pomocný pointer */

  clrscr();

  while (*z != NULL) {
    p = *z;
    (*z) = (*z)->dalsi;
    free((void*)p);
  }
  *k = *z;    /* ukazovatele k, z nastavíme na NULL */

  printf("\nZoznam je zruseny!");
  getch();
}
--------------------------------------------------------------------------
TStudent *najdi(TStudent *p)  

/* 
   vráti pointer na prvok, ktorý vyhovuje požiadavke
   resp. NULL ak je zoznam prázdny alebo sa taký prvok v zozname nenachádza 
*/

{  
   if (p != NULL) {

     char m[25];

     clrscr();
     printf("Hladaj studenta: ");
     gets(m);

     while ((p !=  NULL)&&(strcmp(p->meno, m))) {
        p = p->dalsi;
     }
   }

   if (p ==  NULL) printf("Nenasiel sa!"); 
   else printf("Hladany student sa nasiel! Ma %d b\n",p->body);

   getch();
   return(p);
}
------------------------------------------------------------------------
void zmena(TStudent *z)
{
   TStudent *ten = najdi(z);   /* nájde prislušný prvok */

   if (ten != NULL) {          /* zmena údajov */    
     printf("\nNove meno: ");
     scanf("%s", ten->meno); 
     printf("Novy pocet bodov: "); 
     scanf("%d",&(ten->body));
   }

   while (getchar() != '\n') 
     ;
}
-------------------------------------------------------------------------
void odstran(TStudent **z, TStudent **k, TStudent *ten)
{
   TStudent *pom;

   if (ten == *z) *z = (*z)->dalsi;
   else {
      pom = *z; /* nájdeme ukazovateľ na predchodcu odstraňovaného prvku */
      while (pom->dalsi != ten) pom = pom->dalsi;
      pom->dalsi = ten->dalsi; /* prepojenie predchodcu s nasledovníkom odoberaného prvku */
      if (ten == *k) *k = pom;
   }

   free((void*)ten);  /* uvoľnenie pamäte - odstránenie prvku */
}
-------------------------------------------------------------------------

int main(void)   /* hlavný program */
{
  TStudent *zac, *kon, *pom;
  int c;

  zac = kon = NULL;

  /* menu */
  do {
    clrscr();
    printf("JEDNOSMERNY LINEARNY ZOZNAM \n\n");
    printf("Pridaj ..................... 1\n");
    printf("Najdi. ..................... 2\n");
    printf("Vypis. ..................... 3\n");
    printf("Zrus........................ 4\n");
    printf("Zmena....................... 5\n");
    printf("Odober...................... 6\n\n");
    printf("Koniec...................... k\n");

    switch (c = getch()) {
      case '1': pridaj(&zac, &kon); break;
      case '2': najdi(zac);  break;
      case '3': vypis(zac); break;
      case '4': zrus(&zac, &kon); break;
      case '5': zmena(zac); break;
      case '6': {
                    TStudent *ten = najdi(zac);
                    if (ten != NULL) {
                      odstran(&zac, &kon, ten);
                      printf("Prvok bol odstraneny !");
                      ten = NULL;
                      getch();
                    }

                } break;
      default: break;
    }

  } while (c != 'k');

  zrus(&zac, &kon);  /* "slušné" zrušenie zoznamu */
  return(0);
}