#include #include "pisteet.h" #include "piste.h" ostream &operator<<(ostream &os,const cPisteet &p) { p.tulosta(os); return os;} cPisteet::cPisteet(int imax) { lkm = 0; maxlkm = imax; pisteet = new cPiste *[maxlkm]; // pisteet = (cPiste **)calloc(maxlkm,sizeof(cPiste *)); if ( pisteet == NULL ) maxlkm = 0; } int cPisteet::etsi_paikka( // L”ytynyt paikka tai lkm jos ei l”ydy const cPiste &p //i Etsitt„v„ piste ) const // Luottaa siihen ett„ taulukko on j„rjestyksess„ ja etsii sen kohdan // josta l”ytyy p:t„ suurempi tai yht„suuri alkio, eli sen kohdan johon // p pit„sisi lis„t„ jos se halutaan lis„t„ j„rjestyksess„ // Jos yksik„„n alkio ei t„yt„ ehtoa, palautetaan lkm { int i; for (i=0; in; i--) pisteet[i] = pisteet[i-1]; pisteet[n] = NULL; lkm++; // samalla taulukon koko kasvoi } #if 0 int cPisteet::lisaa(const cPiste &p) // Lis„„ loppuun // 0. jos ei mahu pois // 1. luodaan kopio // 2. laitetaan osoitin uuteen alkioon // 3. lis„t„„n lkm { cPiste *uusi; if ( maxlkm <= lkm ) return 1; uusi = new cPiste(p); // 1. if ( !uusi ) return 2; // Jollei saatu muistia uutta varten! pisteet[lkm] = uusi; // 2. lkm++; // 3. return 0; } #else int cPisteet::lisaa(const cPiste &p) // Lis„t„„n oikealle paikalleen // 0. jos ei mahu pois // 0.5 etsit„„n paikka // 0.6 jos paikassa sama alkio, niin pois (ei dublikaatteja) // 1. luodaan kopio (jos pystyt„„n) // 1.5 tehd„„n reik„ uutta varten taulukkoon (loppuosa eteenp„in) // 2. laitetaan osoitin uuteen alkioon { cPiste *uusi; if ( maxlkm <= lkm ) return 1; int i = etsi_paikka(p); // 0.5 if ( i != lkm && p.vertaa(*pisteet[i]) == 0 ) return 3; // 0.6 uusi = new cPiste(p); // 1. if ( !uusi ) return 2; tee_reika(i); // 1.5 - lis„„ samalla lukum„„r„„! pisteet[i] = uusi; // 2. return 0; } #endif void cPisteet::tulosta(ostream &os) const { int i; for (i=0; i