Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0
Wiki Markup
h3. Esimerkit

{anchor:esim1}

*Esimerkki 1:*

Aiheet: [Luokka|Luokka], [olion|Oliot] luonti sekä [jäsenmuuttujien|Jäsenmuuttujat] ja [metodien|Luokan jäsenfunktiot] käsittely.

_Tietokone.h:_
{code}

Esimerkit

...

Esimerkki 1:

Aiheet: Luokka, olion luonti sekä jäsenmuuttujien ja metodien käsittely.

Tietokone.h:

Code Block
class Tietokone
{
private:
    int ProsessoriLkm;
    int Muisti;

public:
    void TulostaTiedot();
    void AsetaProsessoriLkm(int);
};
{code}
_Tietokone.cpp:

...

_
{code
}
#include <stdio.h>
#include "Tietokone.h"

void Tietokone::TulostaTiedot()
{
    printf("Tietokoneessa on %d prosessoria ja %d muistia\n", ProsessoriLkm, Muisti);
}

void Tietokone::AsetaProsessoriLkm(int p)
{
    ProsessoriLkm = p;
}
{code}
_main.cpp:

...

_
{code
}
#include "Tietokone.h"

int main()
{
    Tietokone pc; // Tietokone = luokka, pc = olio

    pc.AsetaProsessoriLkm(2);

    pc.TulostaTiedot();
}
{code}
Harjoitus 1:

...



Aiheet: [Luokka|Luokka], [olion|Oliot] luonti sekä [jäsenmuuttujien|Jäsenmuuttujat] ja metodien käsittely.

...



Elain.h:

...


{code
}
class CElain
{
private:   // privaatti, vain luokan sisällä voidaan muuttaa
    char m_Nimi[100];      // Eläimen nimi
    float m_Massa;         // Eläimen massa, paino
    void TulostaNimi();    // Tulostaa ruudulle eläimen nimen
    void TulostaMassa();   // Tulostaa ruudulle eläimen massan

public:   // julkinen, kaikki voi kutsua
    CElain(char Nimi[], float Massa);   // Muodostin, parametreina Nimi ja Massa
    bool AsetaNimi(char Nimi[]);        // Asettaa eläimen nimen
    bool AsetaMassa(float Massa);       // Asettaa eläimen massan
    void Tulosta();
};
{code}
Elain.cpp:

...


{code
}
#include "Elain.h"    // CElain-luokan headeri

CElain::CElain(char Nimi[], float Massa)
{
    strcpy(m_Nimi, Nimi);&nbsp;  // Kopioidaan nimi luokkaan
    m_Massa = Massa;
}

bool CElain::AsetaNimi(char Nimi[])
{
    strcpy(m_Nimi, Nimi);   // Kopioidaan nimi luokkaan
    return true;
}

void CElain::TulostaNimi()
{
    printf("Eläimen nimi on %s\n", m_Nimi);
}

bool CElain::AsetaMassa(float Massa)
{
    m_Massa = Massa;
    return true;
}

void CElain::TulostaMassa()
{
    printf("Eläimen massa on %.2f kiloa\n", m_Massa);
}

void CElain::Tulosta()
{
    TulostaNimi();
    TulostaMassa();
}
{code}
main.cpp:

...


{code
}
#include "Elain.h"

int main(int argc, char* argv[])
{
    CElain kissa("miuku", 2.4);   // Luodaan olio CElain luokasta ja annetaan nimi ja massa parametreina

    kissa.Tulosta();

    return 0;
}

...

Harjoitus 2:

Aiheet: Periytyminen.

{code}
{anchor:harj2}

Harjoitus 2:

Aiheet: [Periytyminen].

Elain.h:

...


{code
}
#include <stdio.h>
#include <string.h>

class CElain
{
private: // privaatti, vain luokan sisällä voidaan muuttaa
    char m_Nimi[100];    // Eläimen nimi
    float m_Massa;       // Eläimen massa, paino

    void TulostaNimi();  // Tulostaa ruudulle eläimen nimen
    void TulostaMassa(); // Tulostaa ruudulle eläimen massan

public: // julkinen, kaikki voi kutsua
    bool AsetaNimi(char Nimi[]);  // Asettaa eläimen nimen
    bool AsetaMassa(float Massa); // Asettaa eläimen massan
    void Tulosta();
};
{code}
Elain.cpp:

...


{code
}
#include "Elain.h"     //  CElain-luokan headeri

bool CElain::AsetaNimi(char Nimi[])
{
    strcpy(m_Nimi, Nimi); // Kopioidaan nimi luokkaan
    return true;
}

void CElain::TulostaNimi()
{
    printf("Eläimen nimi on %s\n", m_Nimi);
}

bool CElain::AsetaMassa(float Massa)
{
    m_Massa = Massa;
    return true;
}

void CElain::TulostaMassa()
{
    printf("Eläimen massa on %.2f kiloa\n", m_Massa);
}

void CElain::Tulosta()
{
    TulostaNimi();
    TulostaMassa();
}
{code}
Kissa.h:

...


{code
}
#include "Elain.h"

class CKissa :
    public CElain
{
public:
    CKissa(void);
    ~CKissa(void);
    void Kehraa();
};
{code}
Kissa.cpp:

...


{code
}
#include "Kissa.h"

CKissa::CKissa(void)
{
}

CKissa::~CKissa(void)
{
}

void CKissa::Kehraa()
{
    printf("Kehraa...");
}
{code}
main.cpp:

...


{code
}
#include <stdio.h>
#include <conio.h>
#include "Kissa.h"

int main()
{
    CKissa kissa;

    kissa.AsetaNimi("Miuku");
    kissa.AsetaMassa(1.2);
    kissa.Tulosta();
    kissa.Kehraa();

    getch();

    return 0;
}

