struct info { typedef struct InfoT { char firstname[20]; char firstname[20]; char lastname[20]; char lastname[20]; int age; int age;

Samankaltaiset tiedostot
Sisältö. C-ohjelmointi Luento 6: tietueet ja joukot Tiina Niklander. Tietueet (struct) Määrittely Rakenne Käyttö

ltö C-ohjelmointi Luento 6: tietueet ja joukot Tietueet (struct( struct) Lueteltu tyyppi (enum( enum) Union Linkitetty lista

Sisältö. Tietue - Määrittely. Tietueet (struct) Tietue - Rakenne. Tietue - Käyttö. C-ohjelmointi Luento 6: tietueet ja joukot

ltö Tietue - Rakenne C-ohjelmointi Luento 6: tietueet ja joukot muistialue. viittausten yksinkertaistamiseksi kenttien

Lyhyt kertaus osoittimista

TIETORAKENTEET JA ALGORITMIT

Tietueet. Tietueiden määrittely

Rakenteiset tietotyypit Moniulotteiset taulukot

A TIETORAKENTEET JA ALGORITMIT

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Sisältö. C-ohjelmointi Luento 5: Osoittimet. Keko (heap) Pino (stack) Muistinhallinta Java vs C. Prosessin rakenne

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

18. Abstraktit tietotyypit 18.1

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Ohjelmoinnin peruskurssien laaja oppimäärä

Algoritmit 1. Luento 4 Ke Timo Männikkö

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

Tietorakenteet ja algoritmit

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Listarakenne (ArrayList-luokka)

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Algoritmit 2. Luento 2 To Timo Männikkö

C-ohjelmointi: Osoittimet

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Algoritmit 1. Luento 6 Ke Timo Männikkö

C-ohjelmointi, syksy 2006

C-ohjelmointi, syksy Yksiulotteiset taulukot Moniulotteiset taulukot Dynaamiset taulukot. Binääritiedostot. Luento

Loppukurssin järjestelyt C:n edistyneet piirteet

7. Oliot ja viitteet 7.1

Ohjelmoinnin perusteet Y Python

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Luennon sisältö. Taulukot (arrays) (Müldnerin kirjan luku 10) Yksiulotteiset taulukot. Mikä taulukko on? Taulukko-osoitin. tavallinen osoitin

Olio-ohjelmointi Syntaksikokoelma

Osoitin ja viittaus C++:ssa

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

ITKP102 Ohjelmointi 1 (6 op)

Jakso 4 Aliohjelmien toteutus

3. Binääripuu, Java-toteutus

Muuttujien roolit Kiintoarvo cin >> r;

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 4 Aliohjelmien toteutus

Dynaaminen muisti. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät 2017.

Algoritmit 1. Demot Timo Männikkö

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

Tieto- ja tallennusrakenteet

Jakso 4 Aliohjelmien toteutus

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

Java-kielen perusteet

Taulukot. Jukka Harju, Jukka Juslin

ITKP102 Ohjelmointi 1 (6 op)

Loppukurssin järjestelyt

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Harjoitus 4 (viikko 47)

Dynaaminen muisti Rakenteiset tietotyypit

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Metodien tekeminen Javalla

Algoritmit 2. Luento 2 Ke Timo Männikkö

Ohjelmoinnin perusteet Y Python

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Rakenne. C-ohjelmointi: Tietorakenteita ja tyyppejä. Tyyppimuunnoksia aritmeettisten tyyppien välillä. Tyyppimuunnokset. & (bitti and) Bittioperaatiot

2. Perustietorakenteet

C-ohjelmointi Luento 5: Osoittimet Tiina Niklander

Sisältö. 2. Taulukot. Yleistä. Yleistä

Algoritmit 2. Luento 7 Ti Timo Männikkö

C-ohjelmointi Luento 5: Osoittimet

#include <stdio.h> // io-toiminnot. //#define KM_MAILISSA int main( ){

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Jakso 4 Aliohjelmien toteutus

Algoritmit 1. Demot Timo Männikkö

Java-kielen perusteet

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Sisältö. 22. Taulukot. Yleistä. Yleistä

2. Olio-ohjelmoinista lyhyesti 2.1

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Java kahdessa tunnissa. Jyry Suvilehto

Java-kielen perusteet

Ohjelmoinnin peruskurssien laaja oppimäärä

4. Olio-ohjelmoinista lyhyesti 4.1

Osa VII. Mitä mallit ovat ja kuinka niitä käytetään Miksi mallit tarjoavat paremman vaihtoehdon makroille Kuinka luokkamalleja luodaan

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

ITKP102 Ohjelmointi 1 (6 op)

// // whiledemov1.c // #include <stdio.h> int main(void){ int luku1 = -1; int luku2 = -1;

Transkriptio:

C-ohjelmointi Luento 6: tietueet ja joukot Viikko 4 1

Sisältö Tietueet (struct) Määrittely Rakenne Käyttö Lueteltu tyyppi (enum) Union Määrittely Rakenne Käyttö Linkitetty lista 2

Tietueet (struct) Tietueessa voi olla vain datakenttiä (vrt. luokka) Tietueen kentät voivat olla keskenään erilaisia. Kenttiä ei voi piilottaa, vaan ne kaikki näkyvät (vrt. public). Ajatellaan hetkinen Javan luokkatoteutusta Pikkuvarasto (A.Wiklan Java-kurssi). Tällä luokalla on metodi vievarastoon. Metodikutsu x.vievarastoon(y) koskettaa kahta oliota: This, tässä x ja y, joka välitettiin parametrina C:ssä voi vastaavaa toimintaa jäljitellä, mutta tuo this on välitettävä funktiolle parametrina, joten C:ssä vastaava funktio olisi muotoa vievarastoon(x,y); 3

Tietue - Määrittely struct info { char firstname[20]; char lastname[20]; int age; ; struct info i1, i2; typedef struct InfoT { char firstname[20]; char lastname[20]; int age; InfoT; InfoT p1; Suositeltavin tapa Tietueen kenttiin viitataan muodolla nimi.kenttänimi: p1.age = 18; printf("%s\n", n", i2.firstname); struct info { char firstname[20]; char lastname[20]; int age; k1, k2; 4

Tietue - Rakenne Tietueelle varataan yhtenäinen muistialue. Kuitenkin muistialueen koko voi olla eri kuin kenttien yhteenlasketut koot, koska viittausten yksinkertaistamiseksi kenttien välejä saatetaan jättää käyttämättä. Esim: sizeof(infot) >= 40*sizeof(char)+sizeof(int) 5

Tietue - Käyttö InfoT i1, i2; Tietueen sijoittaminen toiselle i1 = i2 kopioi tietueen sisällön bitti kerrallaan täsmälleen samanlaisena, mutta ei seuraa kentissä mahdollisesti olevia osoittimia. Tietueita EI voi verrata suoraan: i1 == i2 vaan vertailu on tehtävä itse: strcmp(i1.firstname, i2.firstname) == 0 && strcmp(i1.lastname, i2.lastname) == 0 && i1.age == i2.age 6

Sisäkkäiset tietueet Tietueen kenttinä voi olla myös tietueita e1: info: firstname: lastname: age: salary: e1.info.age = 21; e1.salary = 125.6; typedef struct { char firstname[20]; char lastname[20]; int age; InfoT; typedef struct { InfoT info; double salary; EmployeeT; EmployeeT e1; 7

Osoitin tietueeseen Tietueita käsitellään usein osoitinmuuttujan kautta: (*p).x tai p->x typedef struct pair { double x; double y; PairT, *PairTP; PairT x; PairTP p; PairT w; PairTP q; PairTP p = &w; if((q = malloc(sizeof(pairt))) == NULL) if((q = malloc(sizeof(struct pair))) == NULL) w.x = 2; p->x = 1; (*p).x = 1; *p.x = 1; q->y = 3.5; 8

Tietueet ja funktiot: tietue viiteparametrina void constructorp(pairtp this, double x, double y) { this->x = x; this->y = y; Funktio saa osoittimen Kutsujan aiemmin varaaman tietueen PairT w; muistialueeseen. PairTP p; constructorp(&w, 1, 2); if((p = malloc(sizeof(pairt))) == NULL) error; constructorp(p, 1, 2); 9

Tietueet ja funktiot: tietue paluuarvona Funktio voi palauttaa kokonaisen tietueen. Silloin kutsujan on tehtävä palautetusta tietueesta kopio, koska alkuperäinen vapautuu pinosta funktiosta palattua. PairT constructorfunc(double x, double y) { PairT p; p.x = x; p.y = y; Pinossa palautettu return p; tietue on kopioitava heti talteen. PairT w = constructorfunc(1, 2.2); /* kopio */ 10

Tietueet ja funktiot: osoitin paluuarvona Funktio varaa tilan tietueelle, jolloin kutsujan vastuulle jää vapauttaa tuo varattu tila. PairTP constructor(double x, double y) { /* client responsible for deallocation */ PairTP p; if((p = malloc(sizeof(pairt))) == NULL) return NULL; Funktio varaa tilan tietueelle p->x = x; Ja palauttaa osoittimen siihen p->y = y; Kutsuja vapauttaa tilan return p; myöhemmin. PairTP p1 = constructor(1, 2); free(p1); 11

Tietueet ja funktiot: osoitin paluuarvona Käyttö toisen funktion parametrina: int compare(const PairTP p, const PairTP q) { return p->x == q->x && p->y == q->y; PairTP p2 = constructor(1, 3); PairTP p3 = constructor(2, 6); int i = compare(p3, p2); free(p2); free (p3); Vältä muistivuotoa! i = compare(p1, constructor(3.5, 7)); Tässä kadotetaan osoitin tietueeseen, joten muisti jää vapauttamatta 12

Muistilohko tietueista Muistilohkon käsittely ei riipu lohkon alkioiden tyypistä. Tietueen omiin alkioihin viittaus kuten itsenäisissäkin tietueissa. PairTP rectangle; PairTP aux; double x, y; rectangle pair pair pair pair if((rectangle= malloc(4*sizeof(pairt)))==null)error; error; for(aux = rectangle; aux < rectangle + 4; aux++) { printf("enter two double values:"); if(scanf("%lf%lf", &x, &y)!= 2) /* error */ break; constructorp(aux, x, y); 13

Osoitinlohko tietueisiin Mahdolliset viittaustavat: prectangle[1][0].x prectangle[1]->x (prectangle+1)->x prectangle int i; PairTP *prectangle; if((prectangle= malloc(4*sizeof(pairtp)))==null)error; error; for(i = 0; i < 4; i++) { printf("enter two double values:"); if(scanf("%lf%lf", &x, &y)!= 2) error; if((prectangle[i] = constructor(x, y)) == NULL) error; for(i = 0; i < 4; i++) printf("vertex %d = (%f %f)\n", i, prectangle[i][0].x, prectangle[i][0].y); pair 1 x y pair pair 14

Lueteltu tyyppi (enum) Luetellun tyypin määrittelemät järjestetyt vakiot vastaavat järjestyksessä kokonaislukuja 0,1,2 jne. Numeroinnin voi myös aloittaa haluamastaan arvosta typedef enum opcodes { lvalue, rvalue, push, plus OpcodesT; enum opcodes e; OpcodesT f; int i = (int)rvalue; /*i=1*/ enum opcodes { lvalue = 1, rvalue, push, plus ; enum opcodes e = lvalue; if(e == push) int i = (int)rvalue;/*i=2*/ 15

Lueteltu tyyppi funktion paluuarvona Lueteltua tyyppiä voi käyttää virhetiedon käsittelyssä Virheilmoitustekstit kootaan taulukkoon, jota indeksoidaan luetellun tyypin alkioita vastaavilla kokonaislukuarvoilla typedef enum { FOPEN, FCLOSE, FOK FoperT; #define TOINT(f) ((int)(f)) char *Messages[] = { "File can not be opened", "File can not be closed", "Successful operation", "This can not happen" ; FoperT process(); printf("result of calling process() is %s\n", Messages[TOINT(process())]; 16

Union Tietue Alkiot peräkkäin eli kaikki käytettävissä Union (vrt. Pascalin vaihtuvan- mittaiset tietueet) Alkiot päällekkäin eli vaihtoehtoisia struct intanddouble { int i; double d; ; int union intordouble { int i; double d; ; int double double intanddouble intordouble 17

Union - Käyttö Käyttö yleensä tietueen osana Tietueessa kenttä (tag), joka kertoo miten union- rakenne pitää tulkita Käytetään paljon tietoliikenneprotokollissa säästämässä tilaa Kenttiin viitataan samalla pistenotaatiolla kuin tietueidenkin kenttiin typedef enum { integer, real TagTypeT; typedef struct { TagTypeT tag; union { int i; double d; value; TaggedValueT; TaggedValueT v; if(v.tag == integer) v.value.i ; else v.value.d ; 18

Linkitetyt tietorakenteet Abstraktit tietorakenteet Käsitelty Tietorakenteiden kurssilla Kannattaa kerrata kaikki rakenteet sieltä Pino : operaatiot push, pop ja empty Jono: operaatiot enqueue, dequeue ja empty Linkitetty lista rakenteesta päätettävä Yhteen suuntaan vai kahteen suuntaan Rengas vai ei Tunnussolmu vai ei Järjestetty vai järjestämätön Alkiot erilaisia vai sallitaan myös samanlaiset alkiot 19

Linkitetty lista - Määrittely Tunnussolmullinen yhteensuuntaan linkitetty NULL arvoa käytetään aina listan lopun osoittamiseen Huomaa seuraavaan alkioon osoittavan kentän next määrittely! typedef double DataType; typedef struct elem { DataType value; struct elem *next; ElemT, *ElemTP; typedef struct { ElemTP first; ListT, *ListTP; ListTP p; p first ListT value 2 next ElemT value 3.5 next NULL ElemT 20

Linkitetty lista Tunnussolmun luonti ja poisto Listan luonti Tehdään vain tunnussolmu ja asetetaan linkit Listan poistaminen Alkioiden poistoon oma funktio Tässä vain tunnussolmun tilan vapautus ListTP construct(void) { ListTP p; if((p = malloc(sizeof(listt))) == NULL) return NULL; p->first = NULL; return p; void destruct(listtp *this) { clear(*this); /* alkiot pois */ free(*this); *this = NULL; 21

Linkitetty lista - Käyttö Kaikkien listaa käsittelevien toimintojen täytyy säilyttää seuraavat invariantit: Tyhjälle listalle pätee p->first on NULL. Epätyhjälle listalle pätee, että viimeisen alkion next- kentän arvo on NULL. p first ListT p NULL first ListT value 2 next ElemT value 3.5 next ElemT NULL 22

Linkitetty lista - Käyttö Operaatioita: Listan läpikäynti p first ListT value 2 next ElemT Aina linkien kulkusuuntaan Listaan lisääminen Alkuun, loppuun, keskelle Listasta poistaminen Alusta, lopusta, keskeltä value 3.5 next ElemT NULL 23

Listan läpikäynti p first ListT value 2 next ElemT value 3.5 next ElemT aux void printall(const ListTP this) { ElemTP aux; for(aux=this->first; aux!=null; aux=aux->next) printf("%f\n", n", aux->value); /* pidetään aux edellisessä alkiossa */ If ((p->first!= NULL) && (p->first->next!=null)) for(aux = p->first; aux->next->next!= NULL; aux = aux->next)... NULL 24

Lisäys listan alkuun p first ListT value 2 next ElemT value 3.5 next ElemT int insertfront(listtp this, DataType d) { ElemTP aux; if((aux = malloc(sizeof(elemt))) == NULL) return 0; value 2 next ElemT NULL aux->next = this->first; /* save state */ aux->value = d; this->first = aux; return 1; 25

Viimeisen alkion poisto listasta p first ListT value 2 next ElemT value 3.5 next ElemT int deletelast(listtp this, DataType *value) { ElemTP aux; NULL if(this->first == NULL) /* empty list */ return 0; if(this->first->next >next == NULL) { /* single */ *value = this->first->value; >value; free(this->first); this->first = NULL; return 1; for(aux = this->first; aux->next >next->next!= NULL; aux = aux->next) ; /* aux viimeistä edelliseen */ *value = aux->next->value; >value; free(aux->next); aux->next = NULL; return 1; 26

Koko listan tuhoaminen Tuhotaan alkio kerrallaan edetään lista alusta loppuun int deletefirst(listtp this) { ElemTP aux = this->first; if(aux == NULL) /* empty list */ return 0; this->first = aux->next; free(aux); return 1; void clear(listtp this) { while(deletefirst(this)) ; this->first = NULL; 27

Moduuli List Tehdään oma käännösyksikkö (moduuli), joka sisältää listan määrittelyt ja käsittelyfunktiot Tässä tehtävällä moduulilla on seuraavat piirteet Moduuli pystyy käsittelemään useita eri listoja Moduuli käsittelee void-tyypistä dataa, joten eri listoihin voi sijoittaa eri tyyppistä tietoa Listan sisäinen toteutus ei näy käyttäjälle Listan käyttäjä vastaa datan rakenteesta ja käsittelystä Tyypin määrittelyt: ListItem ja List Funktiot: CreateList, CreateItem, AddTail, AddHead, ListLength, DeleteList, PrintList, EmptyList Lähde: Jan Lindströmin verkkomoniste 28

Moduulin tarjoama rajapinta: list.h #ifndef MY_LIST_LIBRARY #define MY_LIST_LIBRARY /* Määritellään listatyypit */ typedef struct listitem { struct listitem *Next; /* Seuraava alkio listassa */ struct listitem *Prev; /* Edellinen alkio listassa */ void *Data; /* Tietoalkio */ unsigned long Size; /* Tietoalkion koko */ ListItem; typedef struct { ListItem *Head; /* Listan alku */ ListItem *Tail; /* Listan loppu */ unsigned long Items; /* Listan alkioiden lkm */ List; 29

List.h jatkuu /* Listakirjaston tukemat funktiot */ extern List *CreateList(void); /* Luo uusi lista */ extern ListItem *CreateItem(void *Data, unsigned long Size); /* Luo lista-alkio */ extern int AddTail(List *,ListItem *); /* Lisää listan loppuun */ extern int AddHead(List *,ListItem *); /* Lisää listan alkuun */ extern unsigned long ListLength(List *); /* Laske listan pituus */ extern void DeleteList(List *); /* Tuhoa lista */ extern void PrintList(List *); /* Tulosta listan sisältö */ extern int EmptyList(List *); /* Tarkista onko lista tyhjä */ #endif 30

List.c : CreateList /* Varataan muistia uudelle listalle ja alustetaan kentät */ List *CreateList(void) { List *uusi; if(!(uusi = (List *)malloc(sizeof(list)))) return NULL; uusi->head = NULL; uusi->tail = NULL; uusi->items = 0; return uusi; 31

List.c: CreateItem /* Varataan muistia uudelle listan alkiolle ja alustetaan kentät */ ListItem *CreateItem(void *Data,unsigned long size) { ListItem *uusi; /* Jos järkevää dataa ei ole annettu poistu */ if (Data == NULL) return NULL; if(!(uusi = (ListItem *)malloc(sizeof(listitem)))) return NULL; if(!(uusi->data = (void *)malloc(size))) return NULL; uusi->next = NULL; uusi->prev = NULL; memcpy(uusi->data,data,size); uusi->size = size; return uusi; 32

List.c: AddTail /* Lisätään alkio listan loppuun */ extern int AddTail(List *lista,listitem *item) { if (lista == NULL item == NULL ) return 1; if ( lista->head == NULL) lista->head = lista->tail = item; else { lista->tail->next = item; item->prev = lista->tail; lista->tail = item; lista->items++; return 0; 33

List.c: AddHead /* Lisätään alkio listan alkuun */ extern int AddHead(List *lista,listitem *item) { if (lista == NULL item == NULL ) return 1; if ( lista->head == NULL) lista->head = lista->tail = item; else { lista->head->prev = item; item->next = lista->head; lista->head = item; lista->items++; return 0; 34

List.c: ListLength ja EmptyList /* 'Lasketaan' listan pituus */ unsigned long ListLength(List *lista) { if ( lista == NULL ) return 0; else return lista->items; /* Tarkista onko lista tyhjä */ int EmptyList(List *lista) { if ( lista == NULL) return 1; else if (lista->head == NULL ) return 1; else return 0; 35

List.c:DeleteList /* Tuhotaan koko lista */ void DeleteList(List *lista) { ListItem *tmp; if ( lista == NULL ) return; tmp = lista->head; while(tmp!= NULL) { tmp = lista->head->next; free(lista->head->data); free(lista->head); lista->head = tmp; free(lista); 36

List.c: PrintList /* Tulostetaan koko lista */ void PrintList(List *lista) { ListItem *tmp = lista->head; printf(" "); while(tmp!= NULL) { printf("%s ",(char *)tmp->data); tmp = tmp->next; printf(" -\n"); Tässä oletetaan, että listassa on merkkijonoja. Parempi ratkaisu olisi käyttää funktioparametria data-alkioiden käsittelyyn. Käyttäjä joutuisi silloin itse ohjelmoimaan alkioiden käsittelyn, mutta listan käyttöalue kasvaisi. 37

Harjoitustyö Käytettävät piirteet: Linkitetty tietorakenne osoittimilla (pino, lista, puu, hajautustaulu, ), mikäli tehtävä sallii Tiedosto (tekstitiedosto tai binääritiedosto) Komentoriviparametrit (jos ei muuta järkevää, niin ainakin h opastus) Funktioita parametreineen mielekkäästi Käännyttävä laitoksen Linux-ympäristössä gcc:n parametreilla ansi pedantic Wall ja Wextra ilman varoituksia. Voit käyttää myös c99:ä. Vähintään kaksi käännösyksikköä ja make Koodi dokumentoitava järkevästi Erillinen lyhyt rakennedokumentti ja käyttöohje 38

Aiheet Katso kurssisivulta. 39

Aiheen valinta ja palautus Valitse aihe Ilmoita aihe kurssisivun ohjeiden mukaan Omista (varsinkin simulointityyppisistä) aiheista voi neuvotella luennoijan kanssa Kurssisivun kautta löytyy ohjeet työn palauttamisesta 40