Jednosmerný lineárny zoznam

Riešenia


Úloha 8

Úloha sa dá, samozrejme, riešit rôzne. Jednou z možností je aj úprava zoznamu priamo na vstupe. My sme pridanie nového prvku pred označeny prvok vyriešili metódou výmeny hodnôt nového a označeného prvku.


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

typedef struct uzol {
	int znak;
	struct uzol *dalsi;
} TUzol;

--------------------------------------------------------------------------
void vytvor_zoznam(TUzol **z)
{
	TUzol *pom, *k; /* pomocné ukazovatele */
	int c; /* znak zo vstupu */

	printf("zadaj retazec ukonceny *: ");

	*z = k = NULL;
	/* vytvorenie prvého prvku, ak bola zadaná * zoznam zostane prázdny */
	if ((c = getchar()) != '*') {
		*z = (TUzol*)malloc(sizeof(TUzol));
		(*z)->znak = c;
		(*z)->dalsi = NULL;
		k = *z;

		/* pridávanie ďalších prvkov do zoznamu
			zadávanie zo vstupu končí *, ktorá už nepatrí do zoznamu */

		while ((c = getchar()) != '*') {
			pom = (TUzol*)malloc(sizeof(TUzol));
			pom->znak = c;
			pom->dalsi = NULL;
			k->dalsi = pom;
			k = pom;
		}
	}
}
--------------------------------------------------------------------------
void vypis(TUzol *p)
{
	while (p != NULL) {
		printf("%c ", p->znak);
		p = p->dalsi;
	}
}
--------------------------------------------------------------------------
void vloz_pred(TUzol **pred, char co)
{
	char pom;
	TUzol *novy;

	novy = (TUzol*)malloc(sizeof(TUzol));   /* vytvorí sa nový uzol */
	pom = (*pred)->znak; /* výmena hodnôt nového a označeného uzla */
	(*pred)->znak = co;
	novy->znak = pom;

	novy->dalsi = (*pred)->dalsi;  /* vloženie nového ZA označený uzol */
	(*pred)->dalsi = novy;
	*pred = novy; /* naspäť do funkcie uprav „vyvezieme“ ukazovateľ na práve pridaný uzol */
}
--------------------------------------------------------------------------
void uprav(TUzol *z)
{
	TUzol *p, *vlozeny;

	p = z;

	/* prechádzame zoznamom uzol po uzle */
	while (p != NULL) {
		if ((p->znak == 'a') || (p->znak == 'A')) {
			vloz_pred(&p, '#'); /* pred uzol na ktorý ukazuje p vložíme nový s hodnotou '#' */
		}
		p = p->dalsi;
	}
}
--------------------------------------------------------------------------
void main()
{
	TUzol *zac;

	clrscr();
	vytvor_zoznam(&zac);  /* vstup */

	clrscr();
	printf("\nPovodny zoznam: ");
	vypis(zac);

	uprav(zac);   /* úprava zoznamu */

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

	getch();
}