1. harjutus Ülesanded ahelloendiga ---------------------- Ahelloend on meile ennekõike vahend viitade kasutamise harjutamiseks, kuid ka vajalik hilisemaks puude ehitamiseks. Kasutatava pseudokeele kohta loe pikemast "loenditele pühendatud loengumaterjalist". Olulisema vaatame koos üle. Arutame näitena läbi ahelloendi läbimise ja uue elemendi algusse lisamise algoritmid. Proovime kirjutada algoritme järgmiste ülesannete lahendamiseks (eesmärk - mõista viitade ja ahelloendite olemust): 1. Leia ahelloendis olevate elementide arv. Trüki välja elementides olevad väärtused. 2. Moodusta ahelloend, lisades lõppu N elementi. 3. Tagasta ahelloendi esimese elemendi infovälja väärtus, kustutades elemendi ühtlasi ahelast (pinu käsk pop()). Joonista kõigepealt vajalike sammude läbimõtlemiseks!! Meie ahelloendi element koosneb kahest väljast: info ja next. Kirjutame pseudokeeles ja kasutame järgmisi tähistusi ja nimesid: - head, node, tail, current: ahelloendi elementide aadressid erinevas kontekstis (aadressi ehk viidatüüpi muutujad). - New(node): elemendi loomine ehk mälu eraldamine, aadress kirjutatakse muutujasse node - node.next, node.info: aadressil node oleva elemendi väljade next ja info sisu - = : omistamine nt current = current.next - Delete(node): aadressil node paikneva elemendi kustutamine (mitte muutuja node kustutamine!!) - NULL: null-viida ehk null-aadressi tähis Kui jõuame, vaatame ka järgmisi pinu mõistmisele suunatud ülesandeid. Ülesanne nr. 1 Rongivagunite järjekorra muutmiseks kasutatakse tupikteid, kuhu ühelt poolt saab vagunid sisselükata ja siis nad teises suunas välja tirida. Alguses on vagunite järjestus 1 2 3 4 (vagun 1 on kõige esimene tupiktee pool). Milises järjekorras tuleb push() ja pop() operatsioone kasutada, et vagunite järjekorrraks saaks 2 4 3 1? NB! Tupikteele saab sõita ühelt poolt ja välja teisele poole. Ülesanne nr. 2 Kui vagunid on alguses järjestatud 1 2 3 4 5 6, siis kas saab nad panna järjekorda 3 2 5 6 4 1 või 1 5 4 6 2 3? Kuidas? Kasuta taas operatsioone push() ja pop(). Ülesanne nr. 3 Avaldis postfiksesiruses. Teisenda avaldised postfiksesitusse, kasutades allpool kirjeldatud algoritmi: (5 * ((9 * 8) + (7 * (4 + 6)))) (2 * a) / ((a + b) * (a - c)) Teisendusalgoritm (eeldab, et avaldises on maksimaalselt sulge): tööta märkhaaval - arv kirjuta väljundisse - lahtisulgu (vasakut) ignoreeri - operaator (tehtemärk) pane pinusse - parempoolse kinnisulu leidmisel võta operaator pinust ja kirjuta väljundisse. Arvuta: 5 3 * 1 3 2 - + + 5 9 * 8 7 4 6 + * 2 1 3 * + * + * Arvutamisalgoritm: tööta märkhaaval - kui on arv, pane pinusse - kui on operaator, võta pinust 2 arvu, tee operaatorile vastav tehe ja kirjuta vastus pinusse.