3. Jednosmerný lineárny zoznam
3.5 Vloženie nového prvku pred označený prvok
Operáciu vloženia nového prvku pred označený prvok
môžeme previesť na predchádzajúci prípad, ak poznáme ukazovateľ na
prvok, ktorý bezprostredne predchádza označenému prvku. Vloženie nového
prvku pred prvý prvok, teda na začiatok zoznamu je špeciálnym prípadom.
void vloz_pred(TPrvok **z, TPrvok *pred, int co)
{
TPrvok *novy, *pom;
novy = (TPrvok*)malloc(sizeof(TPrvok));
novy->hodnota = co;
if (pred == *z){
novy->dalsi = *z;
*z = novy; /* nový začiatok */
}
else {
/* hľadáme predchodcu označeného prvku */
pom = *z;
while (pom->dalsi != pred) pom = pom->dalsi;
/* spojenie nového s prvkom pred ktorý sa zaraďuje */
novy->dalsi = pred;
/* spojenie prvku ktorý novému predchádza s novým */
pom->dalsi = novy;
}
}
|
OBRÁZOK |
Vloženie prvku pred označený prvok týmto spôsobom nie
je vhodné, ak sa jedná o rozsiahly zoznam. V tomto prípade
vkladáme nový prvok tak, že vymeníme hodnoty nového a označeného prvku a nový prvok potom vložíme za označený prvok. Takto pracuje nasledujúca funkcia:
void vloz_pred(TPrvok *pred, int co)
{
TPrvok *novy = (TPrvok*)malloc(sizeof(TPrvok));
char pom;
pom = pred->hodnota; /* výmena */
pred->hodnota = co;
novy->hodnota = pom;
novy->dalsi = pred->dalsi;
pred->dalsi = novy;
}
Precvičme si
Majme
lineárny zoznam celých čísel, ktoré prečítame zo vstupu.
Napíšte program, ktorý v danom lineárnom zozname všetky prvky zdvojí
t.j. za každý prvok vloží jeden nový prvok s rovnakou hodnotou.
Upravený zoznam vypíšte na obrazovku. Napr. zo zoznamu 1, 2, 3, 4 tak vznikne zoznam 1, 1, 2, 2, 3, 3, 4, 4
|
[Riešenie]
|
Vráťme
sa opäť k nášmu pokusnému zoznamu znakov.
Napíšte program, ktorý načíta znaky zo vstupu (zadávanie znakov sa
ukončí symbolom hviezdičky *), uloží ich do lineárneho zoznamu, pred
každé "áčko" (a, A) vloží symbol # a upravený zoznam vypíše na
obrazovku. Napr. pre vstup: aB12Aa3a bude výstup: #aB12#A#a3#a
|
[Riešenie]
|
|