<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jehro77</id>
	<title>Kiwiki - Príspevky používateľa [sk]</title>
	<link rel="self" type="application/atom+xml" href="http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jehro77"/>
	<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php/%C5%A0peci%C3%A1lne:Pr%C3%ADspevky/Jehro77"/>
	<updated>2026-06-16T03:42:28Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Usporiadan%C3%BD_line%C3%A1rny_zoznam_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=3708</id>
		<title>Usporiadaný lineárny zoznam (riešené príklady)</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Usporiadan%C3%BD_line%C3%A1rny_zoznam_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=3708"/>
		<updated>2010-04-11T17:34:34Z</updated>

		<summary type="html">&lt;p&gt;Jehro77: /* Analýza riešenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
[[Kategória:jazyk C]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie (zbierka úloh)}}&lt;br /&gt;
&lt;br /&gt;
==Zadanie==&lt;br /&gt;
Vo vstupnom súbore máme zoznam študentov - v každom riadku sa nachádza meno, priezvisko, známka zo ZI, den, mesiac a rok narodenia. V poslednom riadku je 5 núl.&lt;br /&gt;
&lt;br /&gt;
Zostavte program, ktorý zo súboru načíta všetkých študentov a vytvorí lineárny zreťazený zoznam, ktorého jednotlivé prvky budú obsahovať údaje jedného riadku. Prvky do zoznamu vkladajte tak, aby sa hneď pri vkladaní zotriedili. Triedenie bude podľa nasledujúcich požiadaviek.&lt;br /&gt;
#Zoznam bude utriedený podľa abecedy (od A po Z)&lt;br /&gt;
#Zoznam bude utriedený podľa priezviska&lt;br /&gt;
#ak je priezvisko rovnaké, tak budeme triediť podľa mena&lt;br /&gt;
#ak je meno rovnaké, tak budeme triediť podľa dátumu narodenia&lt;br /&gt;
&lt;br /&gt;
Ďalej v programe budeme chcieť vyhľadať, či sa nejaký študent vyskytuje v zozname. Načítajte hľadaný reťazec a vyhľadajte daného študenta. Na toto vytvorte funkciu ''hladaj'', ktorá bude zoznam prehľadávať a nájde všetky výskyty podľa zadaného kritéria.&lt;br /&gt;
&lt;br /&gt;
==Vzorový príklad==&lt;br /&gt;
'''Vstup'''&lt;br /&gt;
&lt;br /&gt;
Nasledujúce údaje sú načítané zo súboru&lt;br /&gt;
&lt;br /&gt;
 Jan Mrkvicka A 4 6 1985&lt;br /&gt;
 Ferdinand Tell C 4 12 1986&lt;br /&gt;
 Viliam Tell F 1 1 1987&lt;br /&gt;
 johanka Z_arku C 5 4 1238&lt;br /&gt;
 0 0 0 0 0 0&lt;br /&gt;
&lt;br /&gt;
Nasledujúci údaj je načítaný z klávesnice&lt;br /&gt;
&lt;br /&gt;
 Tell&lt;br /&gt;
&lt;br /&gt;
'''Výstup'''&lt;br /&gt;
 Tell Ferdinand,C , 4.12.1986&lt;br /&gt;
 Tell Viliam, F , 1.1.1987 &lt;br /&gt;
&lt;br /&gt;
==Analýza riešenia==&lt;br /&gt;
Budeme pokračovať v predchádzajúcom príklade ([[Neusporiadaný lineárny zoznnam (riešené príklady)]]).&lt;br /&gt;
&lt;br /&gt;
Pri vkladaní údajov si musíme naprogramovať porovnávaciu funkciu, pomocou ktorej budeme porovnávať záznamy (študentov) aby sme ich mohli vkladať na správne miesto. Vo funkcii ''PorovnajS(TStudent a, TStudent b)'' porovnávame dvoch študentov, podľa zadaných kritérií. Funkcia vráti 1 ak je študent a v abecednom poradí na vyššej pozícii ako b, v opačnom prípade vráti hodnotu -1. Ak sú údaje rovnaké vráti 0 .&lt;br /&gt;
&lt;br /&gt;
Pri vkladaní údajov rozoznávame 3 prípady: údaje vkladáme na začiatok zoznamu, na koniec zoznamu, alebo niekde (na správne miesto) do stredu zoznamu. Pri všetkých prípadoch musíme upraviť štrukrúru TZoznam, aby ukazovatele ''prvy'' a ''posledny'' ukazovali na začiatok, resp. na koniec zoznamu. Taktiež treba správne nastaviť ukazovatele ''dalsi'' (štruktúry TPrvok) aby sa zoznam niekde neprerušil.&lt;br /&gt;
&lt;br /&gt;
Pri vyhľadávaní študenta budeme zoznamom postupne prechádzať od prvého prvku až pokiaľ prvok nenájdeme. Pri úspechu vráti funkcia ukazovateľ na prvok, ktorý obsahuje hľadaného študenta:&lt;br /&gt;
''TPrvok* Najdi(TZoznam z, char *hladane,TPrvok *start=NULL,int podla_p=1)''. Parametrami funkcie sú: zoznam, v ktorom budeme hľadať, reťazec ''hladane'' - čo hľadáme. Podľa zadania máme vypísať všetky výskyty hľadaného reťazca. V prípade ak sú v zozname dvaja študenti s rovnakým priezviskom, funkcia nájde iba toho prvého. Aby funkcia pracovala univerzálnejšie, použijeme 3-ti parameter (Ukazovateľ na TPrvok), ktorý má význam: budeme hľadať od prvku ''start''. Posledný argument má význam: ak bude ''podla_p=1'' budeme hľadať priezvisko, ak bude'' podla_p=0'', budeme vyhľadávať podľa mena. Pri ďalšom hľadaní získame prvok ''start'' jednoducho: použijeme posledne nájdený prvok.&lt;br /&gt;
&lt;br /&gt;
Pre výpis prvku môžeme použiť funkciu ''VypisPrvok(TPrvok *p)'', ktorá bude vypisovať obsah prvku p (p obsahuje štrukúru TStudent, ktorá obsahuje položky meno, priezvisko, datum a znamka_ZI) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
//-----------------datove struktury-------------------//&lt;br /&gt;
struct datum&lt;br /&gt;
    {    int d,m,y;&lt;br /&gt;
    };&lt;br /&gt;
struct TStudent&lt;br /&gt;
    {    char meno[32],priezvisko[32];&lt;br /&gt;
        datum datum_narodenia;&lt;br /&gt;
        char znamka_ZI;&lt;br /&gt;
    };&lt;br /&gt;
struct TPrvok&lt;br /&gt;
    {    TStudent student;&lt;br /&gt;
        TPrvok *dalsi;&lt;br /&gt;
    };     &lt;br /&gt;
struct TZoznam&lt;br /&gt;
{&lt;br /&gt;
  TPrvok *prvy, *posledny;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//-------------------funkcie-----------------------------//&lt;br /&gt;
&lt;br /&gt;
int JePrazdny(TZoznam z)&lt;br /&gt;
{&lt;br /&gt;
  return z.prvy == NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VlozNaKoniec(TZoznam &amp;amp;z,TStudent s)&lt;br /&gt;
{&lt;br /&gt;
 TPrvok *novy = new TPrvok;&lt;br /&gt;
  novy-&amp;gt;student = s;&lt;br /&gt;
  novy-&amp;gt;dalsi = NULL;&lt;br /&gt;
&lt;br /&gt;
  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
    z.prvy = novy;&lt;br /&gt;
  else&lt;br /&gt;
    z.posledny-&amp;gt;dalsi = novy;&lt;br /&gt;
  z.posledny = novy;&lt;br /&gt;
}&lt;br /&gt;
// nova funkcia !!!&lt;br /&gt;
int PorovnajS(TStudent a, TStudent b)&lt;br /&gt;
{  // podla priezviska, mena, datumu&lt;br /&gt;
 int porovanie;&lt;br /&gt;
 porovanie=strcmp(strlwr(a.priezvisko),strlwr(b.priezvisko));&lt;br /&gt;
 if(porovanie!=0) return porovanie;&lt;br /&gt;
 porovanie=strcmp(strlwr(a.meno),strlwr(b.meno));&lt;br /&gt;
 if(porovanie!=0) return porovanie;&lt;br /&gt;
 long da,db;&lt;br /&gt;
 da=a.datum_narodenia.d+a.datum_narodenia.m*100+a.datum_narodenia.y*10000;&lt;br /&gt;
 db=b.datum_narodenia.d+b.datum_narodenia.m*100+b.datum_narodenia.y*10000;&lt;br /&gt;
 if(da&amp;gt;db) return 1;&lt;br /&gt;
 if(da&amp;lt;db) return -1;&lt;br /&gt;
 return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// nova funkcia !!!&lt;br /&gt;
void Vloz(TZoznam &amp;amp;z, TStudent x)  // vlozi prvok zotriedene&lt;br /&gt;
{&lt;br /&gt;
  TPrvok *novy = new TPrvok;&lt;br /&gt;
  novy-&amp;gt;student=x;&lt;br /&gt;
  novy-&amp;gt;dalsi = NULL;&lt;br /&gt;
  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
    z.prvy = z.posledny = novy;&lt;br /&gt;
  else     &lt;br /&gt;
      if ( PorovnajS(x,z.prvy-&amp;gt;student)==-1 )  // x &amp;lt; z.prvy-&amp;gt;x / treba na zaciatok zoznamu&lt;br /&gt;
      {&lt;br /&gt;
        novy-&amp;gt;dalsi = z.prvy;&lt;br /&gt;
        z.prvy = novy;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
          if (PorovnajS(x,z.posledny-&amp;gt;student)==1 )  // x &amp;gt; z.posledny-&amp;gt;x / treba na koniec zoznamu&lt;br /&gt;
          {&lt;br /&gt;
            z.posledny-&amp;gt;dalsi = novy;&lt;br /&gt;
            z.posledny = novy;&lt;br /&gt;
          }&lt;br /&gt;
          else&lt;br /&gt;
          {&lt;br /&gt;
                TPrvok *p1 = z.prvy, *p2 = z.prvy-&amp;gt;dalsi;&lt;br /&gt;
                while (PorovnajS(p2-&amp;gt;student,x)==-1)  //p2-&amp;gt;x &amp;lt; x&lt;br /&gt;
                {&lt;br /&gt;
                  p1 = p2; p2 = p2-&amp;gt;dalsi;&lt;br /&gt;
                }&lt;br /&gt;
                p1-&amp;gt;dalsi = novy;&lt;br /&gt;
                novy-&amp;gt;dalsi = p2;&lt;br /&gt;
          }&lt;br /&gt;
}&lt;br /&gt;
// nova funkcia !!!&lt;br /&gt;
TPrvok* Najdi(TZoznam z, char *hladane,TPrvok *start=NULL,int podla_p=1)&lt;br /&gt;
{ // ak je posledny parameter uvedeny, bude sa hladat od toho prvku dalej&lt;br /&gt;
  // inak sa hlada od zaciatku&lt;br /&gt;
&lt;br /&gt;
  TPrvok *p;&lt;br /&gt;
  if(start==NULL)&lt;br /&gt;
    p = z.prvy;&lt;br /&gt;
  else&lt;br /&gt;
    p=start-&amp;gt;dalsi;&lt;br /&gt;
  char hladane_pr[32];&lt;br /&gt;
&lt;br /&gt;
  while (p != NULL)&lt;br /&gt;
  { if(podla_p)&lt;br /&gt;
       strcpy(hladane_pr,p-&amp;gt;student.priezvisko);  // aby som si nezmenil povodne priezvisko&lt;br /&gt;
    else&lt;br /&gt;
       strcpy(hladane_pr,p-&amp;gt;student.meno);  // aby som si nezmenil povodne priezvisko&lt;br /&gt;
    if (strcmp(strlwr(hladane_pr),strlwr(hladane))==0) return p;&lt;br /&gt;
    p = p-&amp;gt;dalsi;&lt;br /&gt;
  }&lt;br /&gt;
  return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VypisPrvok(TPrvok *p)&lt;br /&gt;
{&lt;br /&gt;
    cout &amp;lt;&amp;lt; p-&amp;gt;student.priezvisko &amp;lt;&amp;lt;&amp;quot; &amp;quot;&amp;lt;&amp;lt;p-&amp;gt;student.meno&amp;lt;&amp;lt;&amp;quot; (&amp;quot;&amp;lt;&amp;lt;p-&amp;gt;student.znamka_ZI&amp;lt;&amp;lt;&amp;quot;) &amp;quot;;&lt;br /&gt;
    cout&amp;lt;&amp;lt;p-&amp;gt;student.datum_narodenia.d&amp;lt;&amp;lt;&amp;quot;. &amp;quot;&amp;lt;&amp;lt;p-&amp;gt;student.datum_narodenia.m&amp;lt;&amp;lt;&amp;quot;. &amp;quot;;&lt;br /&gt;
    cout&amp;lt;&amp;lt;p-&amp;gt;student.datum_narodenia.y&amp;lt;&amp;lt;endl;    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Vypis(TZoznam z)&lt;br /&gt;
{&lt;br /&gt;
  if (JePrazdny(z)) return;&lt;br /&gt;
  TPrvok *p = z.prvy;&lt;br /&gt;
  while (p-&amp;gt;dalsi != NULL)&lt;br /&gt;
  {&lt;br /&gt;
    VypisPrvok(p);&lt;br /&gt;
    p = p-&amp;gt;dalsi;&lt;br /&gt;
  }&lt;br /&gt;
  VypisPrvok(p);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ZmazPosledny(TZoznam &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  TPrvok *p = z.prvy;&lt;br /&gt;
  if (p-&amp;gt;dalsi == NULL)  // je len jeden prvok&lt;br /&gt;
  {&lt;br /&gt;
    delete p;&lt;br /&gt;
    z.prvy = z.posledny = NULL;&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // najdeme predposledny prvok&lt;br /&gt;
  while (p-&amp;gt;dalsi-&amp;gt;dalsi != NULL)&lt;br /&gt;
    p = p-&amp;gt;dalsi;&lt;br /&gt;
  delete p-&amp;gt;dalsi;&lt;br /&gt;
  p-&amp;gt;dalsi = NULL;&lt;br /&gt;
  z.posledny = p;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Zmaz(TZoznam &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
  while (!JePrazdny(z))&lt;br /&gt;
    ZmazPosledny(z);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Nacitaj(TStudent &amp;amp;s,istream &amp;amp;vstup)&lt;br /&gt;
{&lt;br /&gt;
 vstup&amp;gt;&amp;gt;s.meno&amp;gt;&amp;gt;s.priezvisko&amp;gt;&amp;gt;s.znamka_ZI;    &lt;br /&gt;
 vstup&amp;gt;&amp;gt;s.datum_narodenia.d&amp;gt;&amp;gt;s.datum_narodenia.m&amp;gt;&amp;gt;s.datum_narodenia.y;&lt;br /&gt;
}&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  TZoznam zoznam;&lt;br /&gt;
  zoznam.prvy = zoznam.posledny = NULL;&lt;br /&gt;
  TStudent s;&lt;br /&gt;
  int n=0;&lt;br /&gt;
&lt;br /&gt;
  ifstream vstup;&lt;br /&gt;
  vstup.open(&amp;quot;prvaci.txt&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  Nacitaj(s,vstup);&lt;br /&gt;
  Vloz(zoznam,s);&lt;br /&gt;
  while(s.datum_narodenia.d)&lt;br /&gt;
  {&lt;br /&gt;
          Nacitaj(s,vstup);&lt;br /&gt;
          if(s.datum_narodenia.d)&lt;br /&gt;
             Vloz(zoznam,s);&lt;br /&gt;
          n++;&lt;br /&gt;
  }&lt;br /&gt;
  vstup.close();&lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;--------vypis zoznamu--------------&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;Pocet studentov: &amp;quot;&amp;lt;&amp;lt;n&amp;lt;&amp;lt;endl;;&lt;br /&gt;
  //  Vypis(zoznam);&lt;br /&gt;
  int kriterium;&lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;Podla coho chces vyhladavat? meno(0)/priezvisko(1)&amp;quot;;&lt;br /&gt;
  cin&amp;gt;&amp;gt;kriterium;&lt;br /&gt;
  cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Zadaj retazec, ktory chces vyhladat: &amp;quot;;&lt;br /&gt;
  char przv[32];&lt;br /&gt;
  cin&amp;gt;&amp;gt;przv;&lt;br /&gt;
 &lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;-----------------------------&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
  TPrvok *ja=Najdi(zoznam,przv,NULL,kriterium);  // hladame prvy vyskyt&lt;br /&gt;
  int pocet=0;&lt;br /&gt;
  while(ja)&lt;br /&gt;
  {   pocet++;&lt;br /&gt;
      if(ja)&lt;br /&gt;
            VypisPrvok(ja);&lt;br /&gt;
      ja=Najdi(zoznam,przv,ja,kriterium);  // hladame dalsie vyskyty od podledneho najdeneho studenta&lt;br /&gt;
  }&lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;-----------------------------&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;Pocet najdenych studentov: &amp;quot;&amp;lt;&amp;lt;pocet&amp;lt;&amp;lt;endl;&lt;br /&gt;
  Zmaz(zoznam);&lt;br /&gt;
  system(&amp;quot;pause&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jehro77</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Usporiadan%C3%BD_line%C3%A1rny_zoznam_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=3707</id>
		<title>Usporiadaný lineárny zoznam (riešené príklady)</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Usporiadan%C3%BD_line%C3%A1rny_zoznam_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=3707"/>
		<updated>2010-04-11T17:34:07Z</updated>

		<summary type="html">&lt;p&gt;Jehro77: /* Analýza riešenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
[[Kategória:jazyk C]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie (zbierka úloh)}}&lt;br /&gt;
&lt;br /&gt;
==Zadanie==&lt;br /&gt;
Vo vstupnom súbore máme zoznam študentov - v každom riadku sa nachádza meno, priezvisko, známka zo ZI, den, mesiac a rok narodenia. V poslednom riadku je 5 núl.&lt;br /&gt;
&lt;br /&gt;
Zostavte program, ktorý zo súboru načíta všetkých študentov a vytvorí lineárny zreťazený zoznam, ktorého jednotlivé prvky budú obsahovať údaje jedného riadku. Prvky do zoznamu vkladajte tak, aby sa hneď pri vkladaní zotriedili. Triedenie bude podľa nasledujúcich požiadaviek.&lt;br /&gt;
#Zoznam bude utriedený podľa abecedy (od A po Z)&lt;br /&gt;
#Zoznam bude utriedený podľa priezviska&lt;br /&gt;
#ak je priezvisko rovnaké, tak budeme triediť podľa mena&lt;br /&gt;
#ak je meno rovnaké, tak budeme triediť podľa dátumu narodenia&lt;br /&gt;
&lt;br /&gt;
Ďalej v programe budeme chcieť vyhľadať, či sa nejaký študent vyskytuje v zozname. Načítajte hľadaný reťazec a vyhľadajte daného študenta. Na toto vytvorte funkciu ''hladaj'', ktorá bude zoznam prehľadávať a nájde všetky výskyty podľa zadaného kritéria.&lt;br /&gt;
&lt;br /&gt;
==Vzorový príklad==&lt;br /&gt;
'''Vstup'''&lt;br /&gt;
&lt;br /&gt;
Nasledujúce údaje sú načítané zo súboru&lt;br /&gt;
&lt;br /&gt;
 Jan Mrkvicka A 4 6 1985&lt;br /&gt;
 Ferdinand Tell C 4 12 1986&lt;br /&gt;
 Viliam Tell F 1 1 1987&lt;br /&gt;
 johanka Z_arku C 5 4 1238&lt;br /&gt;
 0 0 0 0 0 0&lt;br /&gt;
&lt;br /&gt;
Nasledujúci údaj je načítaný z klávesnice&lt;br /&gt;
&lt;br /&gt;
 Tell&lt;br /&gt;
&lt;br /&gt;
'''Výstup'''&lt;br /&gt;
 Tell Ferdinand,C , 4.12.1986&lt;br /&gt;
 Tell Viliam, F , 1.1.1987 &lt;br /&gt;
&lt;br /&gt;
==Analýza riešenia==&lt;br /&gt;
Budeme pokračovať v predchádzajúcom príklade ([[Neusporiadaný lineárny zoznnam (riešené príklady)]]).&lt;br /&gt;
&lt;br /&gt;
Pri vkladaní údajov si musíme naprogramovať porovnávaciu funkciu, pomocou ktorej budeme porovnávať záznamy (študentov) aby sme ich mohli vkladať na správne miesto. Vo funkcii ''PorovnajS(TStudent a, TStudent b)'' porovnávame dvoch študentov, podľa zadaných kritérií. Funkcia vráti 1 ak je študent a v abecednom poradí na vyššej pozícii ako b, v opačnom prípade vráti hodnotu -1. Ak sú údaje rovnaké vráti 0 .&lt;br /&gt;
&lt;br /&gt;
Pri vkladaní údajov rozoznávame 3 prípady: údaje vkladáme na začiatok zoznamu, na koniec zoznamu, alebo niekde (na správne miesto) do stredu zoznamu. Pri všetkých prípadoch musíme upraviť štrukrúru TZoznam, aby ukazovatele ''prvy'' a ''posledny'' ukazovali na začiatok, resp. na koniec zoznamu. Taktiež treba správne nastaviť ukazovatele ''dalsi'' (štruktúry TPrvok) aby sa zoznam niekde neprerušil.&lt;br /&gt;
&lt;br /&gt;
Pri vyhľadávaní študenta budeme zoznamom postupne prechádzať od prvého prvku až pokiaľ prvok nenájdeme. Pri úspechu vráti funkcia ukazovateľ na prvok, ktorý obsahuje hľadaného študenta:&lt;br /&gt;
''TPrvok* Najdi(TZoznam z, char *hladane,TPrvok *start=NULL,int podla_p=1)''. Parametrami funkcie sú: zoznam, v ktorom budeme hľadať, reťazec ''hladane'' - čo hľadáme. Podľa zadania máme vypísať všetky výskyty hľadaného reťazca. V prípade ak sú v zozname dvaja študenti s rovnakým priezviskom, funkcia nájde iba toho prvého. Aby funkcia pracovala univerzálnejšie, použijeme 3-ti parameter (Ukazovateľ na TPrvok), ktorý má význam: budeme hľadať od prvku ''start''. Posledný argument má význam: ak bude ''podla_p=1'' budeme hľadať priezvisko, ak bude'' podla_p=0'', budeme vyhľadávať podľa mena. Pri ďalšom hľadaní získame prvok ''start'' jednoducho: použijeme posledne nájdený prvok.&lt;br /&gt;
&lt;br /&gt;
Pre výpis prvku môžeme použiť funkciu ''VypisPrvok(TPrvok *p)'', ktorá bude vypisovať obsah prvku p (p obsahuje štrukúru TStudent, ktorá obsahuje položky meno, priezvisko, dátum a znamka_ZI) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
//-----------------datove struktury-------------------//&lt;br /&gt;
struct datum&lt;br /&gt;
    {    int d,m,y;&lt;br /&gt;
    };&lt;br /&gt;
struct TStudent&lt;br /&gt;
    {    char meno[32],priezvisko[32];&lt;br /&gt;
        datum datum_narodenia;&lt;br /&gt;
        char znamka_ZI;&lt;br /&gt;
    };&lt;br /&gt;
struct TPrvok&lt;br /&gt;
    {    TStudent student;&lt;br /&gt;
        TPrvok *dalsi;&lt;br /&gt;
    };     &lt;br /&gt;
struct TZoznam&lt;br /&gt;
{&lt;br /&gt;
  TPrvok *prvy, *posledny;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//-------------------funkcie-----------------------------//&lt;br /&gt;
&lt;br /&gt;
int JePrazdny(TZoznam z)&lt;br /&gt;
{&lt;br /&gt;
  return z.prvy == NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VlozNaKoniec(TZoznam &amp;amp;z,TStudent s)&lt;br /&gt;
{&lt;br /&gt;
 TPrvok *novy = new TPrvok;&lt;br /&gt;
  novy-&amp;gt;student = s;&lt;br /&gt;
  novy-&amp;gt;dalsi = NULL;&lt;br /&gt;
&lt;br /&gt;
  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
    z.prvy = novy;&lt;br /&gt;
  else&lt;br /&gt;
    z.posledny-&amp;gt;dalsi = novy;&lt;br /&gt;
  z.posledny = novy;&lt;br /&gt;
}&lt;br /&gt;
// nova funkcia !!!&lt;br /&gt;
int PorovnajS(TStudent a, TStudent b)&lt;br /&gt;
{  // podla priezviska, mena, datumu&lt;br /&gt;
 int porovanie;&lt;br /&gt;
 porovanie=strcmp(strlwr(a.priezvisko),strlwr(b.priezvisko));&lt;br /&gt;
 if(porovanie!=0) return porovanie;&lt;br /&gt;
 porovanie=strcmp(strlwr(a.meno),strlwr(b.meno));&lt;br /&gt;
 if(porovanie!=0) return porovanie;&lt;br /&gt;
 long da,db;&lt;br /&gt;
 da=a.datum_narodenia.d+a.datum_narodenia.m*100+a.datum_narodenia.y*10000;&lt;br /&gt;
 db=b.datum_narodenia.d+b.datum_narodenia.m*100+b.datum_narodenia.y*10000;&lt;br /&gt;
 if(da&amp;gt;db) return 1;&lt;br /&gt;
 if(da&amp;lt;db) return -1;&lt;br /&gt;
 return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// nova funkcia !!!&lt;br /&gt;
void Vloz(TZoznam &amp;amp;z, TStudent x)  // vlozi prvok zotriedene&lt;br /&gt;
{&lt;br /&gt;
  TPrvok *novy = new TPrvok;&lt;br /&gt;
  novy-&amp;gt;student=x;&lt;br /&gt;
  novy-&amp;gt;dalsi = NULL;&lt;br /&gt;
  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
    z.prvy = z.posledny = novy;&lt;br /&gt;
  else     &lt;br /&gt;
      if ( PorovnajS(x,z.prvy-&amp;gt;student)==-1 )  // x &amp;lt; z.prvy-&amp;gt;x / treba na zaciatok zoznamu&lt;br /&gt;
      {&lt;br /&gt;
        novy-&amp;gt;dalsi = z.prvy;&lt;br /&gt;
        z.prvy = novy;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
          if (PorovnajS(x,z.posledny-&amp;gt;student)==1 )  // x &amp;gt; z.posledny-&amp;gt;x / treba na koniec zoznamu&lt;br /&gt;
          {&lt;br /&gt;
            z.posledny-&amp;gt;dalsi = novy;&lt;br /&gt;
            z.posledny = novy;&lt;br /&gt;
          }&lt;br /&gt;
          else&lt;br /&gt;
          {&lt;br /&gt;
                TPrvok *p1 = z.prvy, *p2 = z.prvy-&amp;gt;dalsi;&lt;br /&gt;
                while (PorovnajS(p2-&amp;gt;student,x)==-1)  //p2-&amp;gt;x &amp;lt; x&lt;br /&gt;
                {&lt;br /&gt;
                  p1 = p2; p2 = p2-&amp;gt;dalsi;&lt;br /&gt;
                }&lt;br /&gt;
                p1-&amp;gt;dalsi = novy;&lt;br /&gt;
                novy-&amp;gt;dalsi = p2;&lt;br /&gt;
          }&lt;br /&gt;
}&lt;br /&gt;
// nova funkcia !!!&lt;br /&gt;
TPrvok* Najdi(TZoznam z, char *hladane,TPrvok *start=NULL,int podla_p=1)&lt;br /&gt;
{ // ak je posledny parameter uvedeny, bude sa hladat od toho prvku dalej&lt;br /&gt;
  // inak sa hlada od zaciatku&lt;br /&gt;
&lt;br /&gt;
  TPrvok *p;&lt;br /&gt;
  if(start==NULL)&lt;br /&gt;
    p = z.prvy;&lt;br /&gt;
  else&lt;br /&gt;
    p=start-&amp;gt;dalsi;&lt;br /&gt;
  char hladane_pr[32];&lt;br /&gt;
&lt;br /&gt;
  while (p != NULL)&lt;br /&gt;
  { if(podla_p)&lt;br /&gt;
       strcpy(hladane_pr,p-&amp;gt;student.priezvisko);  // aby som si nezmenil povodne priezvisko&lt;br /&gt;
    else&lt;br /&gt;
       strcpy(hladane_pr,p-&amp;gt;student.meno);  // aby som si nezmenil povodne priezvisko&lt;br /&gt;
    if (strcmp(strlwr(hladane_pr),strlwr(hladane))==0) return p;&lt;br /&gt;
    p = p-&amp;gt;dalsi;&lt;br /&gt;
  }&lt;br /&gt;
  return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VypisPrvok(TPrvok *p)&lt;br /&gt;
{&lt;br /&gt;
    cout &amp;lt;&amp;lt; p-&amp;gt;student.priezvisko &amp;lt;&amp;lt;&amp;quot; &amp;quot;&amp;lt;&amp;lt;p-&amp;gt;student.meno&amp;lt;&amp;lt;&amp;quot; (&amp;quot;&amp;lt;&amp;lt;p-&amp;gt;student.znamka_ZI&amp;lt;&amp;lt;&amp;quot;) &amp;quot;;&lt;br /&gt;
    cout&amp;lt;&amp;lt;p-&amp;gt;student.datum_narodenia.d&amp;lt;&amp;lt;&amp;quot;. &amp;quot;&amp;lt;&amp;lt;p-&amp;gt;student.datum_narodenia.m&amp;lt;&amp;lt;&amp;quot;. &amp;quot;;&lt;br /&gt;
    cout&amp;lt;&amp;lt;p-&amp;gt;student.datum_narodenia.y&amp;lt;&amp;lt;endl;    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Vypis(TZoznam z)&lt;br /&gt;
{&lt;br /&gt;
  if (JePrazdny(z)) return;&lt;br /&gt;
  TPrvok *p = z.prvy;&lt;br /&gt;
  while (p-&amp;gt;dalsi != NULL)&lt;br /&gt;
  {&lt;br /&gt;
    VypisPrvok(p);&lt;br /&gt;
    p = p-&amp;gt;dalsi;&lt;br /&gt;
  }&lt;br /&gt;
  VypisPrvok(p);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void ZmazPosledny(TZoznam &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
    return;&lt;br /&gt;
&lt;br /&gt;
  TPrvok *p = z.prvy;&lt;br /&gt;
  if (p-&amp;gt;dalsi == NULL)  // je len jeden prvok&lt;br /&gt;
  {&lt;br /&gt;
    delete p;&lt;br /&gt;
    z.prvy = z.posledny = NULL;&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // najdeme predposledny prvok&lt;br /&gt;
  while (p-&amp;gt;dalsi-&amp;gt;dalsi != NULL)&lt;br /&gt;
    p = p-&amp;gt;dalsi;&lt;br /&gt;
  delete p-&amp;gt;dalsi;&lt;br /&gt;
  p-&amp;gt;dalsi = NULL;&lt;br /&gt;
  z.posledny = p;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Zmaz(TZoznam &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
  while (!JePrazdny(z))&lt;br /&gt;
    ZmazPosledny(z);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Nacitaj(TStudent &amp;amp;s,istream &amp;amp;vstup)&lt;br /&gt;
{&lt;br /&gt;
 vstup&amp;gt;&amp;gt;s.meno&amp;gt;&amp;gt;s.priezvisko&amp;gt;&amp;gt;s.znamka_ZI;    &lt;br /&gt;
 vstup&amp;gt;&amp;gt;s.datum_narodenia.d&amp;gt;&amp;gt;s.datum_narodenia.m&amp;gt;&amp;gt;s.datum_narodenia.y;&lt;br /&gt;
}&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  TZoznam zoznam;&lt;br /&gt;
  zoznam.prvy = zoznam.posledny = NULL;&lt;br /&gt;
  TStudent s;&lt;br /&gt;
  int n=0;&lt;br /&gt;
&lt;br /&gt;
  ifstream vstup;&lt;br /&gt;
  vstup.open(&amp;quot;prvaci.txt&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  Nacitaj(s,vstup);&lt;br /&gt;
  Vloz(zoznam,s);&lt;br /&gt;
  while(s.datum_narodenia.d)&lt;br /&gt;
  {&lt;br /&gt;
          Nacitaj(s,vstup);&lt;br /&gt;
          if(s.datum_narodenia.d)&lt;br /&gt;
             Vloz(zoznam,s);&lt;br /&gt;
          n++;&lt;br /&gt;
  }&lt;br /&gt;
  vstup.close();&lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;--------vypis zoznamu--------------&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;Pocet studentov: &amp;quot;&amp;lt;&amp;lt;n&amp;lt;&amp;lt;endl;;&lt;br /&gt;
  //  Vypis(zoznam);&lt;br /&gt;
  int kriterium;&lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;Podla coho chces vyhladavat? meno(0)/priezvisko(1)&amp;quot;;&lt;br /&gt;
  cin&amp;gt;&amp;gt;kriterium;&lt;br /&gt;
  cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Zadaj retazec, ktory chces vyhladat: &amp;quot;;&lt;br /&gt;
  char przv[32];&lt;br /&gt;
  cin&amp;gt;&amp;gt;przv;&lt;br /&gt;
 &lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;-----------------------------&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
  TPrvok *ja=Najdi(zoznam,przv,NULL,kriterium);  // hladame prvy vyskyt&lt;br /&gt;
  int pocet=0;&lt;br /&gt;
  while(ja)&lt;br /&gt;
  {   pocet++;&lt;br /&gt;
      if(ja)&lt;br /&gt;
            VypisPrvok(ja);&lt;br /&gt;
      ja=Najdi(zoznam,przv,ja,kriterium);  // hladame dalsie vyskyty od podledneho najdeneho studenta&lt;br /&gt;
  }&lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;-----------------------------&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
  cout&amp;lt;&amp;lt;&amp;quot;Pocet najdenych studentov: &amp;quot;&amp;lt;&amp;lt;pocet&amp;lt;&amp;lt;endl;&lt;br /&gt;
  Zmaz(zoznam);&lt;br /&gt;
  system(&amp;quot;pause&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jehro77</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Line%C3%A1rny_zoznam&amp;diff=2967</id>
		<title>Lineárny zoznam</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Line%C3%A1rny_zoznam&amp;diff=2967"/>
		<updated>2010-03-27T11:26:51Z</updated>

		<summary type="html">&lt;p&gt;Jehro77: /* Vkladanie nového prvku do usporiadaného zoznamu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Cvicenie|Lineárny zoznam (riešené príklady)}}&lt;br /&gt;
'''Lineárny zoznam''' &amp;lt;ref&amp;gt;Lineární seznam - http://cs.wikipedia.org/wiki/Line%C3%A1rn%C3%AD_seznam&amp;lt;/ref&amp;gt;(lineárny spojový zoznam) je dynamická dátová štruktúra, navonok podobná poľu (umožňuje uložiť viacero hodnôt, ale iným spôsobom), obsahujúca jednu alebo viacero dátových položiek (štruktúr) rovnakého typu, ktoré sú navzájom lineárne previazané vzájomnými odkazmi pomocou smerníkov alebo referencií. Aby bol zoznam lineárny, nesmú v ňom existovať cykly so vzájomnými odkazmi.&lt;br /&gt;
&lt;br /&gt;
Lineárny zoznam poznáme jednosmerný a obojsmerný. V jednosmernom zozname odkazuje každá položka na nasledujúcu položku a v obojsmernom zozname odkazuje aktuálna položka na nasledujúcu ale aj predchádzajúcu položku. Definuje sa tu smerník alebo odkaz na určitý prvok zoznamu. Na konci (a začiatku) musí byť definovaná zarážka, ktorá označuje koniec zoznamu. Ak vytvoríme taký cyklus, že posledný prvok zoznamu odkazuje na prvý prvok zoznamu, dostaneme kruhový zoznam.&lt;br /&gt;
&amp;lt;gallery widths=250px&amp;gt;&lt;br /&gt;
Súbor:ll1.svg|Jednosmerný lineárny zoznam.Každý prvok zoznamu okrem svojej hodnoty obsahuje i odkaz na nasledujúci prvok v seznamu. Posledný prvok odkazuje „nikam“.&lt;br /&gt;
Súbor:ll2.svg|Jednosmerný kruhový zoznam. Posledný prvok zoznamu odkazuje opäť na začiatok.&lt;br /&gt;
Súbor:ll3.svg|Obojsmerný lineárny zoznam. Každý prvok zoznamu obsahuje, okrem svojej hodnoty, odkaz na nasledujúci i predchádzajúci prvok zoznamu&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V nasledujúcom texte bude opisovaný '''jednosmerný lineárny zoznam'''.&lt;br /&gt;
==Vlastnosti lineárneho zoznamu==&lt;br /&gt;
*Jednosmerný lineárny zoznam je pamäťovo nenáročná dátová štruktúra&lt;br /&gt;
*Dovoľuje zoskupiť ľubovoľný počet prvkov. Počet prvkov je obmedzený len dostupnou pamäťovou kapacitou počítača.&lt;br /&gt;
*Dokáže jednoducho meniť svoju veľkosť počas behu programu.&lt;br /&gt;
*Prvky zoznamu, na rozdiel od polí neležia vedľa seba, ale v pamäti sú alokované podľa toho, kde je dostatok miesta.&lt;br /&gt;
Nasledujúci obrázok znázorňuje spôsob uloženia prvkov v pamäti pri použití poľa a lineárneho zoznamu.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz1.png|framed|center|Rozdiel medzi vnútornou štruktúrou poľa a lineárneho zoznamu]]&lt;br /&gt;
&lt;br /&gt;
==Štruktúra lineárneho zozamu==&lt;br /&gt;
Lineárny zoznam sa skladá z určitých prvkov (alebo uzlov), ktoré sú navzájom previazané vzájomnými odkazmi. Inak povedané stavebný prvok lineárneho zoznamuje samotnú hodnotu prvku (číslo, reťazec, štruktúra, ...) a odkaz na ďalší prvok. Ešte pripomeňme, že všetky prvky lineárneho zoznamu sú rovnakého typu.&lt;br /&gt;
&lt;br /&gt;
Definujme štruktúru '''TPrvok''' (záznam pracovnej povahy), ktorý bude obsahovať:&lt;br /&gt;
*dátovú časť (ľubovolná položka, v našom prípade celé číslo) &lt;br /&gt;
*ukazovateľ na na ďalší záznam typu TPrvok&lt;br /&gt;
&lt;br /&gt;
Definícia v jazyku C:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct TPrvok &lt;br /&gt;
   {	&lt;br /&gt;
      int data;	&lt;br /&gt;
      TPrvok *dalsi; &lt;br /&gt;
   };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vysvetlenie:&lt;br /&gt;
Štruktúra TPrvok obsahuje dátovú časť označenú ako '''data'''. Odkaz na ďalší prvok je označený ako '''dalsi''', a je to smetník na štruktúru TPrvok.&lt;br /&gt;
&lt;br /&gt;
V nasledujúcom príklade budú ukážky definície prvkov lineárneho zoznamu, ktorý namiesto hodnoty celého čísla obsahuje inú dátovú časť.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct TPrvok &lt;br /&gt;
   {	&lt;br /&gt;
      char retazec[64];	&lt;br /&gt;
      TPrvok *dalsi; &lt;br /&gt;
   };&lt;br /&gt;
//------------------------------------&lt;br /&gt;
struct TPrvok &lt;br /&gt;
   {	&lt;br /&gt;
      TZlomok data;	&lt;br /&gt;
      TPrvok *dalsi; &lt;br /&gt;
   };&lt;br /&gt;
//------------------------------------&lt;br /&gt;
struct TPrvok &lt;br /&gt;
   {	&lt;br /&gt;
      double data[10];	&lt;br /&gt;
      TPrvok *dalsi; &lt;br /&gt;
   };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* riadok 1: prvok lineárneho zoznamu je reťazec o dĺžke 63 znakov&lt;br /&gt;
* riadok 7: prvok lineárneho zoznamu je [[Štruktúry (riešené príklady)|zlomok]]&lt;br /&gt;
* riadok 13: prvok lineárneho zoznamu je pole reálnych čísel o veľkosti 10.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz2.png|framed|center|Vizualizácia dátovej štruktúry TPrvok]]&lt;br /&gt;
&lt;br /&gt;
Pre uloženie informácie o tom, kde má zoznam začiatok a kde končí si definujme ďalšiu štruktúru, ktorú nazveme '''TZoznam''', ktorá bude obsahovať 2 smerníky na štruktúru TPrvok. Jeden smerník ukazuje na začiatok zoznamu a druhý smerník ukazuje na koniec zoznamu.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct TZoznam { &lt;br /&gt;
   TPrvok *prvy;&lt;br /&gt;
   TPrvok *posledny;&lt;br /&gt;
} ;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Súbor:lz3.png|framed|center|Vizualizácia dátovej štruktúry TZoznam]]&lt;br /&gt;
===Práca s lineárnym zoznamom===&lt;br /&gt;
Pre lineárny zoznam platí nasledovné:&lt;br /&gt;
*Prvky ''prvy'', ''posledny'', ''dalsi'' sú ukazovatele na '''TPrvok'''.&lt;br /&gt;
*Časť štruktúry TPrvok označené ako ''data'' môže byť ľubovoľný dátový typ: reťazec, štruktúra, číslo...&lt;br /&gt;
*Ak je zoznam prázdny informačná štruktúra TZoznam má dva ukazovatele a oba majú hodnotu NULL. Teda ukazujú &amp;quot;nikam&amp;quot;.&lt;br /&gt;
*Ak je v zozname jeden prvok tak ukazovatele ''prvy'' a ''posledny'' (TZoznam) ukazujú ne tento prvok a ''dalsi'' (TPrvok) má hodnotu NULL.&lt;br /&gt;
*Ak je v zozname dva a viac prvkov  tak &lt;br /&gt;
**smerník ''prvy'' (TZoznam) ukazuje na prvý prvok v lineárnom zozname,  &lt;br /&gt;
**smerník ''posledny'' (TZoznam) ukazuje na posledný prvok v lineárnom zozname,  &lt;br /&gt;
**Smerník ''dalsi'' (TPrvok) prvého prvku ukazuje na druhy prvok zoznamu a ''dalsi'' druhého prvku ukazuje na NULL.&lt;br /&gt;
&amp;lt;gallery widths=500px&amp;gt;&lt;br /&gt;
Súbor:lz4.png|Prázdny lineárny zoznam&lt;br /&gt;
Súbor:lz5.png|Lineárny zoznam s jedným prvkom&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
====Prechod cez lineárny zoznam====&lt;br /&gt;
Uvedieme psseudokód, ktorý ukazuje princíp prechodu cez všetky prvky lineárneho zoznamu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line&amp;gt;&lt;br /&gt;
TZoznam LinZ;&lt;br /&gt;
// naplnenie zoznamu datami&lt;br /&gt;
begin&lt;br /&gt;
TPrvok *pom;&lt;br /&gt;
pom=LinZ.prvy;&lt;br /&gt;
rob&lt;br /&gt;
   begin&lt;br /&gt;
      vypis pom-&amp;gt;data&lt;br /&gt;
      pom=pom-&amp;gt;dalsi;&lt;br /&gt;
      pokial( pom != LinZ.posledny )&lt;br /&gt;
   end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vysvetlenie uvedeného pseudokódu:'''&lt;br /&gt;
&lt;br /&gt;
*Na riadku 1 si vytvoríme premennú typu TZoznam (Lineárny zoznam, ktorý udržuje informáciu o prvom a posledom prvku zoznamu). &lt;br /&gt;
*Naplnenie zoznamu je symbolicky naznačené na riadku 2. &lt;br /&gt;
*Zoznam pozostáva zo štruktúr typu smerník na TPrvok. Preto si na riadku 4 vytvárame premennú ''pom'' typu smerník na TPrvok. &lt;br /&gt;
**Pre túto premennú netreba alokovať miesto v pamäti, pretože pomocou tejto premennej budeme prechádzať po existujúcich prvkoch zoznamu. &lt;br /&gt;
**Na začiatok nastavíme premennú ''pom'' na prvý prvok zoznamu. &lt;br /&gt;
*V cykle (riadok 6) vypíšeme obsah prvku (riadok 8). &lt;br /&gt;
*Na riadku 9 je posunutie sa o jeden prvok ďalej.&lt;br /&gt;
*Cyklus ukončíme vtedy ak bude prvok pom zhodný z posledným prvkom zoznamu (smerní na posledný prvok zoznamu obsahuje premenná LinZ.&lt;br /&gt;
==Vkladanie záznamov zo lineárneho zoznamu==&lt;br /&gt;
Prvok môžeme do zoznamu vkladať dvoma spôsobmi:&lt;br /&gt;
#Vloženie prvku na koniec (na začiatok). Vytváraný zoznam bude neusporiadaný. &lt;br /&gt;
#Vloženie prvku na správne miesto. V tomto prípade sa snažíme aby bol zoznam stále usporiadaný od najmenšieho (najväčšieho) prvku po najväčší (najmenší).&lt;br /&gt;
===Vkladanie nového prvku na koniec zoznamu===&lt;br /&gt;
Pri vkladaní prvku do lineárneho zoznamu musíme rozlíšiť 2 rôzne situácie&lt;br /&gt;
#Zoznam je prázdny&lt;br /&gt;
#*Vložený prvok bude jediným prvkom zoznamu. Bude prvým a zároveň posledným prvkom zoznamu&lt;br /&gt;
#Zoznam nie je prázdny.&lt;br /&gt;
#*Vložený prvok umiestnime na koniec zoznamu. Tento nový prvok bude zároveň posledným prvkom zoznamu.&lt;br /&gt;
Na nasledujúcich obrázkoch bude znázornená situácia vloženia nového prvku do prázdneho a neprázdneho zoznamu na koniec.&lt;br /&gt;
&amp;lt;gallery widths=250px&amp;gt;&lt;br /&gt;
Súbor:lz6.png|Prázdny zoznam. Do zoznamu budeme vkladať nový prvok s hodnotou &amp;quot;-5&amp;quot;&lt;br /&gt;
Súbor:lz7.png|Do prázdneho zoznamu sme vložili nový prvok s hodnotou &amp;quot;-5&amp;quot;. Tento prvok sa stal zároveň prvým aj posledným prvkom zoznamu.&lt;br /&gt;
Súbor:lz8.png|Do zoznamu sme vložili nový prvok s hodnotou &amp;quot;20&amp;quot;. Tento nový prvok bude posledným prvkom v zozname. Pred pridaním mal prvok &amp;quot;-5&amp;quot; smerník ''dalsi'' nastavený na hodnou NULL (pretože bol posledný). Teraz smetník ''dalsi'' prvku &amp;quot;-5&amp;quot; ukazuje na prvok &amp;quot;20&amp;quot;, ktorého smerník ''dalsi'' ma hodnotu NULL.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
===Vkladanie nového prvku do usporiadaného zoznamu===&lt;br /&gt;
Pri vkladaní prvku do usporiadaného lineárneho zoznamu musíme rozlíšiť nasledujúce situácie&lt;br /&gt;
#Zoznam je prázdny&lt;br /&gt;
#*Vložený prvok bude jediným prvkom zoznamu. Bude prvým a zároveň posledným prvkom zoznamu. Toto riešenie je rovnaké ako v predchádzajúcom príklade.&lt;br /&gt;
#Zoznam nie je prázdny.&lt;br /&gt;
##Nový prvok je menší ako prvý prvok.&lt;br /&gt;
##Nový prvok je väčší ako posledný prvok.&lt;br /&gt;
##Nový prvok treba umiestniť na správne miesto v zozname.&lt;br /&gt;
Na nasledujúcich obrázkoch bude znázornené jednotlivé prípady.&lt;br /&gt;
Budeme vychádzať z neprázdneho zoznamu z nasledujúceho obrázka.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz9.png|framed|center|Nerázdny usporiadaný lineárny zoznam]]&lt;br /&gt;
&lt;br /&gt;
Do zoznamu vkladáme nový prvok s hodnotou &amp;quot;-5&amp;quot;. Zistili sme že tento prvok je menší ako prvý prvok, preto ho umiestnime na začiatok zoznamu. Po vložení to bude nový prvý prvok zoznamu.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz10.png|framed|center|Vloženie nového prvku na začiatok zoznamu]]&lt;br /&gt;
&lt;br /&gt;
Do zoznamu vkladáme nový prvok s hodnotou &amp;quot;20&amp;quot;. Zistili sme že tento prvok je väčší ako posledný prvok, preto ho umiestnime na koniec zoznamu. Po vložení to bude nový posledný prvok zoznamu.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz11.png|framed|center|Vloženie nového prvku na koniec zoznamu]]&lt;br /&gt;
&lt;br /&gt;
Do zoznamu vkladáme nová prvok s hodnotou &amp;quot;5&amp;quot;. Zistili sme že tento prvok treba umiestniť na správne miesto v zozname. Po nájdení správneho miesta (medzi prvky 0 a 10) ho medzi tieto prvky vložíme. Prvky medzi ktoré budeme nový prvok vkladať si označme ako ''lavy'' a ''pravy''. Postupnosť operácií, ktoré musíme urobiť je na nasledujúcom obrázku:&lt;br /&gt;
#Smerník ''dalsi'' nového prvku nastavíme na prvok ''pravy''&lt;br /&gt;
#Zmažeme smerník ''dalsi'', ktorý ukazuje z prvku ''lavy'' na ''pravy''.&lt;br /&gt;
#Smerník ''dalsi'' prvku ''lavy'' nastavíme tak, aby ukazoval na nový prvok.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz12.png|framed|center|]]&lt;br /&gt;
&lt;br /&gt;
==Implementácia lineárneho zoznamu v jazyku C==&lt;br /&gt;
===Dátová štruktúra opisujúca lineárny zoznam===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct TPrvok &lt;br /&gt;
   {	&lt;br /&gt;
      int data;	&lt;br /&gt;
      TPrvok *dalsi; &lt;br /&gt;
   };&lt;br /&gt;
&lt;br /&gt;
struct TZoznam { &lt;br /&gt;
   TPrvok *prvy;&lt;br /&gt;
   TPrvok *posledny;&lt;br /&gt;
} ;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Vloženie prvku na koniec zoznamu===&lt;br /&gt;
Vo funkcii Vloz_k budeme do zoznamu vkladať nový prvok na koniec zoznamu. &lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
*TZoznam &amp;amp;z - odkaz na lineárny zoznam, do ktorého vkladáme nový údaj, &lt;br /&gt;
* int x - hodnota, ktorú budeme do zoznamu ''z'' vkladať.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna.&lt;br /&gt;
&lt;br /&gt;
Do zoznamu budeme vkladať nový prvok, ktorého hodnota je definované vo vstupnom parametri x. Keďže sa zoznam skladá iba zo smerníkov na štruktúru TPrvok, je potrebné si vytvoriť (a alokovať miesto) smerník (riadok 3) na štruktúru TPrvok. Do tejto štruktúry je potom treba nastaviť hodnotu x (riadok 4). Premenná ''novy'' reprezentuje prvok, ktorý budeme do zoznamu vkladať.&lt;br /&gt;
Ak je zoznam ''z'' prázdny, tak novo vložený prvok bude zároveň prvým aj posledným prvkom zoznamu (riadok 8 a 11). Ak v zozname ''z'' existuje nejaký prvok, tak teba nový prvok vložiť na koniec zoznamu. Poradie operácií, ktoré treba urobiť je:&lt;br /&gt;
#Hodnota smerníku ''dalsi'' posledného prvku zoznamu je NULL. Po pridaní nového prvku bude mať tento smerník &amp;lt;nowiki&amp;gt;z.posledny-&amp;gt;dalsi&amp;lt;/nowiki&amp;gt; hodnotu adresy nového prvku (riadok 10)&lt;br /&gt;
#Po pridaní nového prvku na koniec treba upraviť smerník ''posledny'' (''z.posledny'') zoznamu z: posledný prvok je v skutočnosti novo vložený prvok (riadok 11).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void Vloz_k(TZoznam &amp;amp;z, int x)  // vlozi prvok na koniec&lt;br /&gt;
{ // vlozime novy prvok, ktory ma hodnotu x&lt;br /&gt;
  TPrvok *novy = new TPrvok;&lt;br /&gt;
  novy-&amp;gt;data = x;&lt;br /&gt;
  novy-&amp;gt;dalsi = NULL;&lt;br /&gt;
&lt;br /&gt;
  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
       z.prvy = novy;&lt;br /&gt;
  else&lt;br /&gt;
       z.posledny-&amp;gt;dalsi = novy;&lt;br /&gt;
  z.posledny = novy;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Vloženie prvku na začiatok zoznamu===&lt;br /&gt;
Vo funkcii Vloz_z budeme do zoznamu vkladať nový prvok na začiatok zoznamu. &lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
*TZoznam &amp;amp;z - odkaz na lineárny zoznam, do ktorého vkladáme nový údaj, &lt;br /&gt;
* int x - hodnota, ktorú budeme do zoznamu ''z'' vkladať.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna.&lt;br /&gt;
&lt;br /&gt;
Význam riadkov 3 až 5 je rovnaký ako v predchádzajúcej funkcii.&lt;br /&gt;
Ak je zoznam ''z'' prázdny, tak novo vložený prvok bude zároveň prvým aj posledným prvkom zoznamu (riadok 8 a 11). Ak v zozname ''z'' existuje nejaký prvok, tak teba nový prvok vložiť na začiatok zoznamu. Poradie operácií, ktoré treba urobiť je:&lt;br /&gt;
#Hodnota smerníku ''dalsi'' vkladaného prvku zoznamu je NULL (riadok 5). Po pridaní nového prvku bude hodnota jeho smerníka ''dalsi'' obsahovať adresu prvku, ktorý bol pred vložením prvý (riadok 10)&lt;br /&gt;
#Po pridaní nového prvku na začiatok treba upraviť smerník ''prvy'' (''z.prvy'') zoznamu z: prvý prvok je v skutočnosti novo vložený prvok (riadok 11).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void Vloz_z(TZoznam &amp;amp;z, int x)  &lt;br /&gt;
{ // vlozime novy prvok, ktory ma hodnotu x&lt;br /&gt;
  TPrvok *novy = new TPrvok;&lt;br /&gt;
  novy-&amp;gt;data = x;&lt;br /&gt;
  novy-&amp;gt;dalsi = NULL;&lt;br /&gt;
&lt;br /&gt;
  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
     z.posledny = novy;&lt;br /&gt;
  else&lt;br /&gt;
     novy-&amp;gt;dalsi=z.prvy&lt;br /&gt;
  z.prvy = novy;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Vloženie prvku do usporiadaného zoznamu===&lt;br /&gt;
Vo funkcii Vloz budeme do zoznamu vkladať nový prvok do zoznamu na také miesto, aby bol zoznam stále usporiadaný.&lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
*TZoznam &amp;amp;z - odkaz na lineárny zoznam, do ktorého vkladáme nový údaj, &lt;br /&gt;
* int x - hodnota, ktorú budeme do zoznamu ''z'' vkladať.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna.&lt;br /&gt;
&lt;br /&gt;
Princíp vkladania vkladania nového prvku je opísaný v kapitole [[#Vkladanie nového prvku do usporiadaného zoznamu]]. V nasledujúcom texte bude vysvetlená len implementácia v jazyku C. &lt;br /&gt;
*riadok 7-8 : vkladanie do prázdneho zoznamu&lt;br /&gt;
*riadok 9-30 : vkladanie do neprázdneho zoznamu&lt;br /&gt;
**riadok 10: hodnota x &amp;lt;nowiki&amp;gt;&amp;lt;&amp;lt;/nowiki&amp;gt; hodnota prvého prvku zoznamu. Nový prvok bude vložený na začiatok zoznamu.&lt;br /&gt;
**riadok 16-20: hodnota x &amp;lt;nowiki&amp;gt;&amp;gt;&amp;lt;/nowiki&amp;gt; hodnota posledného prvku zoznamu. Nový prvok bude vložený na koniec zoznamu.&lt;br /&gt;
**riadok 21-30: hodnota x menšia hodnota prvého prvku a zároveň menšia ako hodnota posledného prvku&lt;br /&gt;
***riadok 23: 2 pomocné smerníky p1 a p2. p1 ukazuje na prvý prvok (''p1=z.prvy''), p2 ukazuje na druhý prvok zoznamu (''p2=z.prvy-&amp;lt;nowiki&amp;gt;&amp;gt;&amp;lt;/nowiki&amp;gt;dalsi'')&lt;br /&gt;
***riadok 24: v cykle while hľadáme také miesto kde neplatí, že hodnota x je väčšia ako hodnota prvku p2. V prípade, ak platí že &amp;lt;nowiki&amp;gt;x&amp;gt;p2-&amp;gt;data&amp;lt;/nowiki&amp;gt;, tak smerníky p1 a p2 posunieme o jedno miesto z zozname ďalej (riadok 25 a 26).&lt;br /&gt;
*** Po skončení cyklu while platí že hodnota prvku x je menšia ako hodnota dátovej časti prvku p2. Našli sme teda miesto, kde budeme prvok ''novy'' vkladať. Nový prvok vložíme medzi prvky p1 a p2.&lt;br /&gt;
*** riadok 28-29: vloženie nového prvku medzi prvky p1 a p2.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void Vloz(TZoznam &amp;amp;z, int x)  // vlozi prvok zotriedene&lt;br /&gt;
{&lt;br /&gt;
   TPrvok *novy = new TPrvok;&lt;br /&gt;
   novy-&amp;gt;data = x;&lt;br /&gt;
   novy-&amp;gt;dalsi = NULL;&lt;br /&gt;
&lt;br /&gt;
   if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
      z.prvy = z.posledny = novy;&lt;br /&gt;
   else 	// v zozname je nejaky prvok&lt;br /&gt;
      if (x &amp;lt; z.prvy-&amp;gt;data)  // ak je x &amp;lt; ako hodnota prveho 	  &lt;br /&gt;
      {		// prvku vlozim novy prvok na zaciatok&lt;br /&gt;
         novy-&amp;gt;dalsi = z.prvy;&lt;br /&gt;
         z.prvy = novy;&lt;br /&gt;
      }&lt;br /&gt;
      else &lt;br /&gt;
         if (x &amp;gt; z.posledny-&amp;gt;data)  // x &amp;gt; ako posledny prvok zoznamu&lt;br /&gt;
         {&lt;br /&gt;
            z.posledny-&amp;gt;dalsi = novy;&lt;br /&gt;
            z.posledny = novy;&lt;br /&gt;
         }&lt;br /&gt;
         else  // vlozenie niekde do stredu zoznamu&lt;br /&gt;
         {&lt;br /&gt;
            TPrvok *p1 = z.prvy, *p2 = z.prvy-&amp;gt;dalsi;&lt;br /&gt;
            while (p2-&amp;gt;data &amp;lt; x) // hladame miesto, kde vlozime prvok&lt;br /&gt;
            {   p1 = p2; &lt;br /&gt;
                p2 = p2-&amp;gt;dalsi; // posun o jeden prvok &lt;br /&gt;
            }&lt;br /&gt;
            p1-&amp;gt;dalsi = novy; // vlozenie noveho zaznamu 		    &lt;br /&gt;
            novy-&amp;gt;dalsi = p2; // na spravne miesto&lt;br /&gt;
         }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Vyhľadanie prvku v lineárnom zozname===&lt;br /&gt;
Vo funkcii ''hladaj'' budeme v zozname hľadať prvok s danou hodnotou.&lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
* TZoznam z - lineárny zoznam, v ktorom budeme vyhľadávať&lt;br /&gt;
* int x - hodnota, ktorú budeme v zozname ''z'' hľadať.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: V prípade úspechu smerník na nájdený prvok. V prípade neúspechu NULL.&lt;br /&gt;
&lt;br /&gt;
Princíp funkcie o opísaný v kapitole [[#Prechod cez lineárny zoznam|Prechod cez lineárny zoznam]].&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
TPrvok* hladaj(TZoznam z, int x)&lt;br /&gt;
{&lt;br /&gt;
  TPrvok *p = z.prvy;  // pomocny prvok typu TPrvok&lt;br /&gt;
  while (p != NULL) // opakuj, pokial neprides na koniec zoznamu&lt;br /&gt;
  {&lt;br /&gt;
    if (p-&amp;gt;data == x) return p;	  // ak sa prvok nasiel&lt;br /&gt;
    p = p-&amp;gt;dalsi;	// chod na dalsi prvok zoznamu&lt;br /&gt;
  }&lt;br /&gt;
  return NULL; // ak si nic nenasiel, vrat 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Výpis prvkov lineárneho zoznamu===&lt;br /&gt;
Vo funkcii ''vypis'' budeme vypisovať postupne všetky prvku lineárneho zoznamu.&lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
* TZoznam z - lineárny zoznam, ktorého prvky budeme vypisovať&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna&lt;br /&gt;
&lt;br /&gt;
Princíp funkcie o opísaný v kapitole [[#Prechod cez lineárny zoznam|Prechod cez lineárny zoznam]].&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int JePrazdny(TZoznam z)&lt;br /&gt;
{ // ak je zoznam prazdny, funkcia vrati 1, inak 0&lt;br /&gt;
  return z.prvy == NULL;&lt;br /&gt;
}&lt;br /&gt;
void vypis(TZoznam z)&lt;br /&gt;
{&lt;br /&gt;
  if (JePrazdny(z)) return;  // ak je zoznam prazdny, skonci&lt;br /&gt;
  TPrvok *p = z.prvy;  // pomocny prvok typu TPrvok&lt;br /&gt;
  while (p-&amp;gt;dalsi != NULL) // prechádzaj cez vsetky prvky&lt;br /&gt;
  {&lt;br /&gt;
    cout &amp;lt;&amp;lt; p-&amp;gt;data &amp;lt;&amp;lt; &amp;quot;, &amp;quot;;  // vypis datovu cast prvku&lt;br /&gt;
    p = p-&amp;gt;dalsi;	// chod na dalsi prvok&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; p-&amp;gt;data &amp;lt;&amp;lt; endl; // vypis posledny prvok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Zmazanie prvého prvku zoznamu===&lt;br /&gt;
Vo funkcii ''ZmazPrvy'' budeme mazať prvý prvok zoznamu. Po zmazaní musia mať smerníky ''prvy'' a ''posledny'' zoznamu ''z'' aktuálne hodnoty.&lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
* TZoznam &amp;amp;z - odkaz na lineárny zoznam, v ktorom budeme mazať prvý prvok.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna&lt;br /&gt;
&lt;br /&gt;
Na riadku 4 je vytvorený pomocný smerník, ktorý bude mať hodnotu prvého prvku zoznamu. Ako prvé je potrebné nastaviť smerník ''prvy'' zoznamu ''z'' (''z.prvy'') na prvok, ktorý bude po zmazaní prvého prvku zoznamu nový prvý prvok. Toto je vlastne druhý prvok zoznamu (''&amp;lt;nowiki&amp;gt;p-&amp;gt;dalsi&amp;lt;/nowiki&amp;gt;''). Na koniec (riadok 6) treba zmazať prvý prvok.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void ZmazPrvy(TZoznam &amp;amp;z)&lt;br /&gt;
{  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
    return;&lt;br /&gt;
   TPrvok *p=z.prvy;&lt;br /&gt;
   z.prvy=p-&amp;gt;dalsi;&lt;br /&gt;
   delete p;&lt;br /&gt;
}		&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zmazanie posledného prvku zoznamu===&lt;br /&gt;
Vo funkcii ''ZmazPosledny'' budeme mazať posledný prvok zoznamu. Po zmazaní musia mať smerníky ''prvy'' a ''posledny'' zoznamu ''z'' aktuálne hodnoty.&lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
* TZoznam &amp;amp;z - odkaz na lineárny zoznam, v ktorom budeme mazať prvý prvok.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna&lt;br /&gt;
&lt;br /&gt;
*riadok 2: zoznam je prázdny. Funkcia skončí&lt;br /&gt;
*riadok 5: v zozname je len jeden prvok. Po jeho zmazaní bude zoznam prázdny.&lt;br /&gt;
*riadok 11: v zozname je viac ako 1 prvok. Po zmazaní posledného prvku bude nový posledný prvok ten, ktorý bol v pôvodnom zozname predposledný.&lt;br /&gt;
** Hľadanie predposledného prvku: riadok 11 a 12. Predposledný prvok je taký prvok p, pre ktorý platí:&lt;br /&gt;
***''&amp;lt;nowiki&amp;gt;p-&amp;gt;dalsi&amp;lt;/nowiki&amp;gt;'' je posledný prvok zoznamu. Vieme, že posledný prvok zoznamu má hodnotu smerníka dalsi NULL. Preto ak platí výraz &amp;lt;nowiki&amp;gt;p-&amp;gt;dalsi-&amp;gt;dalsi == NULL&amp;lt;/nowiki&amp;gt;, tak potom je prvok p predposledný.&lt;br /&gt;
***Ak sme našli predposledný prvok, tak môžeme zmazať posledný prvok (riadok 13)&lt;br /&gt;
***Prvok ''p'' sa stane posledným prvkom. Posledný prvok má hodnotu smerníka ''dalsi'' NULL (riadok 14)&lt;br /&gt;
***Prvok ''p'' nastavíme ako posledný prvok zoznamu ''z'' (riadok 15).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void ZmazPosledny(TZoznam &amp;amp;z)&lt;br /&gt;
{  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
    return;&lt;br /&gt;
  TPrvok *p = z.prvy;&lt;br /&gt;
  if (p-&amp;gt;dalsi == NULL)  // je len jeden prvok&lt;br /&gt;
  { delete p;&lt;br /&gt;
    z.prvy = z.posledny= NULL;  // upravime strukturu z&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // najdeme predposledny prvok&lt;br /&gt;
  while (p-&amp;gt;dalsi-&amp;gt;dalsi != NULL)&lt;br /&gt;
    p = p-&amp;gt;dalsi;&lt;br /&gt;
  delete p-&amp;gt;dalsi;	// zmazeme posledny&lt;br /&gt;
  p-&amp;gt;dalsi = NULL;  // a nastavime NULL na aktualny posledny prvok&lt;br /&gt;
  z.posledny = p;  //upravime zoznam tak, aby ukazoval spravne na&lt;br /&gt;
}			  // posledny prvok&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Zmazanie lineárneho zoznamu===&lt;br /&gt;
Vo funkcii ''Zmaz'' budeme mazať všetky prvky zoznamu. &lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
* TZoznam &amp;amp;z - odkaz na lineárny zoznam, ktorého prvky budeme mazať.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna&lt;br /&gt;
&lt;br /&gt;
Je jedno, či budeme mazať zoznam od začiatku, alebo od konca. Implementácia mazania Zmaz2 je ale efektívnejšia pretože zložitosť funkcie ''ZmazPrvy'' je O(1) a zložitosť funkcie ''ZmazPosledny'' je O(n).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Zmaz(TZoznam &amp;amp;z)&lt;br /&gt;
{ &lt;br /&gt;
  while (!JePrazdny(z)) // pokial je v zozname nejaky prvok&lt;br /&gt;
    ZmazPosledny(z); // zmaze posledny prvok&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Zmaz2(TZoznam &amp;amp;z)&lt;br /&gt;
{ &lt;br /&gt;
  while (!JePrazdny(z)) // pokial je v zozname nejaky prvok&lt;br /&gt;
    ZmazPrvy(z); // zmaze prvy prvok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Použitie lineárneho zoznamu v programe===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void main()&lt;br /&gt;
{ TZoznam zoznam;&lt;br /&gt;
  zoznam.prvy =NULL;&lt;br /&gt;
  zoznam.posledny = NULL;&lt;br /&gt;
  int udaj,n=4; //pocet zaznamov&lt;br /&gt;
  for(int i=0;i&amp;lt;n;i++)&lt;br /&gt;
  {   cin&amp;gt;&amp;gt;udaj;&lt;br /&gt;
	 Vloz_z(zoznam, udaj);&lt;br /&gt;
  }&lt;br /&gt;
  for(int i=0;i&amp;lt;n;i++)&lt;br /&gt;
  {   cin&amp;gt;&amp;gt;udaj;&lt;br /&gt;
	 Vloz_k(zoznam, udaj);&lt;br /&gt;
  }&lt;br /&gt;
  vypis(zoznam);&lt;br /&gt;
  Zmaz(zoznam);&lt;br /&gt;
  &lt;br /&gt;
  for(int i=0;i&amp;lt;n;i++)&lt;br /&gt;
  {   cin&amp;gt;&amp;gt;udaj;&lt;br /&gt;
	 Vloz(zoznam, udaj);&lt;br /&gt;
  }&lt;br /&gt;
  vypis(zoznam);&lt;br /&gt;
  Zmaz(zoznam);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jehro77</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Line%C3%A1rny_zoznam&amp;diff=2966</id>
		<title>Lineárny zoznam</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Line%C3%A1rny_zoznam&amp;diff=2966"/>
		<updated>2010-03-27T11:26:15Z</updated>

		<summary type="html">&lt;p&gt;Jehro77: /* Vkladanie nového prvku do usporiadaného zoznamu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
{{Cvicenie|Lineárny zoznam (riešené príklady)}}&lt;br /&gt;
'''Lineárny zoznam''' &amp;lt;ref&amp;gt;Lineární seznam - http://cs.wikipedia.org/wiki/Line%C3%A1rn%C3%AD_seznam&amp;lt;/ref&amp;gt;(lineárny spojový zoznam) je dynamická dátová štruktúra, navonok podobná poľu (umožňuje uložiť viacero hodnôt, ale iným spôsobom), obsahujúca jednu alebo viacero dátových položiek (štruktúr) rovnakého typu, ktoré sú navzájom lineárne previazané vzájomnými odkazmi pomocou smerníkov alebo referencií. Aby bol zoznam lineárny, nesmú v ňom existovať cykly so vzájomnými odkazmi.&lt;br /&gt;
&lt;br /&gt;
Lineárny zoznam poznáme jednosmerný a obojsmerný. V jednosmernom zozname odkazuje každá položka na nasledujúcu položku a v obojsmernom zozname odkazuje aktuálna položka na nasledujúcu ale aj predchádzajúcu položku. Definuje sa tu smerník alebo odkaz na určitý prvok zoznamu. Na konci (a začiatku) musí byť definovaná zarážka, ktorá označuje koniec zoznamu. Ak vytvoríme taký cyklus, že posledný prvok zoznamu odkazuje na prvý prvok zoznamu, dostaneme kruhový zoznam.&lt;br /&gt;
&amp;lt;gallery widths=250px&amp;gt;&lt;br /&gt;
Súbor:ll1.svg|Jednosmerný lineárny zoznam.Každý prvok zoznamu okrem svojej hodnoty obsahuje i odkaz na nasledujúci prvok v seznamu. Posledný prvok odkazuje „nikam“.&lt;br /&gt;
Súbor:ll2.svg|Jednosmerný kruhový zoznam. Posledný prvok zoznamu odkazuje opäť na začiatok.&lt;br /&gt;
Súbor:ll3.svg|Obojsmerný lineárny zoznam. Každý prvok zoznamu obsahuje, okrem svojej hodnoty, odkaz na nasledujúci i predchádzajúci prvok zoznamu&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V nasledujúcom texte bude opisovaný '''jednosmerný lineárny zoznam'''.&lt;br /&gt;
==Vlastnosti lineárneho zoznamu==&lt;br /&gt;
*Jednosmerný lineárny zoznam je pamäťovo nenáročná dátová štruktúra&lt;br /&gt;
*Dovoľuje zoskupiť ľubovoľný počet prvkov. Počet prvkov je obmedzený len dostupnou pamäťovou kapacitou počítača.&lt;br /&gt;
*Dokáže jednoducho meniť svoju veľkosť počas behu programu.&lt;br /&gt;
*Prvky zoznamu, na rozdiel od polí neležia vedľa seba, ale v pamäti sú alokované podľa toho, kde je dostatok miesta.&lt;br /&gt;
Nasledujúci obrázok znázorňuje spôsob uloženia prvkov v pamäti pri použití poľa a lineárneho zoznamu.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz1.png|framed|center|Rozdiel medzi vnútornou štruktúrou poľa a lineárneho zoznamu]]&lt;br /&gt;
&lt;br /&gt;
==Štruktúra lineárneho zozamu==&lt;br /&gt;
Lineárny zoznam sa skladá z určitých prvkov (alebo uzlov), ktoré sú navzájom previazané vzájomnými odkazmi. Inak povedané stavebný prvok lineárneho zoznamuje samotnú hodnotu prvku (číslo, reťazec, štruktúra, ...) a odkaz na ďalší prvok. Ešte pripomeňme, že všetky prvky lineárneho zoznamu sú rovnakého typu.&lt;br /&gt;
&lt;br /&gt;
Definujme štruktúru '''TPrvok''' (záznam pracovnej povahy), ktorý bude obsahovať:&lt;br /&gt;
*dátovú časť (ľubovolná položka, v našom prípade celé číslo) &lt;br /&gt;
*ukazovateľ na na ďalší záznam typu TPrvok&lt;br /&gt;
&lt;br /&gt;
Definícia v jazyku C:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct TPrvok &lt;br /&gt;
   {	&lt;br /&gt;
      int data;	&lt;br /&gt;
      TPrvok *dalsi; &lt;br /&gt;
   };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vysvetlenie:&lt;br /&gt;
Štruktúra TPrvok obsahuje dátovú časť označenú ako '''data'''. Odkaz na ďalší prvok je označený ako '''dalsi''', a je to smetník na štruktúru TPrvok.&lt;br /&gt;
&lt;br /&gt;
V nasledujúcom príklade budú ukážky definície prvkov lineárneho zoznamu, ktorý namiesto hodnoty celého čísla obsahuje inú dátovú časť.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct TPrvok &lt;br /&gt;
   {	&lt;br /&gt;
      char retazec[64];	&lt;br /&gt;
      TPrvok *dalsi; &lt;br /&gt;
   };&lt;br /&gt;
//------------------------------------&lt;br /&gt;
struct TPrvok &lt;br /&gt;
   {	&lt;br /&gt;
      TZlomok data;	&lt;br /&gt;
      TPrvok *dalsi; &lt;br /&gt;
   };&lt;br /&gt;
//------------------------------------&lt;br /&gt;
struct TPrvok &lt;br /&gt;
   {	&lt;br /&gt;
      double data[10];	&lt;br /&gt;
      TPrvok *dalsi; &lt;br /&gt;
   };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* riadok 1: prvok lineárneho zoznamu je reťazec o dĺžke 63 znakov&lt;br /&gt;
* riadok 7: prvok lineárneho zoznamu je [[Štruktúry (riešené príklady)|zlomok]]&lt;br /&gt;
* riadok 13: prvok lineárneho zoznamu je pole reálnych čísel o veľkosti 10.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz2.png|framed|center|Vizualizácia dátovej štruktúry TPrvok]]&lt;br /&gt;
&lt;br /&gt;
Pre uloženie informácie o tom, kde má zoznam začiatok a kde končí si definujme ďalšiu štruktúru, ktorú nazveme '''TZoznam''', ktorá bude obsahovať 2 smerníky na štruktúru TPrvok. Jeden smerník ukazuje na začiatok zoznamu a druhý smerník ukazuje na koniec zoznamu.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct TZoznam { &lt;br /&gt;
   TPrvok *prvy;&lt;br /&gt;
   TPrvok *posledny;&lt;br /&gt;
} ;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Súbor:lz3.png|framed|center|Vizualizácia dátovej štruktúry TZoznam]]&lt;br /&gt;
===Práca s lineárnym zoznamom===&lt;br /&gt;
Pre lineárny zoznam platí nasledovné:&lt;br /&gt;
*Prvky ''prvy'', ''posledny'', ''dalsi'' sú ukazovatele na '''TPrvok'''.&lt;br /&gt;
*Časť štruktúry TPrvok označené ako ''data'' môže byť ľubovoľný dátový typ: reťazec, štruktúra, číslo...&lt;br /&gt;
*Ak je zoznam prázdny informačná štruktúra TZoznam má dva ukazovatele a oba majú hodnotu NULL. Teda ukazujú &amp;quot;nikam&amp;quot;.&lt;br /&gt;
*Ak je v zozname jeden prvok tak ukazovatele ''prvy'' a ''posledny'' (TZoznam) ukazujú ne tento prvok a ''dalsi'' (TPrvok) má hodnotu NULL.&lt;br /&gt;
*Ak je v zozname dva a viac prvkov  tak &lt;br /&gt;
**smerník ''prvy'' (TZoznam) ukazuje na prvý prvok v lineárnom zozname,  &lt;br /&gt;
**smerník ''posledny'' (TZoznam) ukazuje na posledný prvok v lineárnom zozname,  &lt;br /&gt;
**Smerník ''dalsi'' (TPrvok) prvého prvku ukazuje na druhy prvok zoznamu a ''dalsi'' druhého prvku ukazuje na NULL.&lt;br /&gt;
&amp;lt;gallery widths=500px&amp;gt;&lt;br /&gt;
Súbor:lz4.png|Prázdny lineárny zoznam&lt;br /&gt;
Súbor:lz5.png|Lineárny zoznam s jedným prvkom&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
====Prechod cez lineárny zoznam====&lt;br /&gt;
Uvedieme psseudokód, ktorý ukazuje princíp prechodu cez všetky prvky lineárneho zoznamu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;delphi&amp;quot; line&amp;gt;&lt;br /&gt;
TZoznam LinZ;&lt;br /&gt;
// naplnenie zoznamu datami&lt;br /&gt;
begin&lt;br /&gt;
TPrvok *pom;&lt;br /&gt;
pom=LinZ.prvy;&lt;br /&gt;
rob&lt;br /&gt;
   begin&lt;br /&gt;
      vypis pom-&amp;gt;data&lt;br /&gt;
      pom=pom-&amp;gt;dalsi;&lt;br /&gt;
      pokial( pom != LinZ.posledny )&lt;br /&gt;
   end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vysvetlenie uvedeného pseudokódu:'''&lt;br /&gt;
&lt;br /&gt;
*Na riadku 1 si vytvoríme premennú typu TZoznam (Lineárny zoznam, ktorý udržuje informáciu o prvom a posledom prvku zoznamu). &lt;br /&gt;
*Naplnenie zoznamu je symbolicky naznačené na riadku 2. &lt;br /&gt;
*Zoznam pozostáva zo štruktúr typu smerník na TPrvok. Preto si na riadku 4 vytvárame premennú ''pom'' typu smerník na TPrvok. &lt;br /&gt;
**Pre túto premennú netreba alokovať miesto v pamäti, pretože pomocou tejto premennej budeme prechádzať po existujúcich prvkoch zoznamu. &lt;br /&gt;
**Na začiatok nastavíme premennú ''pom'' na prvý prvok zoznamu. &lt;br /&gt;
*V cykle (riadok 6) vypíšeme obsah prvku (riadok 8). &lt;br /&gt;
*Na riadku 9 je posunutie sa o jeden prvok ďalej.&lt;br /&gt;
*Cyklus ukončíme vtedy ak bude prvok pom zhodný z posledným prvkom zoznamu (smerní na posledný prvok zoznamu obsahuje premenná LinZ.&lt;br /&gt;
==Vkladanie záznamov zo lineárneho zoznamu==&lt;br /&gt;
Prvok môžeme do zoznamu vkladať dvoma spôsobmi:&lt;br /&gt;
#Vloženie prvku na koniec (na začiatok). Vytváraný zoznam bude neusporiadaný. &lt;br /&gt;
#Vloženie prvku na správne miesto. V tomto prípade sa snažíme aby bol zoznam stále usporiadaný od najmenšieho (najväčšieho) prvku po najväčší (najmenší).&lt;br /&gt;
===Vkladanie nového prvku na koniec zoznamu===&lt;br /&gt;
Pri vkladaní prvku do lineárneho zoznamu musíme rozlíšiť 2 rôzne situácie&lt;br /&gt;
#Zoznam je prázdny&lt;br /&gt;
#*Vložený prvok bude jediným prvkom zoznamu. Bude prvým a zároveň posledným prvkom zoznamu&lt;br /&gt;
#Zoznam nie je prázdny.&lt;br /&gt;
#*Vložený prvok umiestnime na koniec zoznamu. Tento nový prvok bude zároveň posledným prvkom zoznamu.&lt;br /&gt;
Na nasledujúcich obrázkoch bude znázornená situácia vloženia nového prvku do prázdneho a neprázdneho zoznamu na koniec.&lt;br /&gt;
&amp;lt;gallery widths=250px&amp;gt;&lt;br /&gt;
Súbor:lz6.png|Prázdny zoznam. Do zoznamu budeme vkladať nový prvok s hodnotou &amp;quot;-5&amp;quot;&lt;br /&gt;
Súbor:lz7.png|Do prázdneho zoznamu sme vložili nový prvok s hodnotou &amp;quot;-5&amp;quot;. Tento prvok sa stal zároveň prvým aj posledným prvkom zoznamu.&lt;br /&gt;
Súbor:lz8.png|Do zoznamu sme vložili nový prvok s hodnotou &amp;quot;20&amp;quot;. Tento nový prvok bude posledným prvkom v zozname. Pred pridaním mal prvok &amp;quot;-5&amp;quot; smerník ''dalsi'' nastavený na hodnou NULL (pretože bol posledný). Teraz smetník ''dalsi'' prvku &amp;quot;-5&amp;quot; ukazuje na prvok &amp;quot;20&amp;quot;, ktorého smerník ''dalsi'' ma hodnotu NULL.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
===Vkladanie nového prvku do usporiadaného zoznamu===&lt;br /&gt;
Pri vkladaní prvku do usporiadaného lineárneho zoznamu musíme rozlíšiť nasledujúce situácie&lt;br /&gt;
#Zoznam je prázdny&lt;br /&gt;
#*Vložený prvok bude jediným prvkom zoznamu. Bude prvým a zároveň posledným prvkom zoznamu. Toto riešenie je rovnaké ako v predchádzajúcom príklade.&lt;br /&gt;
#Zoznam nie je prázdny.&lt;br /&gt;
##Nový prvok je menší ako prvý prvok.&lt;br /&gt;
##Nový prvok je väčší ako posledný prvok.&lt;br /&gt;
##Nový prvok treba umiestniť na správne miesto v zozname.&lt;br /&gt;
Na nasledujúcich obrázkoch bude znázornené jednotlivé prípady.&lt;br /&gt;
Budeme vychádzať z neprázdneho zoznamu z nasledujúceho obrázka.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz9.png|framed|center|Nerázdny usporiadaný lineárny zoznam]]&lt;br /&gt;
&lt;br /&gt;
Do zoznamu vkladáme nový prvok s hodnotou &amp;quot;-5&amp;quot;. Zistili sme že tento prvok je menší ako prvý prvok, preto ho umiestnime na začiatok zoznamu. Po vložení to bude nový prvý prvok zoznamu.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz10.png|framed|center|Vloženie nového prvku na začiatok zoznamu]]&lt;br /&gt;
&lt;br /&gt;
Do zoznamu vkladáme nová prvok s hodnotou &amp;quot;20&amp;quot;. Zistili sme že tento prvok je väčší ako posledný prvok, preto ho umiestnime na koniec zoznamu. Po vložení to bude nový posledný prvok zoznamu.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz11.png|framed|center|Vloženie nového prvku na koniec zoznamu]]&lt;br /&gt;
&lt;br /&gt;
Do zoznamu vkladáme nová prvok s hodnotou &amp;quot;5&amp;quot;. Zistili sme že tento prvok treba umiestniť na správne miesto v zozname. Po nájdení správneho miesta (medzi prvky 0 a 10) ho medzi tieto prvky vložíme. Prvky medzi ktoré budeme nový prvok vkladať si označme ako ''lavy'' a ''pravy''. Postupnosť operácií, ktoré musíme urobiť je na nasledujúcom obrázku:&lt;br /&gt;
#Smerník ''dalsi'' nového prvku nastavíme na prvok ''pravy''&lt;br /&gt;
#Zmažeme smerník ''dalsi'', ktorý ukazuje z prvku ''lavy'' na ''pravy''.&lt;br /&gt;
#Smerník ''dalsi'' prvku ''lavy'' nastavíme tak, aby ukazoval na nový prvok.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:lz12.png|framed|center|]]&lt;br /&gt;
&lt;br /&gt;
==Implementácia lineárneho zoznamu v jazyku C==&lt;br /&gt;
===Dátová štruktúra opisujúca lineárny zoznam===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct TPrvok &lt;br /&gt;
   {	&lt;br /&gt;
      int data;	&lt;br /&gt;
      TPrvok *dalsi; &lt;br /&gt;
   };&lt;br /&gt;
&lt;br /&gt;
struct TZoznam { &lt;br /&gt;
   TPrvok *prvy;&lt;br /&gt;
   TPrvok *posledny;&lt;br /&gt;
} ;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Vloženie prvku na koniec zoznamu===&lt;br /&gt;
Vo funkcii Vloz_k budeme do zoznamu vkladať nový prvok na koniec zoznamu. &lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
*TZoznam &amp;amp;z - odkaz na lineárny zoznam, do ktorého vkladáme nový údaj, &lt;br /&gt;
* int x - hodnota, ktorú budeme do zoznamu ''z'' vkladať.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna.&lt;br /&gt;
&lt;br /&gt;
Do zoznamu budeme vkladať nový prvok, ktorého hodnota je definované vo vstupnom parametri x. Keďže sa zoznam skladá iba zo smerníkov na štruktúru TPrvok, je potrebné si vytvoriť (a alokovať miesto) smerník (riadok 3) na štruktúru TPrvok. Do tejto štruktúry je potom treba nastaviť hodnotu x (riadok 4). Premenná ''novy'' reprezentuje prvok, ktorý budeme do zoznamu vkladať.&lt;br /&gt;
Ak je zoznam ''z'' prázdny, tak novo vložený prvok bude zároveň prvým aj posledným prvkom zoznamu (riadok 8 a 11). Ak v zozname ''z'' existuje nejaký prvok, tak teba nový prvok vložiť na koniec zoznamu. Poradie operácií, ktoré treba urobiť je:&lt;br /&gt;
#Hodnota smerníku ''dalsi'' posledného prvku zoznamu je NULL. Po pridaní nového prvku bude mať tento smerník &amp;lt;nowiki&amp;gt;z.posledny-&amp;gt;dalsi&amp;lt;/nowiki&amp;gt; hodnotu adresy nového prvku (riadok 10)&lt;br /&gt;
#Po pridaní nového prvku na koniec treba upraviť smerník ''posledny'' (''z.posledny'') zoznamu z: posledný prvok je v skutočnosti novo vložený prvok (riadok 11).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void Vloz_k(TZoznam &amp;amp;z, int x)  // vlozi prvok na koniec&lt;br /&gt;
{ // vlozime novy prvok, ktory ma hodnotu x&lt;br /&gt;
  TPrvok *novy = new TPrvok;&lt;br /&gt;
  novy-&amp;gt;data = x;&lt;br /&gt;
  novy-&amp;gt;dalsi = NULL;&lt;br /&gt;
&lt;br /&gt;
  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
       z.prvy = novy;&lt;br /&gt;
  else&lt;br /&gt;
       z.posledny-&amp;gt;dalsi = novy;&lt;br /&gt;
  z.posledny = novy;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Vloženie prvku na začiatok zoznamu===&lt;br /&gt;
Vo funkcii Vloz_z budeme do zoznamu vkladať nový prvok na začiatok zoznamu. &lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
*TZoznam &amp;amp;z - odkaz na lineárny zoznam, do ktorého vkladáme nový údaj, &lt;br /&gt;
* int x - hodnota, ktorú budeme do zoznamu ''z'' vkladať.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna.&lt;br /&gt;
&lt;br /&gt;
Význam riadkov 3 až 5 je rovnaký ako v predchádzajúcej funkcii.&lt;br /&gt;
Ak je zoznam ''z'' prázdny, tak novo vložený prvok bude zároveň prvým aj posledným prvkom zoznamu (riadok 8 a 11). Ak v zozname ''z'' existuje nejaký prvok, tak teba nový prvok vložiť na začiatok zoznamu. Poradie operácií, ktoré treba urobiť je:&lt;br /&gt;
#Hodnota smerníku ''dalsi'' vkladaného prvku zoznamu je NULL (riadok 5). Po pridaní nového prvku bude hodnota jeho smerníka ''dalsi'' obsahovať adresu prvku, ktorý bol pred vložením prvý (riadok 10)&lt;br /&gt;
#Po pridaní nového prvku na začiatok treba upraviť smerník ''prvy'' (''z.prvy'') zoznamu z: prvý prvok je v skutočnosti novo vložený prvok (riadok 11).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void Vloz_z(TZoznam &amp;amp;z, int x)  &lt;br /&gt;
{ // vlozime novy prvok, ktory ma hodnotu x&lt;br /&gt;
  TPrvok *novy = new TPrvok;&lt;br /&gt;
  novy-&amp;gt;data = x;&lt;br /&gt;
  novy-&amp;gt;dalsi = NULL;&lt;br /&gt;
&lt;br /&gt;
  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
     z.posledny = novy;&lt;br /&gt;
  else&lt;br /&gt;
     novy-&amp;gt;dalsi=z.prvy&lt;br /&gt;
  z.prvy = novy;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Vloženie prvku do usporiadaného zoznamu===&lt;br /&gt;
Vo funkcii Vloz budeme do zoznamu vkladať nový prvok do zoznamu na také miesto, aby bol zoznam stále usporiadaný.&lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
*TZoznam &amp;amp;z - odkaz na lineárny zoznam, do ktorého vkladáme nový údaj, &lt;br /&gt;
* int x - hodnota, ktorú budeme do zoznamu ''z'' vkladať.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna.&lt;br /&gt;
&lt;br /&gt;
Princíp vkladania vkladania nového prvku je opísaný v kapitole [[#Vkladanie nového prvku do usporiadaného zoznamu]]. V nasledujúcom texte bude vysvetlená len implementácia v jazyku C. &lt;br /&gt;
*riadok 7-8 : vkladanie do prázdneho zoznamu&lt;br /&gt;
*riadok 9-30 : vkladanie do neprázdneho zoznamu&lt;br /&gt;
**riadok 10: hodnota x &amp;lt;nowiki&amp;gt;&amp;lt;&amp;lt;/nowiki&amp;gt; hodnota prvého prvku zoznamu. Nový prvok bude vložený na začiatok zoznamu.&lt;br /&gt;
**riadok 16-20: hodnota x &amp;lt;nowiki&amp;gt;&amp;gt;&amp;lt;/nowiki&amp;gt; hodnota posledného prvku zoznamu. Nový prvok bude vložený na koniec zoznamu.&lt;br /&gt;
**riadok 21-30: hodnota x menšia hodnota prvého prvku a zároveň menšia ako hodnota posledného prvku&lt;br /&gt;
***riadok 23: 2 pomocné smerníky p1 a p2. p1 ukazuje na prvý prvok (''p1=z.prvy''), p2 ukazuje na druhý prvok zoznamu (''p2=z.prvy-&amp;lt;nowiki&amp;gt;&amp;gt;&amp;lt;/nowiki&amp;gt;dalsi'')&lt;br /&gt;
***riadok 24: v cykle while hľadáme také miesto kde neplatí, že hodnota x je väčšia ako hodnota prvku p2. V prípade, ak platí že &amp;lt;nowiki&amp;gt;x&amp;gt;p2-&amp;gt;data&amp;lt;/nowiki&amp;gt;, tak smerníky p1 a p2 posunieme o jedno miesto z zozname ďalej (riadok 25 a 26).&lt;br /&gt;
*** Po skončení cyklu while platí že hodnota prvku x je menšia ako hodnota dátovej časti prvku p2. Našli sme teda miesto, kde budeme prvok ''novy'' vkladať. Nový prvok vložíme medzi prvky p1 a p2.&lt;br /&gt;
*** riadok 28-29: vloženie nového prvku medzi prvky p1 a p2.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void Vloz(TZoznam &amp;amp;z, int x)  // vlozi prvok zotriedene&lt;br /&gt;
{&lt;br /&gt;
   TPrvok *novy = new TPrvok;&lt;br /&gt;
   novy-&amp;gt;data = x;&lt;br /&gt;
   novy-&amp;gt;dalsi = NULL;&lt;br /&gt;
&lt;br /&gt;
   if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
      z.prvy = z.posledny = novy;&lt;br /&gt;
   else 	// v zozname je nejaky prvok&lt;br /&gt;
      if (x &amp;lt; z.prvy-&amp;gt;data)  // ak je x &amp;lt; ako hodnota prveho 	  &lt;br /&gt;
      {		// prvku vlozim novy prvok na zaciatok&lt;br /&gt;
         novy-&amp;gt;dalsi = z.prvy;&lt;br /&gt;
         z.prvy = novy;&lt;br /&gt;
      }&lt;br /&gt;
      else &lt;br /&gt;
         if (x &amp;gt; z.posledny-&amp;gt;data)  // x &amp;gt; ako posledny prvok zoznamu&lt;br /&gt;
         {&lt;br /&gt;
            z.posledny-&amp;gt;dalsi = novy;&lt;br /&gt;
            z.posledny = novy;&lt;br /&gt;
         }&lt;br /&gt;
         else  // vlozenie niekde do stredu zoznamu&lt;br /&gt;
         {&lt;br /&gt;
            TPrvok *p1 = z.prvy, *p2 = z.prvy-&amp;gt;dalsi;&lt;br /&gt;
            while (p2-&amp;gt;data &amp;lt; x) // hladame miesto, kde vlozime prvok&lt;br /&gt;
            {   p1 = p2; &lt;br /&gt;
                p2 = p2-&amp;gt;dalsi; // posun o jeden prvok &lt;br /&gt;
            }&lt;br /&gt;
            p1-&amp;gt;dalsi = novy; // vlozenie noveho zaznamu 		    &lt;br /&gt;
            novy-&amp;gt;dalsi = p2; // na spravne miesto&lt;br /&gt;
         }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Vyhľadanie prvku v lineárnom zozname===&lt;br /&gt;
Vo funkcii ''hladaj'' budeme v zozname hľadať prvok s danou hodnotou.&lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
* TZoznam z - lineárny zoznam, v ktorom budeme vyhľadávať&lt;br /&gt;
* int x - hodnota, ktorú budeme v zozname ''z'' hľadať.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: V prípade úspechu smerník na nájdený prvok. V prípade neúspechu NULL.&lt;br /&gt;
&lt;br /&gt;
Princíp funkcie o opísaný v kapitole [[#Prechod cez lineárny zoznam|Prechod cez lineárny zoznam]].&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
TPrvok* hladaj(TZoznam z, int x)&lt;br /&gt;
{&lt;br /&gt;
  TPrvok *p = z.prvy;  // pomocny prvok typu TPrvok&lt;br /&gt;
  while (p != NULL) // opakuj, pokial neprides na koniec zoznamu&lt;br /&gt;
  {&lt;br /&gt;
    if (p-&amp;gt;data == x) return p;	  // ak sa prvok nasiel&lt;br /&gt;
    p = p-&amp;gt;dalsi;	// chod na dalsi prvok zoznamu&lt;br /&gt;
  }&lt;br /&gt;
  return NULL; // ak si nic nenasiel, vrat 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Výpis prvkov lineárneho zoznamu===&lt;br /&gt;
Vo funkcii ''vypis'' budeme vypisovať postupne všetky prvku lineárneho zoznamu.&lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
* TZoznam z - lineárny zoznam, ktorého prvky budeme vypisovať&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna&lt;br /&gt;
&lt;br /&gt;
Princíp funkcie o opísaný v kapitole [[#Prechod cez lineárny zoznam|Prechod cez lineárny zoznam]].&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int JePrazdny(TZoznam z)&lt;br /&gt;
{ // ak je zoznam prazdny, funkcia vrati 1, inak 0&lt;br /&gt;
  return z.prvy == NULL;&lt;br /&gt;
}&lt;br /&gt;
void vypis(TZoznam z)&lt;br /&gt;
{&lt;br /&gt;
  if (JePrazdny(z)) return;  // ak je zoznam prazdny, skonci&lt;br /&gt;
  TPrvok *p = z.prvy;  // pomocny prvok typu TPrvok&lt;br /&gt;
  while (p-&amp;gt;dalsi != NULL) // prechádzaj cez vsetky prvky&lt;br /&gt;
  {&lt;br /&gt;
    cout &amp;lt;&amp;lt; p-&amp;gt;data &amp;lt;&amp;lt; &amp;quot;, &amp;quot;;  // vypis datovu cast prvku&lt;br /&gt;
    p = p-&amp;gt;dalsi;	// chod na dalsi prvok&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; p-&amp;gt;data &amp;lt;&amp;lt; endl; // vypis posledny prvok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Zmazanie prvého prvku zoznamu===&lt;br /&gt;
Vo funkcii ''ZmazPrvy'' budeme mazať prvý prvok zoznamu. Po zmazaní musia mať smerníky ''prvy'' a ''posledny'' zoznamu ''z'' aktuálne hodnoty.&lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
* TZoznam &amp;amp;z - odkaz na lineárny zoznam, v ktorom budeme mazať prvý prvok.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna&lt;br /&gt;
&lt;br /&gt;
Na riadku 4 je vytvorený pomocný smerník, ktorý bude mať hodnotu prvého prvku zoznamu. Ako prvé je potrebné nastaviť smerník ''prvy'' zoznamu ''z'' (''z.prvy'') na prvok, ktorý bude po zmazaní prvého prvku zoznamu nový prvý prvok. Toto je vlastne druhý prvok zoznamu (''&amp;lt;nowiki&amp;gt;p-&amp;gt;dalsi&amp;lt;/nowiki&amp;gt;''). Na koniec (riadok 6) treba zmazať prvý prvok.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void ZmazPrvy(TZoznam &amp;amp;z)&lt;br /&gt;
{  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
    return;&lt;br /&gt;
   TPrvok *p=z.prvy;&lt;br /&gt;
   z.prvy=p-&amp;gt;dalsi;&lt;br /&gt;
   delete p;&lt;br /&gt;
}		&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zmazanie posledného prvku zoznamu===&lt;br /&gt;
Vo funkcii ''ZmazPosledny'' budeme mazať posledný prvok zoznamu. Po zmazaní musia mať smerníky ''prvy'' a ''posledny'' zoznamu ''z'' aktuálne hodnoty.&lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
* TZoznam &amp;amp;z - odkaz na lineárny zoznam, v ktorom budeme mazať prvý prvok.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna&lt;br /&gt;
&lt;br /&gt;
*riadok 2: zoznam je prázdny. Funkcia skončí&lt;br /&gt;
*riadok 5: v zozname je len jeden prvok. Po jeho zmazaní bude zoznam prázdny.&lt;br /&gt;
*riadok 11: v zozname je viac ako 1 prvok. Po zmazaní posledného prvku bude nový posledný prvok ten, ktorý bol v pôvodnom zozname predposledný.&lt;br /&gt;
** Hľadanie predposledného prvku: riadok 11 a 12. Predposledný prvok je taký prvok p, pre ktorý platí:&lt;br /&gt;
***''&amp;lt;nowiki&amp;gt;p-&amp;gt;dalsi&amp;lt;/nowiki&amp;gt;'' je posledný prvok zoznamu. Vieme, že posledný prvok zoznamu má hodnotu smerníka dalsi NULL. Preto ak platí výraz &amp;lt;nowiki&amp;gt;p-&amp;gt;dalsi-&amp;gt;dalsi == NULL&amp;lt;/nowiki&amp;gt;, tak potom je prvok p predposledný.&lt;br /&gt;
***Ak sme našli predposledný prvok, tak môžeme zmazať posledný prvok (riadok 13)&lt;br /&gt;
***Prvok ''p'' sa stane posledným prvkom. Posledný prvok má hodnotu smerníka ''dalsi'' NULL (riadok 14)&lt;br /&gt;
***Prvok ''p'' nastavíme ako posledný prvok zoznamu ''z'' (riadok 15).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void ZmazPosledny(TZoznam &amp;amp;z)&lt;br /&gt;
{  if (z.prvy == NULL)  // prazdny zoznam&lt;br /&gt;
    return;&lt;br /&gt;
  TPrvok *p = z.prvy;&lt;br /&gt;
  if (p-&amp;gt;dalsi == NULL)  // je len jeden prvok&lt;br /&gt;
  { delete p;&lt;br /&gt;
    z.prvy = z.posledny= NULL;  // upravime strukturu z&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  // najdeme predposledny prvok&lt;br /&gt;
  while (p-&amp;gt;dalsi-&amp;gt;dalsi != NULL)&lt;br /&gt;
    p = p-&amp;gt;dalsi;&lt;br /&gt;
  delete p-&amp;gt;dalsi;	// zmazeme posledny&lt;br /&gt;
  p-&amp;gt;dalsi = NULL;  // a nastavime NULL na aktualny posledny prvok&lt;br /&gt;
  z.posledny = p;  //upravime zoznam tak, aby ukazoval spravne na&lt;br /&gt;
}			  // posledny prvok&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Zmazanie lineárneho zoznamu===&lt;br /&gt;
Vo funkcii ''Zmaz'' budeme mazať všetky prvky zoznamu. &lt;br /&gt;
&lt;br /&gt;
Parametre funkcie:&lt;br /&gt;
* TZoznam &amp;amp;z - odkaz na lineárny zoznam, ktorého prvky budeme mazať.&lt;br /&gt;
&lt;br /&gt;
Návratová hodnota: žiadna&lt;br /&gt;
&lt;br /&gt;
Je jedno, či budeme mazať zoznam od začiatku, alebo od konca. Implementácia mazania Zmaz2 je ale efektívnejšia pretože zložitosť funkcie ''ZmazPrvy'' je O(1) a zložitosť funkcie ''ZmazPosledny'' je O(n).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Zmaz(TZoznam &amp;amp;z)&lt;br /&gt;
{ &lt;br /&gt;
  while (!JePrazdny(z)) // pokial je v zozname nejaky prvok&lt;br /&gt;
    ZmazPosledny(z); // zmaze posledny prvok&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Zmaz2(TZoznam &amp;amp;z)&lt;br /&gt;
{ &lt;br /&gt;
  while (!JePrazdny(z)) // pokial je v zozname nejaky prvok&lt;br /&gt;
    ZmazPrvy(z); // zmaze prvy prvok&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Použitie lineárneho zoznamu v programe===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void main()&lt;br /&gt;
{ TZoznam zoznam;&lt;br /&gt;
  zoznam.prvy =NULL;&lt;br /&gt;
  zoznam.posledny = NULL;&lt;br /&gt;
  int udaj,n=4; //pocet zaznamov&lt;br /&gt;
  for(int i=0;i&amp;lt;n;i++)&lt;br /&gt;
  {   cin&amp;gt;&amp;gt;udaj;&lt;br /&gt;
	 Vloz_z(zoznam, udaj);&lt;br /&gt;
  }&lt;br /&gt;
  for(int i=0;i&amp;lt;n;i++)&lt;br /&gt;
  {   cin&amp;gt;&amp;gt;udaj;&lt;br /&gt;
	 Vloz_k(zoznam, udaj);&lt;br /&gt;
  }&lt;br /&gt;
  vypis(zoznam);&lt;br /&gt;
  Zmaz(zoznam);&lt;br /&gt;
  &lt;br /&gt;
  for(int i=0;i&amp;lt;n;i++)&lt;br /&gt;
  {   cin&amp;gt;&amp;gt;udaj;&lt;br /&gt;
	 Vloz(zoznam, udaj);&lt;br /&gt;
  }&lt;br /&gt;
  vypis(zoznam);&lt;br /&gt;
  Zmaz(zoznam);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jehro77</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Rekurzia_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=2761</id>
		<title>Rekurzia (riešené príklady)</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Rekurzia_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=2761"/>
		<updated>2010-03-20T11:08:26Z</updated>

		<summary type="html">&lt;p&gt;Jehro77: /* Tretie riešenie - viac optimalizované */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
