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ät 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();
}
|