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