[[Kategória:jazyk C]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie (zbierka úloh)}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Prevod čísel z 10-vej sústavy==&lt;br /&gt;
'''Zadanie'''&lt;br /&gt;
&lt;br /&gt;
Zostavte program, ktorý bude prevádzať prirodzené čísla do ľubovoľných číselných sústav so základom Z&amp;lt;10, využitím rekurzívnej funkcie. Túto funkciu postupne zdokonaľujte:&lt;br /&gt;
#Funkciu vylepšite, aby vedela prevádzať aj do sústav so základom Z&amp;lt;=16.&lt;br /&gt;
#Upravte funkciu tak, aby vedela prevádzať všetky celé čísla (čiže aj záporné a nulu).&lt;br /&gt;
#Pokúste sa funkciu obohatiť o prevod reálnych čísel (čiže aj desatinných).&lt;br /&gt;
V programe načítajte 2 vstupné údaje: číslo N v 10-vej sústave a základ novej sústavy z.&lt;br /&gt;
&lt;br /&gt;
'''Vzorové príklady'''&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
!vstup&lt;br /&gt;
!&lt;br /&gt;
!výstup&lt;br /&gt;
|-&lt;br /&gt;
|80 2 &lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|1010000&lt;br /&gt;
|-&lt;br /&gt;
|93 16&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|5D&lt;br /&gt;
|-&lt;br /&gt;
|0 8&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|0 &lt;br /&gt;
|-&lt;br /&gt;
| -74 4&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
| -1022&lt;br /&gt;
|-&lt;br /&gt;
|3.141592654 16&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
|3.243F6A8A48AA&lt;br /&gt;
|-&lt;br /&gt;
| -0.1 2&lt;br /&gt;
| -&amp;gt;&lt;br /&gt;
| -0.0001100110011001100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Je vhodné začať jednoduchou funkciou na prevod prirodzeného čísla. Ak máme základ cieľovej sústavy z&amp;lt;10, môžeme problém vyjadriť aj rekurentným vzťahom v matematickom tvare: P(n, z) = P(n/z, z) * 10 + n%z (pre n &amp;gt; 0), a teda by bolo možné vytvoriť funkciu, ktorej návratovou hodnotou by bolo celé číslo.&lt;br /&gt;
&lt;br /&gt;
V prípade, že uvažujeme o vyššom základe, vo výsledku sa objavia aj symboly A, B, C, ...  funkcia by už musela výsledok vracať vo forme reťazca. Pre zjednodušenie nám stačí funkcia, ktorá bude výsledok priamo vypisovať. Je treba si uvedomiť, ako sa počíta prevod čísla – číslo vydelíme základom sústavy, tento podiel prevedieme a za ním bude nasledovať zvyšok po pôvodnom delení.&lt;br /&gt;
&lt;br /&gt;
Na vypísanie zvyšku pre vyššie sústavy by sme mohli pre zvyšky väčšie ako 9 použiť aj inkrementáciu znakového typu: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
cout &amp;lt;&amp;lt; char (‘A’ + n%z – 10);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keďže základ sústavy sa počas celého prevodu samozrejme nemení, nemá význam v každom volaní funkcie vytvárať jeho kópiu v podobe vstupnej premennej, ale stačí nám referencia (ušetrí sa pár bajtíkov pri každom vnorení).&lt;br /&gt;
&lt;br /&gt;
Ak chceme, aby funkcia dokázala prevádzať aj nulu a záporné čísla, musíme si pridať akúsi „úvodnú“ funkciu, ktorá ošetrí problematické situácie a až potom zavolá hlavnú rekurzívnu funkciu prevodu.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
const char znaky[] = &amp;quot;0123456789ABCDEF&amp;quot;;&lt;br /&gt;
void PrevodCele(int n, int &amp;amp;zaklad)&lt;br /&gt;
{&lt;br /&gt;
   if (n == 0) return;&lt;br /&gt;
   PrevodCele(n/zaklad, zaklad); // prevedie celu cast podielu&lt;br /&gt;
   cout &amp;lt;&amp;lt; znaky[n%zaklad]; // za tym napise zvysok&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void PrevodReal(double r, int &amp;amp;zaklad, int presnost)&lt;br /&gt;
{&lt;br /&gt;
   if (r == 0) return;&lt;br /&gt;
   r *= zaklad; // posunie o jeden rad vlavo&lt;br /&gt;
   cout &amp;lt;&amp;lt; znaky[int(r)]; // celu cast vypise&lt;br /&gt;
   PrevodReal(r - int(r), zaklad, presnost - 1); // zvysok prevedie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// uvodna funkcia na specialne pripady&lt;br /&gt;
void Prevod(double r, int zaklad, int presnost)&lt;br /&gt;
{&lt;br /&gt;
   // ak je zaporne&lt;br /&gt;
   if (r &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
      r = -r; cout &amp;lt;&amp;lt; '-';&lt;br /&gt;
   }&lt;br /&gt;
   // cela cast&lt;br /&gt;
   int n = int(r);&lt;br /&gt;
   if (n) &lt;br /&gt;
      PrevodCele(n, zaklad);&lt;br /&gt;
   else &lt;br /&gt;
      cout &amp;lt;&amp;lt; 0; // ak je nula, vypise ju&lt;br /&gt;
&lt;br /&gt;
   // desatinna cast (ak je)&lt;br /&gt;
   if (r -= n)&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; '.';&lt;br /&gt;
      PrevodReal(r, zaklad, presnost);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
   double r;&lt;br /&gt;
   int sustava;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;cislo v 10-kovej sustave: &amp;quot;; cin &amp;gt;&amp;gt; r;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;cielova sustava: &amp;quot;; cin &amp;gt;&amp;gt; sustava;&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;prevedene: &amp;quot;;&lt;br /&gt;
   Prevod(r, sustava, 6);&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Prvočísla==&lt;br /&gt;
&lt;br /&gt;
'''Zadanie:'''&lt;br /&gt;
&lt;br /&gt;
Pomocou rekurzívneho riešenia vytvorte funkciu, ktorá otestuje, či je dané číslo prvočíslo.&lt;br /&gt;
===Prvé riešenie - neoptimalizované===&lt;br /&gt;
&lt;br /&gt;
'''Analýza riešenia:'''&lt;br /&gt;
&lt;br /&gt;
Testujeme číslo n na prvočíselnosť. Číslo n budeme postupne deliť číslami od 2 až po (n-1) aby sme zistili zvyšok po delení. Pri prvom zvyšku, ktorý je rovný 0 (teda číslo z delí číslo n bezo zvyšku) funkciu ukončíme a vrátime hodnotu 0 (n nie je prvočíslo). Ak je z&amp;lt;(n-1) tak funkciu is_prime1 voláme rekurzívne a v tomto volaní zvýšime parameter z o 1. (riadok č. 8). V prípade, že neplatí rovnosť z&amp;lt;(n-1) a ani jedno číslo z intervalu &amp;lt;2,n-1&amp;gt; nedelí číslo n bezo zvyšku, vrátime hodnotu 1 (n je prvočíslo).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int is_prime1(int n, int z=2)&lt;br /&gt;
{  &lt;br /&gt;
   if((n%z)==0)&lt;br /&gt;
      return 0;&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      if(z&amp;lt;(n-1))&lt;br /&gt;
         return is_prime1(n,z+1);&lt;br /&gt;
      else&lt;br /&gt;
         return 1;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Druhé riešenie - čiastočne optimalizované===&lt;br /&gt;
Optimalizácia v tomto prípade znamená eliminovať počet delení modulo. Myšlienka nájdenia hornej hranice hodnoty premennej ''z'' z predchádzajúceho príkladu:&lt;br /&gt;
*Číslo n delíme modulo hodnotou 2. (výsledok je rôzny od 0)&lt;br /&gt;
** nemá zmysel deliť číslom ''z'' väčším ako je n/2, pretože už nám nemôže vyjsť celočíselný podiel. Výsledok takéhoto delenia bude v intervale (0,1)&lt;br /&gt;
*Číslo n delíme modulo hodnotou 3. (výsledok je rôzny od 0)&lt;br /&gt;
** nemá zmysel deliť číslom ''z'' väčším ako je n/3, pretože už nám nemôže vyjsť celočíselný podiel. Výsledok takéhoto delenia bude v intervale &amp;lt;math&amp;gt;(1,2) \cup (2,3)&amp;lt;/math&amp;gt;. Podiel nebude mať hodnotu 2, pretože v tom prípade by bolo číslo n delitelné číslom 3 bezo zvyšku.&lt;br /&gt;
*Delitel n budeme zväčšovať až pokiaľ platí &amp;lt;math&amp;gt;\frac {n}{d}&amp;gt;d&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Horná hranica hodnoty d sa dá určiť nasledovne: &amp;lt;math&amp;gt;d=\sqrt{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int is_prime2(int n, int z=2)&lt;br /&gt;
{  &lt;br /&gt;
   if((n%z)==0)&lt;br /&gt;
      return 0;&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      if(z&amp;lt;sqrt(n))&lt;br /&gt;
         return is_prime2(n,z+1);&lt;br /&gt;
      else&lt;br /&gt;
         return 1;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tretie riešenie - viac optimalizované===&lt;br /&gt;
V predchádzajúcom príklade sme delili číslo n hodnotami premennej d. Premenná d mala prvú hodnotu 2 a potom sa k nej vždy pripočítala hodnota 1. Teda, číslo n sme postupne delili hodnotami &lt;br /&gt;
 2, 3, 4, 5, 6, 7, 8, ... &amp;lt;math&amp;gt;d=\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Všimnime si, že niektoré delenia sú opäť zbytočné: &lt;br /&gt;
*ak delíme číslom 2, potom nemá zmysel deliť žiadnym jeho násobkom&lt;br /&gt;
*vo všeobecnosti platí: ak delíme číslom ''j'', potom nemá zmysel deliť žiadnym násobkom čísla ''j''.&lt;br /&gt;
&lt;br /&gt;
Inak povedané, netreba deliť žiadnom zloženým číslom. Stačí deliť prvočíslami. A tu sa dostávame k rekurzívnej definícii prvočísel:&lt;br /&gt;
&lt;br /&gt;
'''Rekurzívna definícia prvočísla''':&lt;br /&gt;
* Číslo 2 je najmenšie prvočíslo.&lt;br /&gt;
* Prvočíslo je každé celé kladné číslo, ktoré nie je deliteľné žiadnym iným menším prvočíslom ako je toto číslo samotné.&lt;br /&gt;
&lt;br /&gt;
Pri takto stanovenej podmienke je komplikovanejšie vytvoriť podmienku, ktoré by toto spĺňala. Preto skúsme napísať program, ktorý by zbytočne nedelil násobkami čísel 2 a 3.&lt;br /&gt;
Ak nechceme deliť násobkami čísla 2, tak potom budeme postupne deliť premennú n hodnotami 3,5,7,9,11,...&lt;br /&gt;
&lt;br /&gt;
Ak nechceme deliť násobkami čísla 3, tak potom budeme postupne deliť premennú n hodnotami 4,5,7,8,10,11,13,14,...&lt;br /&gt;
&lt;br /&gt;
Prienikom týchto dvoch podmienok je, že nám zostava deliť číslami 5,7,10,13,17,19, ...&lt;br /&gt;
&lt;br /&gt;
V tejto postupnosti je jednoduché pravidlo: striedavé pripočítavanie hodnoty 2 a 4. Vyjadrené aritmetickou postupnosťou:&lt;br /&gt;
*&amp;lt;math&amp;gt;d_0=2&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;d_1=3&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;d_2=5&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;d_n=d_{n-1} + 3-(-1)^{i+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int is_prime3(int n, int z,int krok)&lt;br /&gt;
{ &lt;br /&gt;
   int d=z+3+krok;&lt;br /&gt;
   if((n%d)==0)&lt;br /&gt;
      return 0;&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      if(d&amp;lt;sqrt(n))&lt;br /&gt;
         return is_prime3(n,d,-krok);&lt;br /&gt;
      else&lt;br /&gt;
         return 1;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int is_prime(int n)&lt;br /&gt;
{&lt;br /&gt;
   if((n%2)==0) return 0;&lt;br /&gt;
   if((n%3)==0) return 0;&lt;br /&gt;
   if((n%5)==0) return 0;&lt;br /&gt;
   return is_prime3(n,5,-1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Rozbor zdrojového kódu:'''&lt;br /&gt;
&lt;br /&gt;
Pre hľadanie prvočísel použijeme funkciu is_prime, ktorá otestuje číslo n na deliteľnosť číslami 2, 3 a 5. Potom zavoláme pomocnú rekurzívnu funkciu is_prime3(int n, int z,int krok) ktorá bude testovať deliteľnosť čísla n prvkami postupnosti &amp;lt;math&amp;gt;\big\{d_n\big\}&amp;lt;/math&amp;gt;. Aby sme sa vyhli zbytočným podmienkam, ktoré môžu celý algoritmus spomaliť, definujeme tretí parameter funkcie is_prime3 ''krok''. Parameter krok je v našej postupnosti výraz &amp;lt;math&amp;gt; 3-(-1)^{i+1}&amp;lt;/math&amp;gt;, avšak tu nepočítame hodnotu mocniny &amp;lt;math&amp;gt;(-1)^{i+1}&amp;lt;/math&amp;gt; ale využívame skutočnosť že tento výraz nadobúda hodnoty -1,1,-1,1, ... .&lt;br /&gt;
&lt;br /&gt;
V premennej d je vypočítaná hodnota aktuálneho deliteľa podľa vzťahu: &amp;lt;math&amp;gt;d_n=d_{n-1} + 3-(-1)^{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Riešenie s globálnym poľom===&lt;br /&gt;
Pre zjednodušenie tvorby programu si vytvorme globálne pole do ktorého uložíme prvých n prvočísel. Potom najväčšie číslo, ktoré môžeme testovať na prvočíselnosť je &amp;lt;math&amp;gt;N=n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Analýza riešenia:'''&lt;br /&gt;
&lt;br /&gt;
Testujeme číslo n na prvočíselnosť. Ako prvé vypočítame zvyšok po delení prvým prvočíslom v poli ''pcisla'' (delíme číslom pcisla[0]=2). V prípade, ak je výsledok 0, tak výpočet ukončíme a vrátime hodnotu (0 - nie je prvočíslo). V opačnom prípade rekurzívne zavoláme funkciu jePrvocislo, kde druhý parameter (má význam indexu v poli ''pcisla'') zvýšime o 1. Teda v ďalšom volaní funkcie jePrvocislo už budeme deliť číslom pcisla[1]=3. Musíme však zabezpečiť, aby hodnota pcisla[i] v riadku č. 5 existovala. To zabezpečíme tak, že rekurzívne volanie dovolíme len ak je hodnota indexu i menšia ako počet hodnôt v pole pcisla.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line &amp;gt;&lt;br /&gt;
int prvocisla[]={2,3,5,7,11,13,17,19,23,29,31,37};&lt;br /&gt;
&lt;br /&gt;
int is_prime4(int n, int i=0)&lt;br /&gt;
{ &lt;br /&gt;
  if(n%prvocisla[i]==0)&lt;br /&gt;
     return 0;&lt;br /&gt;
  if(i&amp;lt;223 &amp;amp;&amp;amp; n&amp;gt;pow(prvocisla[i],2))&lt;br /&gt;
     return is_prime4(n,i+1);&lt;br /&gt;
  else &lt;br /&gt;
     return 1;   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vzorové riešenie'''&lt;br /&gt;
&lt;br /&gt;
Uvádzame postupnosť volaní funkcie '''is_prime4(31)'''&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
|+&lt;br /&gt;
!Vnorenie&lt;br /&gt;
!Volaná funkcia&lt;br /&gt;
!prvocisla[i]&lt;br /&gt;
!n%prvocisla[i]&lt;br /&gt;
!rekurzívne volanie&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|is_prime(31,0)&lt;br /&gt;
|2&lt;br /&gt;
|31%2=1&lt;br /&gt;
|is_prime(31,1)&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|is_prime(31,1)&lt;br /&gt;
|3&lt;br /&gt;
|31%3=1&lt;br /&gt;
|is_prime(31,2)&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|is_prime(31,2)&lt;br /&gt;
|5&lt;br /&gt;
|31%5=1&lt;br /&gt;
|is_prime(31,3)&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|is_prime(31,3)&lt;br /&gt;
|7&lt;br /&gt;
|31%7=3&lt;br /&gt;
|is_prime(31,4)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| is_prime(31,4)&lt;br /&gt;
| 11&lt;br /&gt;
| n.a.&lt;br /&gt;
| neplatí podmienka n&amp;gt;prvocisla[i]^2&amp;lt;br/&amp;gt;n=31, i=4, prvocisla[i]=11&amp;lt;br/&amp;gt;funkcia vracia hodnotu '''1'''&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| návrat na is_prime(31,3)&lt;br /&gt;
| 7&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| návrat na is_prime(31,2)&lt;br /&gt;
| 5&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| návrat na is_prime(31,1)&lt;br /&gt;
| 3&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| návrat na is_prime(31,0)&lt;br /&gt;
| 2&lt;br /&gt;
| n.a.&lt;br /&gt;
| spätný rekurzívny chod&lt;br /&gt;
|}&lt;br /&gt;
====Porovnanie efektivity navrhovaných algoritmov====&lt;br /&gt;
Skôr ako budeme porovnávať ukázané algoritmy, poznamenajme, že tento spôsob zisťovania prvočíselnosti je pre veľké čísla veľmi neefektívny. Pri 8-cifernom čísle trvá výpočet funkcie is_prime približne 230 s. Pre zisťovanie prvočíselnosti existujú špeciálne algoritmy, napr. [http://en.wikipedia.org/wiki/AKS_primality_test ASK test], [http://en.wikipedia.org/wiki/Solovay%E2%80%93Strassen_primality_test Test Solovay-Strassena], [http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Test Millera-Rabina] a iné.&lt;br /&gt;
V nasledujúcej tabuľke a na obrázku sú výsledky porovnania efektívnosti týchto algoritmov pri hľadaní prvočísel na intervale (100,n) kde n sme menili od 50 000 do 2 000 000. V tabuľke ani v grafe nie je zahrnutá funkcia is_prime1, pretože pri n=100 000 pri rekurzívnom volaní funkcia neočakávane skončila.&lt;br /&gt;
Aby sme mohli porovnávať aj funkciu is_prime4, musíme do poľa ''prvocisla'' pridať všetky prvočísla, ktoré sú menšie ako &amp;lt;math&amp;gt;\sqrt{n_{max}}&amp;lt;/math&amp;gt;, kde n_max je v našom prípade 2 000 000. Pole ''prvocisla'' obsahuje prvých 233 prvočísel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int prvocisla[]={&lt;br /&gt;
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,&lt;br /&gt;
191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,&lt;br /&gt;
397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,&lt;br /&gt;
617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,&lt;br /&gt;
857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,&lt;br /&gt;
1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,&lt;br /&gt;
1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Naprogramované funkcie sme testovali nasledovne:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   clock_t start, end;&lt;br /&gt;
   double elapsed;&lt;br /&gt;
   int n;&lt;br /&gt;
   n=50000; //100000, 200000, ... 2000000&lt;br /&gt;
   start = clock();&lt;br /&gt;
   for(int i=100;i&amp;lt;n;i++)&lt;br /&gt;
      is_prime(i);   &lt;br /&gt;
   end = clock();&lt;br /&gt;
   elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;&lt;br /&gt;
   cout&amp;lt;&amp;lt;elapsed&amp;lt;&amp;lt;endl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{| class=datatable&lt;br /&gt;
|+Tabuľka nameraných časov behu funkcií&lt;br /&gt;
|-&lt;br /&gt;
!n [tisíc]	&lt;br /&gt;
!is_prime_2 t[s]	&lt;br /&gt;
!is_prime t[s]&lt;br /&gt;
!is_prime4 t[s]&lt;br /&gt;
|-&lt;br /&gt;
|50	&lt;br /&gt;
|0,16	&lt;br /&gt;
|0,086&lt;br /&gt;
|0,061&lt;br /&gt;
|-&lt;br /&gt;
|100	&lt;br /&gt;
|0,398	&lt;br /&gt;
|0,134&lt;br /&gt;
|0,126&lt;br /&gt;
|-&lt;br /&gt;
|200	&lt;br /&gt;
|1,034	&lt;br /&gt;
|0,345&lt;br /&gt;
|0,304&lt;br /&gt;
|-&lt;br /&gt;
|500	&lt;br /&gt;
|1,245	&lt;br /&gt;
|1,237&lt;br /&gt;
|0,958&lt;br /&gt;
|-&lt;br /&gt;
|1000	&lt;br /&gt;
|3,275	&lt;br /&gt;
|3,264&lt;br /&gt;
|2,349&lt;br /&gt;
|-&lt;br /&gt;
|1500	&lt;br /&gt;
|17,203	&lt;br /&gt;
|5,831&lt;br /&gt;
|3,9&lt;br /&gt;
|-&lt;br /&gt;
|2000	&lt;br /&gt;
|26	&lt;br /&gt;
|8,6&lt;br /&gt;
|5,82&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pLines ymin=0 ymax=27 colors=FF0000,00FF00,0000FF size=600x250 plots legend&amp;gt;&lt;br /&gt;
,is_prime2, is_prime, is_prime4&lt;br /&gt;
50 tis, 0.16, 0.08, 0.061&lt;br /&gt;
100 tis, 0.398, 0.134, 0.126&lt;br /&gt;
200 tis, 1.034, 0.345, 0.304&lt;br /&gt;
500 tis, 1.245, 1.237, 0.958&lt;br /&gt;
1 mil, 3.275, 3.264, 2.349&lt;br /&gt;
1.5 mil, 17.203, 5.831, 3.9&lt;br /&gt;
2 mil, 26, 8.6, 5.82&lt;br /&gt;
&amp;lt;/pLines&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Podobné časy pri nižších hodnotách n sú dané tým, že vzdialenosť susedných prvočísel je väčšia pri vyšších prvočíslach. Z grafu taktiež vidieť účinok optimalizácie algoritmu.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
*http://sk.wikipedia.org/wiki/Zoznam_prvo%C4%8D%C3%ADsiel&lt;br /&gt;
*http://www.prime-numbers.org/&lt;/div&gt;</summary>
		<author><name>Jehro77</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=%C5%A0trukt%C3%BAry_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=2724</id>
		<title>Štruktúry (riešené príklady)</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=%C5%A0trukt%C3%BAry_(rie%C5%A1en%C3%A9_pr%C3%ADklady)&amp;diff=2724"/>
		<updated>2010-03-19T18:29:06Z</updated>

		<summary type="html">&lt;p&gt;Jehro77: /* Intepreter postfixových aritmetických výrazov */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Študijné materiály]]&lt;br /&gt;
[[Kategória:Programovanie]]&lt;br /&gt;
[[Kategória:Informatika]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie (zbierka úloh)}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Štruktúra Zlomok==&lt;br /&gt;
'''Úloha:'''&lt;br /&gt;
&lt;br /&gt;
Zostavte program, ktorý pomôže pri práci so zlomkami – bude vedieť zlomok skrátiť a vypísať ho v čo najvhodnejšom tvare. Program načíta dva zlomky, každý hneď po načítaní upravene vypíše, ďalej vypíše ich súčin, súčet a podiel:&lt;br /&gt;
#Zostavte funkciu na načítanie zlomku z klávesnice a funkciu, ktorá vypíše zlomok na obrazovku v tvare „a/b“, napr. „3/4“. Postupne ju zdokonaľujte:&lt;br /&gt;
##V prípade, že zlomok má celú časť, vypíše ho v tvare „a b/c“, napr. namiesto „9/4“ bude písať „2 1/4“.&lt;br /&gt;
##V prípade, že jeho zvyšná časť je nulová, nebude ju vypisovať, napr. namiesto „6/2“ nebude písať „3 0/2“, ale iba „3“ a podobne, namiesto „0/2“ iba „0“.&lt;br /&gt;
#Vytvorte si pomocnú funkciu, ktorá zjednoduší (skráti) zlomok, napr. „36/48“ prevedie na „3/4“ a obohaťte ňou funkciu pre vypísanie zlomku (aby sa zlomok vypisoval už v zjednodušenom tvare). &lt;br /&gt;
#Zostavte funkcie, ktoré vypočítajú súčin, súčet a podiel dvoch zlomkov a použite ich v hlavnom programe.&lt;br /&gt;
&lt;br /&gt;
'''Vzorový vstup:'''&lt;br /&gt;
 5 4&lt;br /&gt;
 1 1/4&lt;br /&gt;
 6 8&lt;br /&gt;
 3/4&lt;br /&gt;
&lt;br /&gt;
'''Vzorový výstup:'''&lt;br /&gt;
 sucin: 15/16&lt;br /&gt;
 sucet: 2&lt;br /&gt;
 podiel: 1 2/3&lt;br /&gt;
&lt;br /&gt;
Cieľom je precvičiť si prácu so štruktúrou – bolo by vhodné ju v programe využiť.&lt;br /&gt;
Funkcia na načítanie zlomku môže využiť referenciu alebo štruktúru ako návratovú hodnotu. Pre krátenie zlomku môžeme využiť referenciu a pre matematické operácie so zlomkami zase návratovú hodnotu.&lt;br /&gt;
&lt;br /&gt;
Pre krátenie zlomku treba funkciu na najväčší spoločný deliteľ – použijeme Euklidov algoritmus postupného odpočítavania menšieho čísla od väčšieho a jeho zdokonalenie cez operáciu modulo.&lt;br /&gt;
Pri matematických funkciách môžeme využiť akýsi „akoby konštruktor“ na vytvorenie zlomku, no nie je to nutné.&lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream.h&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
struct TZlomok { int citatel, menovatel; };&lt;br /&gt;
void CitajZlomok(TZlomok &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
   cin &amp;gt;&amp;gt; z.citatel;&lt;br /&gt;
   cin &amp;gt;&amp;gt; z.menovatel;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int NSD(int a, int b)&lt;br /&gt;
{&lt;br /&gt;
   while (b)&lt;br /&gt;
   {&lt;br /&gt;
      int c = a % b;&lt;br /&gt;
      a = b;&lt;br /&gt;
      b = c;&lt;br /&gt;
   }&lt;br /&gt;
   return a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void SkratZlomok(TZlomok &amp;amp;z)&lt;br /&gt;
{&lt;br /&gt;
   int nsd = NSD(z.citatel, z.menovatel);&lt;br /&gt;
   z.citatel /= nsd;&lt;br /&gt;
   z.menovatel /= nsd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VypisZlomok(TZlomok z)&lt;br /&gt;
{&lt;br /&gt;
   SkratZlomok(z);&lt;br /&gt;
   int cela_cast = z.citatel / z.menovatel;&lt;br /&gt;
   if (cela_cast)&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; cela_cast;&lt;br /&gt;
      int zvysok = z.citatel % z.menovatel;&lt;br /&gt;
      if (zvysok) cout &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; zvysok &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; z.menovatel;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      cout &amp;lt;&amp;lt; z.citatel;&lt;br /&gt;
      if (z.citatel) // ak je nula, napise len ju a nie napr. 0/1&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;/&amp;quot; &amp;lt;&amp;lt; z.menovatel;&lt;br /&gt;
   }&lt;br /&gt;
   cout &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok Zlomok(int cit, int men)&lt;br /&gt;
{&lt;br /&gt;
   TZlomok z;&lt;br /&gt;
   z.citatel = cit;&lt;br /&gt;
   z.menovatel = men;&lt;br /&gt;
   SkratZlomok(z);&lt;br /&gt;
   return z;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok SucinZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.citatel, z1.menovatel * z2.menovatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok SucetZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.menovatel + z2.citatel * z1.menovatel,&lt;br /&gt;
   z1.menovatel * z2.menovatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
TZlomok PodielZlomkov(TZlomok z1, TZlomok z2)&lt;br /&gt;
{&lt;br /&gt;
   return Zlomok(z1.citatel * z2.menovatel, z1.menovatel * z2.citatel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
   TZlomok z1, z2;&lt;br /&gt;
   CitajZlomok(z1); VypisZlomok(z1);&lt;br /&gt;
   CitajZlomok(z2); VypisZlomok(z2);&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;sucin: &amp;quot;; VypisZlomok(SucinZlomkov(z1, z2));&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;sucet: &amp;quot;; VypisZlomok(SucetZlomkov(z1, z2));&lt;br /&gt;
   cout &amp;lt;&amp;lt; &amp;quot;podiel: &amp;quot;; VypisZlomok(PodielZlomkov(z1, z2));&lt;br /&gt;
   getch();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zásobník - pamäť typu LIFO==&lt;br /&gt;
===Intepreter postfixových aritmetických výrazov===&lt;br /&gt;
'''Zadanie:'''&lt;br /&gt;
&lt;br /&gt;
Vytvorte program v jazyku C, ktorý po spustení načíta od používateľa postfixový aritmetický výraz, vyhodnotí ho, vypíše jeho hodnotu do konzoly (na monitor) a skončí. &lt;br /&gt;
&lt;br /&gt;
'''Analýza:'''&lt;br /&gt;
&lt;br /&gt;
V postfixovom aritmetickom výraze sa operátor zapisuje vždy po svojich dvoch operandoch, ako to môžeme vidieť v nasledujúcom takomto výraze&lt;br /&gt;
 5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
ktorý má  hodnotu 2075.&lt;br /&gt;
Každý infixový  aritmetický výraz, môže byť prepísaný na postfixový. Infixová verzia uvedeného postfixového výrazu je nasledovná:&lt;br /&gt;
 5 * ( ( (9 + 8) * (4 * 6) ) + 7)&lt;br /&gt;
a tá má samozrejme po vyhodnotení rovnakú hodnotu 2075.&lt;br /&gt;
&lt;br /&gt;
Pomocou abstraktného dátového typu (ADT) zásobníka sa dajú veľmi dobre vyhodnocovať  práve postfixové aritmetické výrazy. Každý operátor si z vrcholu zásobníka načíta svoje dva operandy a po vykonaní operácie na nich vráti jej výsledok namiesto týchto dvoch operandov na vrchol zásobníka (využitie princípu dátovej štruktúry typu LIFO). Nasledujúci obrázok demonštruje tento jednoduchý princíp na vyhodnocovaní vyššie uvedeného postfixového aritmetického výrazu.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=wikitable&lt;br /&gt;
|+ Spracovanie postfixového výrazu 5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
|-&lt;br /&gt;
!index v pamati zásobníka&amp;lt;hr/&amp;gt;číslo kroku&lt;br /&gt;
! 0&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
! 4&lt;br /&gt;
! operácia&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 5&lt;br /&gt;
| 9&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 5&lt;br /&gt;
| 9&lt;br /&gt;
| 8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 8+9&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 4&lt;br /&gt;
| 6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 6 * 4&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 5&lt;br /&gt;
| 17&lt;br /&gt;
| 24&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 24*17&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| 5&lt;br /&gt;
| 408&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 5&lt;br /&gt;
| 408&lt;br /&gt;
| 7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| 5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 408 + 7&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 5&lt;br /&gt;
| 415&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| 415 * 5&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2075&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
Tabuľka ukazuje použitie zásobníka reprezentovaného celočíselným poľom (zasobnik.pamat[ ]) pre vyhodnotenie postfixového výrazu 5 9 8 + 4 6 * * 7 + * uloženého v znakovom poli (vyraz[ ]). Tento výraz postupne prechádzame zľava doprava. Ak narazíme na znak reprezentujúci číslo, vložíme ho na vrchol zásobníka (zasobnik.pamat[zasobnik.vrchol]), ak narazíme na znak reprezentujúci operátor, potom vyberieme z vrcholu zásobníka 2 operandy, aplikujeme na ne operátor a namiesto týchto dvoch operandov vložíme na vrchol zásobníka výsledok samotnej operácie. &lt;br /&gt;
Na reprezentáciu zásobníka použijeme štruktúru LIFO. Pre základné operácie so zásobníkom, vloženie položky na vrchol zásobníka a vybratie položky z jeho vrcholu, si vytvoríme dve funkcie:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  stav zasobnika push(LIFO &amp;amp;zasobnik, int x);&lt;br /&gt;
  int pop(LIFO &amp;amp;zasobnik); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Príklad vstupu do programu:'''&lt;br /&gt;
&lt;br /&gt;
5 9 8 + 4 6 * * 7 + *&lt;br /&gt;
&lt;br /&gt;
'''Príklad výstupu z programu:'''&lt;br /&gt;
&lt;br /&gt;
2075 &lt;br /&gt;
&lt;br /&gt;
'''Možné riešenie:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include&amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
#define MAX_PAMAT 40 &lt;br /&gt;
&lt;br /&gt;
enum stav_zasobnika{OK=-1, FULL=-2, EMPTY=-3}; &lt;br /&gt;
&lt;br /&gt;
struct LIFO&lt;br /&gt;
{&lt;br /&gt;
      int pamat[MAX_PAMAT]; //pole reprezentujuce ADT zasobnik&lt;br /&gt;
      int vrchol; //index vrcholu zasobnika, indexova premenna&lt;br /&gt;
&lt;br /&gt;
}; &lt;br /&gt;
&lt;br /&gt;
//VLOZI novu polozku 'x' do pola 'zasobnik.pamat' (do zasobnika) a zvacsi indexovu premennu //'zasobnik.vrchol' o 1&lt;br /&gt;
stav_zasobnika push(LIFO &amp;amp;zasobnik, int x)&lt;br /&gt;
{&lt;br /&gt;
      if(zasobnik.vrchol&amp;lt;MAX_PAMAT)&lt;br /&gt;
            zasobnik.pamat[zasobnik.vrchol++]=x;&lt;br /&gt;
      else&lt;br /&gt;
            return FULL;&lt;br /&gt;
      return OK;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
//zmensi indexovu premennu 'zasobnik.vrchol' o 1 a VYBERIE poslednu vlozenu polozku z pola //'zasobnik.pamat' (zo zasobnika)&lt;br /&gt;
int pop(LIFO &amp;amp;zasobnik)&lt;br /&gt;
{&lt;br /&gt;
      if(zasobnik.vrchol&amp;gt;0)&lt;br /&gt;
            return zasobnik.pamat[--zasobnik.vrchol];&lt;br /&gt;
      else&lt;br /&gt;
            return EMPTY;&lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
      LIFO f; //deklaracia strukturovej premennej typu 'LIFO' reprezentujucej zasobnik&lt;br /&gt;
      f.vrchol=0;&lt;br /&gt;
      int X, i;&lt;br /&gt;
      char vyraz[40];&lt;br /&gt;
&lt;br /&gt;
      //cout&amp;lt;&amp;lt;&amp;quot;Vlozte postfixovy vyraz na vyhodnotenie:\n&amp;quot;;&lt;br /&gt;
      cin.getline(vyraz,39)&lt;br /&gt;
&lt;br /&gt;
      X=(int)strlen(vyraz); //v 'X' je dlzka nacitaneho retazca zo standardneho vstupu &lt;br /&gt;
      //v cykle 'for' prechadzame vstupny vyraz ulozeny v poli 'vyraz' zlava doprava. Ak narazime na znak&lt;br /&gt;
      //reprezentujuci cislo, vlozime ho na vrchol zasobnika ('f.pamat[f.vrchol]'), ak narazime na znak&lt;br /&gt;
      //reprezentujuci operator, potom vyberieme z vrcholu zasobnika 2 operandy, aplikujeme na ne&lt;br /&gt;
      //operator a namiesto tychto dvoch operandov vlozime na vrchol zasobnika vysledok samotnej&lt;br /&gt;
      //operacie&lt;br /&gt;
&lt;br /&gt;
      for(i=0; i&amp;lt;X; i++)&lt;br /&gt;
      {&lt;br /&gt;
            if (vyraz[i]=='+')&lt;br /&gt;
                  push(f, (pop(f) + pop(f)));&lt;br /&gt;
            if (vyraz[i]=='*')&lt;br /&gt;
                  push(f, (pop(f) * pop(f)));&lt;br /&gt;
            if ((vyraz[i]&amp;gt;='0') &amp;amp;&amp;amp; (vyraz[i]&amp;lt;='9'))&lt;br /&gt;
                  push(f, 0);&lt;br /&gt;
&lt;br /&gt;
            //vlozenie cisla (v datovom type 'int') reprezentovaneho jednym alebo viacerymi znakmi v poli&lt;br /&gt;
            //'a' na vrchol zasobnika&lt;br /&gt;
            while ((vyraz[i]&amp;gt;='0') &amp;amp;&amp;amp; (vyraz[i]&amp;lt;='9'))&lt;br /&gt;
                  push(f, (10 * pop(f) + (vyraz[i++] - '0')));&lt;br /&gt;
            //obsluzenie //ziskanie cisla typu 'int' reprezentovaneho&lt;br /&gt;
            //viaccifernych cis. //znakom ulozenym v 'a[i]' a zvascsenie 'i' o 1&lt;br /&gt;
            //pre posun na dalsiu iteraciu cyklu 'while'&lt;br /&gt;
     }&lt;br /&gt;
      //na vrchole zasobnika je uz vysledok vyhodnoteneho postfixoveho aritmetickeho vyrazu, takze ho&lt;br /&gt;
      //vypiseme&lt;br /&gt;
      cout&amp;lt;&amp;lt;pop(f); &lt;br /&gt;
      return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jehro77</name></author>
		
	</entry>
</feed>