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