...

Harjoitus 3:

Aiheet: Tulostaminen cin ja cout ja käyttäjän syötteen lukeminen cin ja cout -olioilla.

main.cpp:

Code Block
{code}
{anchor:harj3}

Harjoitus 3:

Aiheet: Tulostaminen [cin ja cout|cout] ja  käyttäjän syötteen lukeminen [cin ja cout|cin] \-olioilla.

main.cpp:
{code}
#include <iostream>
#include <string>

using namespace std;

int main()
{
    int Luku1, Luku2;
    char Operaattori;
    char Nimi[100];

    cout << "Anna nimesi: ";
    cin >> Nimi;

    cout << "Anna 1. luku: ";
    cin >> Luku1;

    cout << "Anna 2. luku: ";
    cin >> Luku2;

    cout << "Anna operaattori: + - * / ";
    cin >> Operaattori;

    cout << "Hei " << Nimi << ", annoit laskutoimituksen: " <<  Luku1 << " " << Operaattori << " " << Luku2 << endl;

    return 0;
}

...

Harjoitus 4:

...

{code}
{anchor:harj4}

Harjoitus 4:

Aiheet: Const-määritteet.

...



main.cpp:

...



{code
}
#include "Luokka.h"

int main()
{
    const CLuokka luokka;
    luokka.YmpyranKeha(1.2467);

    CLuokka luokka2;
    luokka2.YmpyranKeha(283947);
    luokka2.TeeJotain();
}
{code}
Luokka.h:

...



{code
}
class CLuokka
{
private:
    const float m_Pii; // const tarkoittaa vakiota. Arvo ei voi muuttua ohjelman ajon aikana
    int m_Luku;

public:
    CLuokka();
    float YmpyranKeha(const float r) const; // Parametri on const, arvo ei voi muuttua funktion sisällä
    void TeeJotain();
};
{code}
Luokka.cpp:

...

Code Block



{code}
#include "Luokka.h"

CLuokka::CLuokka() :
    m_Pii(3.14)
{
    m_Luku = 0;
}

float CLuokka::YmpyranKeha(const float r) const
{
    return&nbsp;2*m_Pii*r;
}

void CLuokka::TeeJotain()
{
    m_Luku = 2;
}
{code}
Harjoitus 5:

...



Aiheet: Funktioiden ylikuormitus.

...



main.cpp:

...



\#include <cstdio>

...


\#include

...

 <cstring>

class CElain
\{
private: // saatavissa vain luokan metodeilla
&nbsp;&nbsp;&nbsp; char m_Nimi\[100\];
&nbsp;&nbsp;&nbsp; float m_Massa;

...



public: // voidaan käyttää luokan ulkopuolelta
&nbsp;&nbsp;&nbsp; bool AsetaTiedot(char Nimi\[\], float Massa); // 'Alkuperäinen  metodi'
&nbsp;&nbsp;&nbsp; bool AsetaTiedot(char Nimi\[\]); // 1. Ylikirjoitettu metodi
&nbsp;&nbsp;&nbsp; bool AsetaTiedot(float Massa); // 2. ylikirjoitettu metodi
};

...



bool CElain::AsetaTiedot(char Nimi\[\], float Massa)
\{
&nbsp;&nbsp;&nbsp; printf("AsetaTiedot(char\[\], float)\n");
&nbsp;&nbsp;&nbsp; AsetaTiedot(Nimi);
&nbsp;&nbsp;&nbsp; AsetaTiedot(Massa);
&nbsp;&nbsp;&nbsp; return true;
}

...



bool CElain::AsetaTiedot(char Nimi\[\])
\{
&nbsp;&nbsp;&nbsp; printf("AsetaTiedot(char\[\])\n");
&nbsp;&nbsp;&nbsp; strcpy(m_Nimi, Nimi);
&nbsp;&nbsp;&nbsp; return true;
}

...



bool CElain::AsetaTiedot(float Massa)

...


\{
&nbsp;&nbsp;&nbsp; printf("AsetaTiedot(float)\n");

...


&nbsp;&nbsp;&nbsp; m_Massa = Massa;

...


&nbsp;&nbsp;&nbsp; return true;

...


}

...



int main()

...


