3. Jednosmerný lineárny zoznam

3.6  Odstránenie prvku zo zoznamu

Operáciu odstránenia označeného prvku zo zoznamu môžeme realizovať takto: najskôr nájdeme prvok, ktorý v zozname predchádza označenému prvku a v ňom potom zmeníme hodnotu ukazovateľa dalsi. Označený prvok zrušíme - uvoľníme pamäť, ktorá mu bola pridelená. Zrušenie prvého prvku je špeciálnym prípadom.

void odstran(TPrvok **z, TPrvok *ten)
{
  TPrvok *pom ;
  
  if (*z == ten) *z = *z->dalsi; /* odstránenie prvého */
  else {
    /* nájdenie predchodcu odoberaného prvku */
    pom = *z; 
    while (pom->dalsi != ten) pom = pom->dalsi; 
    
    /* spojenie predchodcu s nasledovníkom odober. prvku */
    pom->dalsi = ten->dalsi;    
  }
  
  /* zrušenie dynamickej premennej - odstránenie prvku */
  free((void*)ten);   
}







OBRÁZOK

  Pri odstraňovaní posledného prvku je potrebné zmeniť aj hodnotu ukazovateľa k. Upravte funkciu tak, aby ošetrovala aj tento prípad !

V konkrétnych aplikáciách lineárnych zoznamov bývajú operácie vloženia alebo odobratia prvku často spojené s vyhľadaním prvku alebo miesta pre jeho vloženie.


Precvičme si

  Doplňte program z predchádzajúcej časti (program umožňujúci vo forme menu pracovať s lineárnym zoznamom) o možnosť odobrať zvolený prvok zo zoznamu. Ak sa taký prvok vyskytuje v zozname viackrát, odstráni sa len jeho prvý výskyt.

[Riešenie]

  V prvkoch jednosmerného lineárneho zoznamu sú uložené celé čísla. Napíšte program, ktorý upraví pôvodný zoznam tak, že z neho vynechá všetky tie prvky, ktorých hodnota sa rovná najväčšiemu číslu v zozname (t.j. odstráni všetky výskyty maxima).

[Riešenie]