ZPRO cvičení 9 Martin Flusser Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague December 15, 2016
Outline I 1 Outline 2 Struktura 3 Struktury cv 4 Lineární spojový seznam 5 Lineární spojový seznam cvičení 6 Domácí úkol 7 Zdroje
Struktura Umožní spojit několik datových typů do jednoho a pracovat s nimi jako s celkem Na jistý typ úloh velmi potřebné Nejčastěji deklarujeme nad main, případně do extra souborů
Ukázka 1 // Deklarace 2 struct clovek 3 { 4 char jmeno [10]; 5 int vek ; 6 double vyska ; 7 };
Ukázka 1 // Deklarace 2 struct clovek 3 { 4 char jmeno [10]; 5 int vek ; 6 double vyska ; 7 }; 1 // Inicializace 2 clovek ales = 3 { 4 " Ales ", // jmeno 5 22, // vek 6 11. 49 // vyska 7 };
Ukázka 1 // Pristup 2 cout << ales. vek ;
Dynamicka alokace struktury 1 clovek * uk_clovek = new clovek ; 2 zkopiruj ( uk_clovek -> jmeno," Tom "); 3 uk_clovek -> vek =30; 4 uk_clovek -> vyska =1.56;
Pole struktur 1 lide holky_ z_ kruhu [ 3]; // Vytvori pole 2 holky_ z_ kruhu [ 0]. vek ; // Pristup k polozkam
Struktury cv 1 Warm up: Vytvořte vlastní strukturu člověk, naplňte (stačí v kódu) a vypište do konzloe. 2 Zopakujte to samé, ale použijte dynamickou alokaci 3 Vytvořte pole struktur, naplňte a vypište. 4 Bonus: použijte cyklus pro naplnění i vypsání většího pole struktur. 5 Bonus: Napište funkci pro vypsání dynamicky alokované strktury
cv1 1 struct clovek 2 { 3 char jmeno [30]; 4 int vek ; 5 double vyska ; 6 }; 1 clovek martin = 2 { 3 " Martin ", 18, 2.05 4 }; 5 6 cout << " Jmeno : " << martin. jmeno << endl ; 7 cout <<" Vek : " << martin. vek << endl ; 8 cout <<" Vyska " << martin. vyska << endl < < endl ;
pomocna funkce Není naplní cvičení, jen zkopírujte 1 // http :// www. sallyx. org / sally /c/ c15. php 2 3 void zkopiruj ( char *v1, char *v2) 4 { 5 size_ t i = 0; 6 do { 7 v1[i] = v2[i]; 8 } while (v2[i ++]); 9 }
cv2 1 clovek * uk_clovek = new clovek ; 2 zkopiruj ( uk_clovek -> jmeno," Tom "); 3 uk_clovek -> vek =30; 4 uk_clovek -> vyska =1.56; 5 6 cout << " Jmeno : " << uk_clovek -> jmeno << endl ; 7 cout <<" Vek : " << uk_ clovek - > vek << endl ; 8 cout <<" Vyska " << uk_ clovek - > vyska << endl << en 9 10 delete uk_clovek ;
cv3 1 // vytvareni pole struktur 2 clovek borci [ 3]; 3 borci [ 0] = martin ; // pouziju z predchoziho 4 5 zkopiruj ( borci [1]. jmeno," Martinuv_druhej_kamos "); 6 borci [1]. vek =19; 7 borci [1]. vyska =2.10; 8 9 zkopiruj ( borci [2]. jmeno," Martinuv_kamos "); 10 borci [2]. vek =20; 11 borci [2]. vyska =1.89;
cv3 1 // vypis vsech 2 cout << " Vypis celeho pole :" << endl << endl ; 3 for ( int i = 0; i <=2; i ++) 4 { 5 cout << " Jmeno : " << borci [i]. jmeno << endl ; 6 cout <<" Vek : " << borci [i]. vek << endl ; 7 cout <<" Vyska " << borci [ i]. vyska << endl << 8 }
Lineární spojový seznam Dynamická datová struktura Vhodná i pro uchování většího počtu dat Lze zvětšovat podobně jako dynamicky alokované pole z minulé hodiny
Lineární spojový seznam Dynamická datová struktura Vhodná i pro uchování většího počtu dat Lze zvětšovat podobně jako dynamicky alokované pole z minulé hodiny Narozdíl od pole se... při přidání nemusí manipulovat s už existujícími záznamy pro přístup k některému prvku musí prohledat velká část záznamů
Realizace 1 struct node { 2 int x; 3 node * next ; 4 }; 5... 6 int main () 7 { 8 node * root ; 9...
Přidávání prvků 1 node * root ; 2 node * last ; 3 4 // pridani prvniho prvku 5 root = last = new node ; 6 root -> next = NULL ; 7 root ->x = 5; 8 9 // pridani dalsiho 10 last -> next = new node ; 11 last =last -> next ; 12 last -> next = NULL ; 13 last ->x =8;
Lineární spojový seznam cvičení 1 Vytvořte svůj malý seznam a přidejte pár záznamů 2 Vytvořte kód na výpis prvků 3 Bonus: Vytvořte kód na úplné smazání seznamu 4 Bonus: Napište kód na přidávání na začátek seznamu
cv1 1 struct node 2 { 3 int x; 4 node * next ; 5 };
cv1 1 node * root ; 2 node * last ; 3 4 // pridani prvniho prvku 5 root = last = new node ; 6 root -> next = NULL ; 7 root ->x = 5; 8 9 // pridani dalsiho 10 last -> next = new node ; 11 last =last -> next ; 12 last -> next = NULL ; 13 last ->x =8; 14...
cv2 1 // vypis 2 for ( node *it= root ; it!= NULL ;it=it -> next ) 3 cout << it ->x << endl ;
Domácí úkol 1 Dobře si rozmyslete mechanizmus spojového seznamu 2 kód na přidání dalšího prvku a výpisu obalte do funkcí 3 Když máme funkce na přidání a výpis, má chování programu podobné vlastnosti jako na minulém cvičení. Obalte ho do stejného UI. 4 mazání zatím nemusíte řešit.
Zdorje 1 http :// www. sallyx. org / sally /c/ c15. php 2 http :// programujte. com / clanek /2005041409 -c-5 - lekc 3 http :// www. cprogramming. com / tutorial / lesson15. htm