\{
&nbsp;&nbsp;&nbsp; CElain kissa;

&nbsp;&nbsp;&nbsp; kissa.AsetaTiedot("Miuku", 2.4); // kutsuu metodia  AsetaTiedot(char Nimi\[\], float Massa)
&nbsp;&nbsp;&nbsp; kissa.AsetaTiedot("Mauku");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // kutsuu metodia  AsetaTiedot(char Nimi\[\])
&nbsp;&nbsp;&nbsp; kissa.AsetaTiedot(2.4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // kutsuu metodia  AsetaTiedot(float Massa)
}

...



Harjoitus 6, 7, 8:

...



Aihe: osoittimet  .

...


float-tyyppisen muuttujan tulostaminen osoittimen avulla.#include <iostream>

...



using namespace std;

...



int main()

...


\{
&nbsp;&nbsp;&nbsp; float a = 3.1475;

...


&nbsp;&nbsp;&nbsp; float b = 0.001;

...


&nbsp;&nbsp;&nbsp; float\* p;

&nbsp;&nbsp;&nbsp; p = &a;
&nbsp;&nbsp;&nbsp; cout << "*p = " << (*p) << endl

...

;

&nbsp;&nbsp;&nbsp; p = &b;
&nbsp;&nbsp;&nbsp; cout << "*p = " << (*p) << endl;

...


}

...


Merkkijonon tulostaminen osoittimien avulla.

...


1. tapa on 'normaali' merkkijonon tulostaminen.

...


2. tapa tulostaa merkin kerrallaan hakasulkujen avulla.

...


3. tapa tulostaa merkkijonon osoitinta kasvattamalla.

...


\#include <iostream>

...



using namespace std;

...



int main()
\{
&nbsp;&nbsp;&nbsp; char mjono\[\]="Tämä on merkkijono"

...

;

&nbsp;&nbsp;&nbsp; // 1. tapa tulostaa

...

 merkkijono
&nbsp;&nbsp;&nbsp; cout << "mjono = " << mjono << endl;

&nbsp;&nbsp;&nbsp; // 2. tapa tulostaa merkkijono
&nbsp;&nbsp;&nbsp; cout << "mjono = ";
&nbsp;&nbsp;&nbsp; for (int i=0; i<strlen(mjono); i++)
\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout << mjono\[i\]; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; cout << endl;
&nbsp;&nbsp;&nbsp; // 3. tapa tulostaa merkkijono
&nbsp;&nbsp;&nbsp; cout << "mjono = ";
&nbsp;&nbsp;&nbsp; for (char\* p = mjono; p < mjono+strlen(mjono); p++)
\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout << (*p); &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; cout << endl;
}
Osoitin funktion parametrina.
f():ssä tehdyt muutokset eivät näy main():iin.
f2():ssa tehdyt taas näkyvät.
\#include <iostream>
using namespace std;

...



void f(int a)

...


\{
&nbsp;&nbsp;&nbsp; a = \-7;
}

void f2(int\* p)

...


\{
&nbsp;&nbsp;&nbsp; \*p = \-7;

...


}

...



int main()

...


\{
&nbsp;&nbsp;&nbsp; int muut = 5;

&nbsp;&nbsp;&nbsp; f(muut);

...


&nbsp;&nbsp;&nbsp; cout << "muut = " << muut << endl;

...



&nbsp;&nbsp;&nbsp; f2(&muut)

...

;
&nbsp;&nbsp;&nbsp; cout << "muut = " << muut << endl;
}
Kertaustehtävä 1

\-Tehkää luokka, jossa on pari muuttujaa, asetus\- ja tulostusfunktiot.
\-Luokaa luokasta olio main():ssa, sekä   vakio-osoitin, jonka pistätte osoittamaan luotuun olioon.

...


\-Kutsukaa luokan funktioita osoittimen kautta.

...



Kertaustehtävä 2

...



\-Luokaa luokka, jossa on vakio jäsenmuuttuja.

...


\-Alustakaa jäsenmuuttuja muodostimen initialisointilistassa, mutta  tuokaa alustettava arvo muodostimen parametrina.

...


\-Varmistakaa että annettu arvo tosiaan välittyy vakiomuuttujalle.

...



Kertaustehtävä 3

...



\-Luokaa luokka, joka koostuu toisesta luokasta.

...


\-Tehkää molempiin luokkiin parametrillinen muodostin.

...


\-Viekää main():sta arvo koostavalle luokalle, joka puolestaan  välitetään koostettavalle luokalle.

...


\-Huom. koostettavan luokan muodostinta pitää kutsua koostavan luokan  initialisointilistassa\!

...



Kertaustehtävä 4

...



\-Luokaa kaksi luokkaa joista toinen perii toisen.

...


\-Luokaa vanhempaan   vakio aito virtuaalifunktio.

...


\-Toteuttakaa perillisessä tämä funktio.

...


\-Luokaa main():ssa olio perillisestä.

...


\-Luokaa main():ssa vanhempi luokan tyyppinen vakio-osoitin, jonka  kautta kutsutte virtuaalifunktiota.

...



----
Linkitetty lista (Linked list)

...



Linkitetty lista on yksi perustietorakenteista. Se koostuu joukosta  solmuja, joista jokainen koostuu linkitettävästä tiedosta ja viitteistä  seuraavaan (ja mahdollisesti edelliseen) solmuun listassa. Yhden  viitteen

...

 listaa kutsutaan&nbsp; yksisuuntaiseksi ja jälkimmäistä  kaksisuuntaiseksi. Haluttaessa löytää tietty solmu, tulee aloittaa  listan alusta, juurisolmusta (root node), ja käydä listaa läpi, kunnes  haluttu solmu on löytynyt. Linkitetyn listan etuna on rajoittamaton  kasvu (ei staattisesti määriteltyä maksimikokoa) ja O(1)-tason lisäys ja poisto-operaatiot (kun käytetään  kaksisuuntaista linkitettyä listaa). Indeksointi on O

...

(n) .

Esimerkki 1. Solmun koodirunko.

...


class CSolmu

...



\{ public:

...



&nbsp;&nbsp;&nbsp; CSolmu\* Seuraava()

...

;

&nbsp;&nbsp;&nbsp; void AsetaSeuraava();

...



protected:

...

 &nbsp;&nbsp;&nbsp; CSolmu\* m_Seuraava

...

; &nbsp;  //   Osoitin seuraavaan solmuun.

...



&nbsp;&nbsp;&nbsp;&nbsp;CSolmu\* m_Edellinen;   // Osoitin edelliseen

...

    CData* m_Data;       // Osoitin listan 'dataan' eli siihen mitä listaan tallennetaan.

};

...

 solmuun. &nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp; CData\* m_Data;   &nbsp; &nbsp; &nbsp; // Osoitin listan 'dataan' eli siihen mitä listaan tallennetaan.

};

Varoitus: Koodit toimivat vain Windows-ympäristössä\!
// Solmu.h: interface for the Solmu class.
// Solmu-luokka huolehtii tiedon järjestyksestä
// sekä tiedon hausta tiedostosta ja talletuksesta tiedostoon
//////////////////////////////////////////////////////////////////////

