Jednosmerný lineárny zoznam

Riešenia


Úloha 7

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

typedef struct prvok {
	int cislo;
	struct prvok *dalsi;
} TPrvok;

-----------------------------------------------------------------------------
void pridaj(TPrvok **z, TPrvok **k)
{
	TPrvok *novy;

	clrscr();
	printf("\nZadaj cislo: ");

	/* pridanie prvého prvku do prázdneho zoznamu */
	if (*z == NULL) {
		*z = (TPrvok*)malloc(sizeof(TPrvok));
		scanf("%d", &((*z)->cislo));
		(*z)->dalsi = NULL;
		*k = *z;
	}
	else {   /* pridanie ďalších prvkov na koniec zoznamu */
		novy = (TPrvok*)malloc(sizeof(TPrvok));
		scanf("%d", &(novy->cislo));
		novy->dalsi = NULL;
		(*k)->dalsi = novy;
		*k = novy;
	}
	while (getchar() != '\n') /* vyprázdnenie buffera */;
}
--------------------------------------------------------------------------------
void vloz_za(TPrvok *za, TPrvok **novy)
{
	*novy = (TPrvok*)malloc(sizeof(TPrvok));  /* vygeneruje sa nový prvok */
	(*novy)->cislo = za->cislo;  /* skopíruje sa hodnota z predch. prvku */
	(*novy)->dalsi = za->dalsi;  /* prepojenie */
	za->dalsi = *novy;
}
--------------------------------------------------------------------------------
void zdvoj_prvky(TPrvok *p, TPrvok **k)
{
	TPrvok *vlozeny;

	/* za každý prvok vložíme nový prvok s rovnakou hodnotou */
	while (p != NULL) {
		vloz_za(p, &vlozeny); /* p je pointer na prvok ZA ktorý sa vkladá */
		p = vlozeny->dalsi; /* zdvojujú sa len pôvodné prvky zoznamu,
			práve vložený prvok sa „preskočí“ */
	}
	*k = vlozeny;
	/* dvojili sme aj posledný prvok pôvodného zoznamu, máme nový koniec */
}
--------------------------------------------------------------------------------
void vypis(TPrvok *p)
{
	while (p != NULL) {
		printf("%d ", p->cislo);
		p = p->dalsi;
	}
}
--------------------------------------------------------------------------------
int main(void)  /* hlavný program */
{
	TPrvok *zac, *kon;
	int c;

	zac = kon = NULL;

	clrscr();
	printf("Vytvorenie zoznamu celych cisel\n");

	/* vstup */
	do {
		pridaj(&zac, &kon);
		printf("\nEste? a/n");
		c = getch();
	} while (c != 'n');

	clrscr();
	printf("\Povodny zoznam: ");
	vypis(zac);
	zdvoj_prvky(zac, &kon);

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

	getch();
	return (0);
}