Jednosmerný lineárny zoznam

Riešenia


Úloha 6


/* 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');
}

-------------------------------------------------------------------------

int main(void)   /* hlavný program */
{
	TStudent *zac, *kon;
	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\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;
			default: break;
		}

	} while (c != 'k');

	zrus(&zac, &kon);  /* „slušné“ zrušenie zoznamu */
	return (0);
}
Ukladanie zoznamu do súboru a naopak načítanie zoznamu zo súboru si čitateľ doplní sám. 🙂