...


\#include "Tyontekija.h"

...


\#ifndef h_Solmu

...


\#define h_Solmu

...



class CSolmu

...



\{ public:

...

   void Talleta();           // tiedon talletus levylle

   void Tulosta();           // tulostus ruudulle

   void Lisaa(CSolmu*);      // solmun lisäys oikeaan kohtaan

...

 &nbsp;&nbsp;&nbsp; int HaeTiedostosta();

&nbsp;&nbsp; void 

...

Talleta(); &nbsp; &nbsp; &nbsp;

...

   CTyontekija* AnnaTyontekija() const;

   CSolmu* AnnaSeuraava() const;

   void AsetaSeuraava(CSolmu*);

   CSolmu(CTyontekija*);

  ~CSolmu(); private:

   CSolmu* m_pSeuraava;

   CTyontekija* m_pTyontekija;

};
#endif
Lähdetiedosto solmulle on seuraava: // Solmu.cpp: implementation of the Solmu class.
//
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include "Tyontekija.h"
#include "Solmu.h"
void Menu(void);
int Debug=1;

// CSolmun muodostin
CSolmu::CSolmu(CTyontekija* Tt)
{     m_pTyontekija=Tt;     m_pSeuraava=NULL;

}

// CSolmun tuhoajafunktio
CSolmu::~CSolmu()
{     printf("\nPoistetaan tyontekija");

    getch();

    delete m_pTyontekija;

    m_pTyontekija=0;

    printf("\nAion poistaa solmun");   

  //delete m_pSeuraava;     //m_pSeuraava=0;

}

// Laitetaan seuraavaksi solmuksi listaan

...

 &nbsp; &nbsp;   // tiedon talletus levylle

&nbsp;&nbsp; void Tulosta(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;   // tulostus ruudulle

&nbsp;&nbsp; void Lisaa(CSolmu*);&nbsp; &nbsp; &nbsp;   // solmun lisäys oikeaan kohtaan

&nbsp;&nbsp; void Poista(char Nimi\[\]); &nbsp;&nbsp;&nbsp;

&nbsp;&nbsp; CTyontekija\* AnnaTyontekija() const;

&nbsp;&nbsp; CSolmu\* AnnaSeuraava() const;

&nbsp;&nbsp; void AsetaSeuraava(CSolmu*);

&nbsp;&nbsp; CSolmu(CTyontekija*);

&nbsp; \~CSolmu();  private:

&nbsp;&nbsp; CSolmu\* m_pSeuraava;

&nbsp;&nbsp; CTyontekija\* m_pTyontekija;

};
\#endif
Lähdetiedosto solmulle on seuraava: // Solmu.cpp: implementation of the Solmu class.
//
//////////////////////////////////////////////////////////////////////
\#include <stdio.h>
\#include <stdlib.h>
\#include <conio.h>
\#include <string.h>
\#include "Tyontekija.h"
\#include "Solmu.h"
void Menu(void);
int Debug=1;

// CSolmun muodostin
CSolmu::CSolmu(CTyontekija\* Tt)
\{ &nbsp;&nbsp;&nbsp; 

...

m_pTyontekija=Tt; &nbsp;&nbsp;&nbsp; 

...

m_pSeuraava=NULL;

}

// CSolmun tuhoajafunktio
CSolmu::~CSolmu()
\{ &nbsp;&nbsp;&nbsp; 

...

printf("\nPoistetaan tyontekija");

&nbsp;&nbsp;&nbsp; 

...

getch();

&nbsp;&nbsp;&nbsp; delete m_pTyontekija;

&nbsp;&nbsp;&nbsp; m_

...

pTyontekija=

...

0;

&nbsp;&nbsp;&nbsp; printf("\nAion poistaa solmun"); &nbsp;&nbsp;

&nbsp; 

...

//delete m_pSeuraava; &nbsp;&nbsp;&nbsp; 

...

else {
        pSeuraavanNimi=m_pSeuraava->AnnaTyontekija()->KysyNimi(SeuraavanNimi);
        pUusiNimi=UusiSolmu->AnnaTyontekija()->KysyNimi(UusiNimi);
        pTamanNimi=m_pTyontekija->KysyNimi(TamanNimi); // Tarkistetaanko, sopiiko solmu nykyisen ja seuraavan väliin
        if (strcmp(pUusiNimi,pTamanNimi)>0 && strcmp(pSeuraavanNimi,pUusiNimi)>0)
{             UusiSolmu->AsetaSeuraava(m_pSeuraava);

            m_pSeuraava=UusiSolmu;

            if (Debug==1)

{                 printf("\nTama %s Uusi %s Seuraava %s",

                pTamanNimi,pUusiNimi,pSeuraavanNimi);             

...

//m_pSeuraava=0;

}

// Laitetaan seuraavaksi solmuksi listaan

void CSolmu::AsetaSeuraava(CSolmu\* solmu)
\{ &nbsp;&nbsp;&nbsp; m_pSeuraava=solmu; }
CSolmu\* CSolmu::AnnaSeuraava() const
\{ &nbsp;&nbsp;&nbsp; return m_pSeuraava; }
CTyontekija\* CSolmu::AnnaTyontekija() const
\{ &nbsp;&nbsp;&nbsp; return m_pTyontekija; }
// Uuden solmun lisäys listaan
void CSolmu::Lisaa(CSolmu\* UusiSolmu)
\{
&nbsp;&nbsp;&nbsp; 

...

char UusiNimi\[100\];
&nbsp;&nbsp;&nbsp; char\* pUusiNimi;
&nbsp;&nbsp;&nbsp; char TamanNimi\[100\];
&nbsp;&nbsp;&nbsp; 

...

char\* pTamanNimi;
&nbsp;&nbsp;&nbsp; char SeuraavanNimi\[100\];
&nbsp;&nbsp;&nbsp; 

...

char\* pSeuraavanNimi;
&nbsp;&nbsp;&nbsp;

...

 

...

char Nimi\[100\]

...

;
&nbsp;&nbsp;&nbsp; 

...

if 

...

    CSolmu* pTemp;

    CSolmu* pTemp2;

    if (m_pSeuraava)

...

(\!m_pSeuraava) \{
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_pSeuraava=UusiSolmu;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (Debug==1)

...


\{printf("\

...

nLaitan viimeideksi %s",  m_pSeuraava->AnnaTyontekija()->KysyNimi(

...

Nimi));

...

                }
else
{m_pSeuraava=0;

                }

return;
                }
        if (m_pSeuraava)
{m_pSeuraava->Poista(Nimi);

        }
    }

else
{printf("\nNimea ei loydy tietokannasta Paina enter");

getch();

...

}
&nbsp;&nbsp;&nbsp; }

else \{
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 

...

 pSeuraavanNimi=m_pSeuraava->AnnaTyontekija()->KysyNimi(SeuraavanNimi);
&nbsp;&nbsp;&nbsp; 

...

    if (m_pTyontekija->KysyNimi(Nimi) > 0)

{printf("\nTyontekija %s", m_pTyontekija->KysyNimi(Nimi));

    }

    if (m_pSeuraava)
{m_pSeuraava->Tulosta(); // Rekursiivinen kutsu

    }
}
/***********************************************************
Tietokannan talletus tiedostoon
************************************************************/
void CSolmu::Talleta()
{     FILE* pTiedosto;

    int iLukum;

    CSolmu *pTemp=0;

...

&nbsp;&nbsp;&nbsp; pUusiNimi=UusiSolmu->AnnaTyontekija()->KysyNimi(UusiNimi);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pTamanNimi=m_pTyontekija->KysyNimi(TamanNimi); // Tarkistetaanko, sopiiko solmu nykyisen ja seuraavan väliin
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (strcmp(pUusiNimi,pTamanNimi)>0 &&  strcmp(pSeuraavanNimi,pUusiNimi)>0)
\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 

...

    char* pSeuraavanNimi;

    pTemp=this;

    pTiedosto=fopen("Tiedot.oma","wb");

    if (pTiedosto==NULL)

{printf("\nTiedosto ei aukea");

        getch();    

}
    do
{         if (pTemp->m_pSeuraava)

{             iLukum=fwrite(pTemp->m_pSeuraava->m_pTyontekija, sizeof(CTyontekija),1,pTiedosto);

           if(Debug)

{                 pSeuraavanNimi=pTemp->m_pSeuraava->AnnaTyontekija()->KysyNimi(SeuraavanNimi);

                printf("\nTalletettava %s",pSeuraavanNimi);    

        }
        }
        // Siirrytään tietokannassa seuraavaan kohtaan
        pTemp=pTemp->m_pSeuraava;
    }

while(pTemp);
    fclose(pTiedosto);
}
/********************************************************
Tietokannan haku tiedostosta
**********************************************************/
int CSolmu::HaeTiedostosta()
{     FILE* pTiedosto;    // Esitellään osoitin tiedostoon

    CSolmu* pSolmu=0;

    int iLukum;

    CTyontekija* pTemp; // pointteri tilavaraukselle

    CTyontekija Temp;   // tilapäisvarasto tiedostohaulle    

    // Avataan tiedosto     pTiedosto=fopen("Tiedot.oma","rb");

    if (pTiedosto==NULL)

{         printf("\nTiedosto ei aukea");

        getch();

        return 0;     }
    do
{  iLukum=fread(&Temp, sizeof(CTyontekija),1,pTiedosto); // luetaan tiedostoa yksi työntekijä kerrallaan muuttujaan Temp       

        if (iLukum) { // onnistuiko luku tiedostosta            

pTemp=new CTyontekija(); // varataan työntekijälle tila keosta                      

*pTemp=Temp;   // *:llä haetaan osoitteessa pTemp oleva muuttuja ja talletetaan siihen tiedostosta haettu tieto                     

pSolmu=new CSolmu (pTemp);   // Varataan solmulle tilaa                        

this->Lisaa(pSolmu);   // lisätään solmu tietokantaan                    

}
    } while(iLukum); // luetaan niin kauan, kun löytyy
    fclose(pTiedosto);
    return 1;
}
Työntekijälle yksinkertainen luokka:
// Tyontekija.h: interface for the CTyontekija class.
//
#ifndef h_Tyontekija
#define h_Tyontekija
class CTyontekija
{ public:

    void AsetaNimi();

...

&nbsp;&nbsp;&nbsp; UusiSolmu->AsetaSeuraava(m_pSeuraava);

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_pSeuraava=UusiSolmu;

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (Debug==1)

\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("\nTama %s Uusi %s Seuraava %s",

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTamanNimi,pUusiNimi,pSeuraavanNimi); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else
\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_pSeuraava->Lisaa(UusiSolmu);  //rekursiivinen kutsu &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }
}
void CSolmu::Poista(char Nimi\[\])
\{ &nbsp; char seNimi\[100\];

&nbsp;&nbsp;&nbsp;&nbsp;CSolmu\* pTemp;

&nbsp;&nbsp;&nbsp;&nbsp;CSolmu\* pTemp2;

&nbsp;&nbsp;&nbsp;&nbsp;if (m_pSeuraava)

\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if  (strcmp(Nimi,m_pSeuraava->AnnaTyontekija()>KysyNimi(seNimi))==0)
\{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 

...

printf("Loytyi");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

...

    CTyontekija();

    ~CTyontekija();

    CTyontekija operator=(CTyontekija T);

...

&nbsp;&nbsp;&nbsp; getch();
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pTemp=m_pSeuraava;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 

...

}
;
#endif
Tyontekijäluokka, joka liittyy linkitettyyn listaan on esitetty seuraavassa:
// Tyontekija.cpp: implementation of the CTyontekija class.
//
//////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include "Tyontekija.h"

...

&nbsp;&nbsp;&nbsp; pTemp2=m_pSeuraava->m_pSeuraava;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (Debug==1)
\{ printf("\n%s",pTemp>AnnaTyontekija()>KysyNimi(seNimi));// Tarkistetaan onko poistettavaa seuraava olemassa
if (pTemp2) &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;
printf("\n%s",pTemp2->AnnaTyontekija()->KysyNimi(seNimi));
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delete m_pSeuraava;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (pTemp2)
\{m_pSeuraava=pTemp2;  //hypätään yli

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
else
\{m_pSeuraava=0;

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }

return;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (m_pSeuraava)
\{m_pSeuraava->Poista(Nimi);

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }

else
\{printf("\nNimea ei loydy tietokannasta Paina enter");

getch();

&nbsp;&nbsp;&nbsp; }
}
// Solmun tulostus näytölle
void CSolmu::Tulosta()
\{ &nbsp;&nbsp;&nbsp; char Nimi\[100\];

&nbsp;&nbsp;&nbsp; if (m_pTyontekija->KysyNimi(Nimi) > 0)

\{printf("\nTyontekija %s", m_pTyontekija->KysyNimi(Nimi));

&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp; if (m_pSeuraava)
\{m_pSeuraava->Tulosta();   // Rekursiivinen kutsu

&nbsp;&nbsp;&nbsp; }
}
/**********************************************************\*
Tietokannan talletus tiedostoon
\************************************************************/
void CSolmu::Talleta()
\{ &nbsp;&nbsp;&nbsp; FILE\* pTiedosto;

&nbsp;&nbsp;&nbsp; int iLukum;

&nbsp;&nbsp;&nbsp; CSolmu \*pTemp=0;

&nbsp;&nbsp;&nbsp; char SeuraavanNimi\[100\];

&nbsp;&nbsp;&nbsp; char\* pSeuraavanNimi;

&nbsp;&nbsp;&nbsp; pTemp=this;

&nbsp;&nbsp;&nbsp;&nbsp;pTiedosto=fopen("Tiedot.oma","wb");

&nbsp;&nbsp;&nbsp; if (pTiedosto==NULL)

\{printf("\nTiedosto ei aukea");

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; getch(); &nbsp;&nbsp;&nbsp;

}
&nbsp;&nbsp;&nbsp; do
\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (pTemp->m_pSeuraava)

\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; iLukum=fwrite(pTemp->m_pSeuraava->m_pTyontekija,  sizeof(CTyontekija),1,pTiedosto);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(Debug)

\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;  pSeuraavanNimi=pTemp->m_pSeuraava->AnnaTyontekija()->KysyNimi(SeuraavanNimi);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("\nTalletettava %s",pSeuraavanNimi); &nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Siirrytään tietokannassa seuraavaan kohtaan
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pTemp=pTemp->m_pSeuraava;
&nbsp;&nbsp;&nbsp; }

while(pTemp);
&nbsp;&nbsp;&nbsp;&nbsp;fclose(pTiedosto);
}
/*******************************************************\*
Tietokannan haku tiedostosta
\**********************************************************/
int CSolmu::HaeTiedostosta()
\{ &nbsp;&nbsp;&nbsp; FILE\* pTiedosto; &nbsp; &nbsp;// Esitellään osoitin tiedostoon

&nbsp;&nbsp;&nbsp; CSolmu\* pSolmu=0;

&nbsp;&nbsp;&nbsp; int iLukum;

&nbsp;&nbsp;&nbsp; CTyontekija\* pTemp; // pointteri tilavaraukselle

&nbsp;&nbsp;&nbsp; CTyontekija Temp; &nbsp; // tilapäisvarasto tiedostohaulle  &nbsp;&nbsp;&nbsp;

&nbsp; &nbsp; // Avataan tiedosto &nbsp;&nbsp;&nbsp;&nbsp;pTiedosto=fopen("Tiedot.oma","rb");

&nbsp;&nbsp;&nbsp;&nbsp;if (pTiedosto==NULL)

\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("\nTiedosto ei aukea");

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; getch();

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 0; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; do
\{&nbsp; iLukum=fread(&Temp, sizeof(CTyontekija),1,pTiedosto); // luetaan tiedostoa yksi työntekijä kerrallaan muuttujaan  Temp &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (iLukum) \{ // onnistuiko luku tiedostosta &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;

pTemp=new CTyontekija(); // varataan työntekijälle tila keosta &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;

\*pTemp=Temp; &nbsp; // \*:llä haetaan osoitteessa pTemp oleva muuttuja ja talletetaan siihen tiedostosta haettu tieto &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;

pSolmu=new CSolmu (pTemp);&nbsp;&nbsp; // Varataan solmulle tilaa &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;

this->Lisaa(pSolmu);&nbsp;&nbsp; // lisätään solmu tietokantaan &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;

}
&nbsp;&nbsp;&nbsp; } while(iLukum); // luetaan niin kauan, kun löytyy
&nbsp;&nbsp;&nbsp; fclose(pTiedosto);
&nbsp;&nbsp;&nbsp; return 1;
}
Työntekijälle yksinkertainen luokka:
// Tyontekija.h: interface for the CTyontekija  class.
//
\#ifndef h_Tyontekija
\#define h_Tyontekija
class CTyontekija
\{ public:

&nbsp;&nbsp;&nbsp; void AsetaNimi();

&nbsp;&nbsp;&nbsp; void AsetaNimi(char Nimi\[\]);

&nbsp;&nbsp;&nbsp; char\* KysyNimi(char Nimi\[\]);

&nbsp;&nbsp;&nbsp; CTyontekija();

&nbsp;&nbsp;&nbsp; \~CTyontekija();

&nbsp;&nbsp;&nbsp; CTyontekija operator=(CTyontekija T);

private: &nbsp;&nbsp;&nbsp; char m_Nimi\[100\];

}
;
\#endif
Tyontekijäluokka, joka liittyy linkitettyyn listaan on esitetty  seuraavassa:
// Tyontekija.cpp: implementation of the  CTyontekija class.
//
//////////////////////////////////////////////////////////////////////
\#include <stdio.h>
\#include <stdlib.h>
\#include <conio.h>
\#include <string.h>
\#include "Tyontekija.h"
\\

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CTyontekija::CTyontekija()
\{ &nbsp;&nbsp;&nbsp; //printf("\nAnna nimi: "); &nbsp;&nbsp;&nbsp; //gets(m_Nimi); }
CTyontekija::~CTyontekija()
\{ }  void CTyontekija::AsetaNimi(char Nimi\[\])

\{ &nbsp;&nbsp;&nbsp; strcpy(m_Nimi,Nimi); }
char\* CTyontekija::KysyNimi(char Nimi\[\])
\{ &nbsp;&nbsp;&nbsp; strcpy(Nimi,m_Nimi);

&nbsp;&nbsp;&nbsp; return Nimi; }
void CTyontekija::AsetaNimi()
\{ &nbsp;&nbsp;&nbsp; printf("Anna nimi ");

&nbsp;&nbsp;&nbsp; gets(m_Nimi); }
CTyontekija CTyontekija::operator=(CTyontekija T)
\{ &nbsp;&nbsp;&nbsp; strcpy(m_Nimi,T.m_Nimi);

&nbsp;&nbsp;&nbsp; //strcpy(m_Osasto,T.m_Osasto);

&nbsp;&nbsp;&nbsp; return \*this;

}

Linkitetylle listalle on seuraavassa esitetty pääohjelma:
/***********************************************************\*
Työntekijätietokanta
Tietokanta on toteutettu linkitettynä listana
Tietokanta muodostuu solmuista, jotka on likitetty osoittimilla  toisiinsa
\*************************************************************/
\#include <stdio.h>
\#include <stdlib.h>
\#include <conio.h>
\#include <string.h>
\#include "Tyontekija.h"
\#include "Solmu.h"
void Menu();

int main()
\{ &nbsp;&nbsp;&nbsp; int Valitsin;

&nbsp;&nbsp;&nbsp; char Nimi\[100\];

&nbsp;&nbsp;&nbsp; CSolmu\* pSolmu=0;

&nbsp;&nbsp;&nbsp; int Tiedosto=0; &nbsp;&nbsp;&nbsp; // Varataan tietokannalle alkukohta

&nbsp;&nbsp;&nbsp; CTyontekija\* pTyontekija = new CTyontekija();

&nbsp;&nbsp;&nbsp; pTyontekija->AsetaNimi("aaa");

&nbsp;&nbsp;&nbsp; CSolmu\* pJuuri = new CSolmu(pTyontekija);

&nbsp;&nbsp;&nbsp; Tiedosto = pJuuri->HaeTiedostosta();   // Haetaan tiedostosta alkukohtaa seuraavat tiedot &nbsp;&nbsp;&nbsp;

while(1)

\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Menu(); Valitsin=getch();&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (Valitsin)

\{ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '0': &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(1);

// lisäys &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '1': &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

pTyontekija=new CTyontekija();

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pTyontekija->AsetaNimi();

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pSolmu=new CSolmu(pTyontekija);

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pJuuri->Lisaa(pSolmu); // lisätään duunari listaan &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

pJuuri->Talleta();

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Tulostus &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '2':

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pJuuri->Tulosta();

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;

// Poisto &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case '3':

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("Anna nimi: ");

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gets(Nimi);

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pJuuri->Poista(Nimi);

&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; pJuuri->Talleta();

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp; break;

&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default:

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; 

...

}

...

}
void Menu()
\{ &nbsp;&nbsp;&nbsp; 

...

printf("\n\n0=ohjelman lopetus");

&nbsp;&nbsp;&nbsp; 

...

    return Nimi; }
void CTyontekija::AsetaNimi()
{     printf("Anna nimi ");

    gets(m_Nimi); }
CTyontekija CTyontekija::operator=(CTyontekija T)
{     strcpy(m_Nimi,T.m_Nimi);

    //strcpy(m_Osasto,T.m_Osasto);

    return *this;

}

Linkitetylle listalle on seuraavassa esitetty pääohjelma:
/************************************************************
Työntekijätietokanta
Tietokanta on toteutettu linkitettynä listana
Tietokanta muodostuu solmuista, jotka on likitetty osoittimilla toisiinsa
*************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include "Tyontekija.h"
#include "Solmu.h"
void Menu();

int main()
{     int Valitsin;

Wiki Markup
&nbsp;&nbsp;&nbsp; char Nimi\[100\];

    CSolmu* pSolmu=0;

    int Tiedosto=0;     // Varataan tietokannalle alkukohta

    CTyontekija* pTyontekija = new CTyontekija();

    pTyontekija->AsetaNimi("aaa");

    CSolmu* pJuuri = new CSolmu(pTyontekija);

    Tiedosto = pJuuri->HaeTiedostosta(); // Haetaan tiedostosta alkukohtaa seuraavat tiedot    

while(1)

{         Menu(); Valitsin=getch(); 

       switch (Valitsin)

{             case '0':                 exit(1);

// lisäys             case '1':                                

pTyontekija=new CTyontekija();

                pTyontekija->AsetaNimi();

                pSolmu=new CSolmu(pTyontekija);

                pJuuri->Lisaa(pSolmu); // lisätään duunari listaan                                

pJuuri->Talleta();

            break;

            // Tulostus             case '2':

                                pJuuri->Tulosta();

            break;

// Poisto             case '3':

                printf("Anna nimi: ");

                gets(Nimi);

                pJuuri->Poista(Nimi);

                  pJuuri->Talleta();

                break;

                default:

            break;

        }
    }
}
void Menu()
{     printf("\n\n0=ohjelman lopetus");

    printf("\n1=Duunarin lisays tietokantaan");

    printf("\n2=Kaikkien duunarien tulostus");

    printf("\n3=Duunarin poisto tietokannasta\n\n"); }

Merkkijonot

C:n merkkijonot

C++-kieli tarjoaa string-luokan, jota voidaan käyttää merkkijonojen käsittelyyn. Sen etu C:n merkkijonoihin on, että sille ei tarvitse määritellä kokoa ja se osaa kasvaa tarvittaessa.

Esimerkki 1. string-luokan peruskäyttö:

#include <string>    // Täällä esitellään string-luokka
#include <iostream>  // Täällä esitellään cout.

using namespace std; // Otetaan std namespace käyttöön.

int main()
{     string MJono = "";                               // Tyhjä merkkijono.

    MJono = "Tämä on merkkijono";                    // Tekstin sijoitus.

    cout << "MJono: " << MJono << endl;             // Tekstin tulostus cout:lla.

    return 0; }

Tämän lisäksi string-luokka tarjoaa paljon muutakin:

Tekstin lisääminen merkkijonoon:

    MJono += ", johon on lisätty tekstiä...";       // Tekstin lisääminen loppuun.
Tekstin tulostus printf()-funktiolla:

    printf("MJono: %s\n", MJono.c_str());           // Tekstin tulostus printf():llä.
Tekstin tulostaminen merkki kerrallaan:

    for (int i=0; i<MJono.length(); i++)
{           // length() palauttaa merkkijonon pituuden.        

...

printf("\n1=Duunarin lisays tietokantaan");

&nbsp;&nbsp;&nbsp; printf("\n2=Kaikkien duunarien tulostus");

&nbsp;&nbsp;&nbsp; printf("\n3=Duunarin poisto tietokannasta\n\n"); }

----
Merkkijonot

C:n merkkijonot

C++-kieli tarjoaa&nbsp;string-luokan, jota voidaan käyttää merkkijonojen  käsittelyyn. Sen etu C:n merkkijonoihin on, että sille ei tarvitse  määritellä kokoa ja se osaa kasvaa tarvittaessa.

Esimerkki 1. string-luokan peruskäyttö:

\#include <string> &nbsp;&nbsp;   // Täällä esitellään string-luokka
\#include <iostream>&nbsp;   // Täällä   esitellään cout.

using namespace std;   // Otetaan std namespace käyttöön.

int main()
\{ &nbsp;&nbsp;&nbsp; string MJono = ""; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  // Tyhjä merkkijono.

&nbsp;&nbsp;&nbsp; MJono&nbsp;= "Tämä on merkkijono"; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;  // Tekstin sijoitus.

&nbsp;&nbsp;&nbsp; cout << "MJono: " << MJono << endl; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;   // Tekstin tulostus cout:lla.

&nbsp;&nbsp;&nbsp; return 0; }

Tämän lisäksi string-luokka tarjoaa paljon muutakin:

Tekstin lisääminen merkkijonoon:

&nbsp;&nbsp;&nbsp; MJono \+= ", johon on lisätty tekstiä..."; &nbsp; &nbsp; &nbsp;   // Tekstin lisääminen loppuun.
Tekstin tulostus printf()-funktiolla:

&nbsp;&nbsp;&nbsp; printf("MJono: %s\n", MJono.c_str()); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;   // Tekstin tulostus printf():llä.
Tekstin tulostaminen merkki kerrallaan:

&nbsp;&nbsp;&nbsp; for (int i=0; i<MJono.length(); i++)
\{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // length() palauttaa merkkijonon pituuden. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

cout << "MJono\[" << i << "\]: " << MJono\[i\] << endl;   // \[indeksi\] palauttaa indeksin osoittaman merkin, esim. MJono\[1\]  toisen merkin, jne. &nbsp;&nbsp;&nbsp; }

Tekstin vertaaminen toiseen tekstiin:
&nbsp;&nbsp;&nbsp; Ei ole sama \-vertailu:
&nbsp;&nbsp;&nbsp; if (MJono \!= "kerkko")
\{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &nbsp;  // Testataan eroaako merkkijonot. &nbsp;&nbsp;&nbsp; 

...

&nbsp;&nbsp;&nbsp; cout << "MJono ei ole sama kuin \"kerkko\""

...

 << endl; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; Onko sama \-vertailu:
&nbsp;&nbsp;&nbsp; if (MJono == "Tämä on merkkijono, johon on  lisätty tekstiä...")

...


\{   // Testataan onko merkkijonot samat.

...

 &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout << "MJono on sama kuin \"Tämä on merkkijono, johon on  lisätty tekstiä...\"" << endl;

...

 &nbsp;&nbsp;&nbsp; }