Programski Jezik 9

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 19

Programski jezik C

Tema 9

Primer 1
#include <stdio.h> #include <stdlib.h> int main () { int *br; br = (int *) malloc (sizeof(int)); /* malloc-u se prosledjuje kolicina potrebne memorije u bajtovima, a on vraca genericki pokazivac (void*) koji pre koriscenja treba konvertovati u odgovarajuci pokazivacki tip.*/ printf("Unesite celi broj: "); scanf("%d", br); printf("Ucitan broj je: %d\n\n", *br);

free(br); /* oslobadjanje (dealociranje) */


return 0; }

malloc
void *malloc (size_t size); Za argument funkcije uzima veliinu bloka koji elimo alocirati Vraa pokaziva na poetak bloka (tj, vraa adresu prvog byta bloka). Ako alokacija nije uspena, vraa NULL. NULL je posebna lokacija u memoriji koja sigurno ne sadri bilo koji podataka. Za upotrebu malloc trebamo, #include<stdlib.h>

calloc
void *calloc(n, size);

Rezervie memorijski blok dovoljan za memorisanje n elemenata svaki veliine size bajtova, znai n*size. Rezervisan memorijski blok je inicijalizovan na 0. U sluaju uspene rezervacije calloc vraa pokaziva koji pokazuje na rezervisan memorijski blok. U protivnom, vraa 0.

realloc
void *realloc(pokaz, size);

Oslobaa rezervisani memorijski blok i rezervie novi veliine size bajtova. Argument pokaz je pokazatelj na char i defimnie memorijski blok, koji se realocira. Argument size je unsigned i odreuje veliinu realociranog memorijskog bloka. Ako je realociranje uspoeno realloc vraa pokaziva koji pokazuje na memorijski blok. U protivnom, realloc vraa 0.

free

Kada nam memorijski blok koji alcoran s malloc nije vie potreban, moramo ga osloboditi. To se radi s funkcijom free(arg)

Argument funkcije free() mora biti pokaziva koji pokazuje na poetak prostora koji elimo osloboditi (dealocirati). curenje memorije Za svaki malloc() moramo imati jedan free()!

/*Unos niza proizvoljne dimenzije i pronalaenje najveceg elementa #include <stdio.h> #include <stdlib.h> int main() { int n;// Dimenzija niza int* a; int i, max; printf("Unesi dimenziju niza : "); scanf("%d", &n);

*/

/* Sada znamo koliko je memorije potrebno i pozivamo funkciju malloc za dinamicku alokaciju memorije*/ a = (int*) malloc(n*sizeof(int)); if (a == NULL) { printf("Greska : Nema dovoljno memorije!\n"); return 1; } /* Nadalje a koristimo indeksnom notacijom for (i = 0; i<n; i++) { printf("a[%d]=", i); scanf("%d", &a[i]); } /* Nalazimo maksimum max = a[0]; for (i = 1; i<n; i++) if (a[i] > max) max = a[i]; printf("Najveci element je %d\n", max); free(a); return 0; */ // U slucaju da nema dovoljno memorije malloc vraca NULL

*/

Primer 2

Zadatak 1
Napisati C program koji realizuje osnovne operacije sa dinamikom strukturom podataka oblika jednostruko spregnute liste. Element liste sastoji se od dva polja: podatak (u ovom sluaju proizvoljan karakter) pokaziva na sledei element liste Operacije koje treba realizovati sa jednostrukom spregnutom listom su: unos novog karaktera (ako se ne nalazi u listi), modifikacija karaktera (umesto jednog karaktera treba upisati drugi karakter), traenje karaktera u listi i brisanje karaktera iz liste.

U zadatku se koristi dinamika struktura podataka u obliku jednostruko spregnute liste. Da bismo mogli pristupati elementima liste potreban nam je pokaziva na prvi elemenat liste, koji se naziva glava liste. Grafika predstava jednostruko spregnute liste u ovom zadatku je:

- NULL oznaava da pokaziva ne pokazuje ni na ta.

- Uopteno, pokazivaka promenljiva sadri adresu elementa (sloga liste) na koji pokazuje.

Operacije sa listom su: 1) inicijalizacija liste, 2) unos novog elementa na pocetak liste, 3) listanje liste (prikaz svih elemenata iz liste), 4) brisanje elementa iz liste i 5) brisanje liste (oslobaanje memorije).

1) Inicijalizacija liste predstavlja postavljanje glave liste na NULL. Kada glava liste ima vrednost NULL znai da je lista prazna.

*glava=NULL;

2) Unos novog elementa u listu moe se obaviti dodavanjem elementa na poetak liste ili dodavanjem elementa na kraj liste. Dodajemo na kraj. Sa: novi=(Tcvor *)malloc(sizeof(Tcvor));

formira se slog koji je tipa 'Tcvor' i pokaziva 'novi' pokazuje na novoformirani slog.

Polja sloga popunjavaju na osnovu sledeih naredbi: c=getc(); novi->znak=c; novi->sledeci=NULL; - Ako je lista prazna tada se novi elemenat ubacuje kao prvi element liste: if(glava==NULL) { glava=novi; return; }

Ako lista ve postoji preskoie se gornja if naredba i unos e se obaviti sledeim delom koda: tek=glava; pret=glava; while(tek!=NULL) { pret=tek; tek=tek->sledeci; } pret->sledeci=novi;

- Nakon

prolaska kroz while ciklus imaemo sledeu situaciju: 'tek' ne pokazuje ni na ta, a 'pret' koji ga je "pratio" pokazae na poslednji slog iz liste.

Nakon: pret->sledeci=novi; novi slog e biti povezan kao poslednji elemenat u listi.

3) Listanje liste predstavlja prikazivanje svih elemenata iz liste Ako je glava==NULL znai da je lista prazna i nemamo ta prikazati. Ako lista nije prazna, novim pokazivaem polazi se od prvog sloga liste (tek=glava) i dok se ne doe do kraja liste (tek==NULL) prikazuju se slogovi liste.

tek=glava; while(tek!=NULL) { printf(" %c",tek->znak); tek=tek->sledeci; }

/* Sa strelicom (->) se pristupa elementu sloga (strukture). */ /* Prelazimo na sledei elemenat iz liste. */

4) Brisanje elementa iz liste realizuje se tako to se mora element prvo pronai (vri se traenje elementa u listi). To se moe realizovati sledeim delom koda:

tek=glava; pret=glava; while(tek!=NULL && (tek->znak != c)) { pret=tek; tek=tek->sledeci; }


Pri emu je 'c' promenljiva ija vrednost se trai. Nakon zavretka while ciklusa ako pokaziva 'tek' ima vrednost NULL znai da elementa nema u listi. U sluaju da je tek!=NULL elemenat se nalazi u listi, a pokaziva 'pret' pokazuje na njegovog prethodnika iz liste. Razlikujemo dva sluaja: a) da slog koji se brie nije prvi elemenat liste, b) da slog koji se brie jeste prvi element liste.

a) Slog koji se brie nije prvi elemenat liste

pret->sledeci=tek->sledeci; tek->sledeci=NULL;

b) Slog koji se brie jeste prvi elemenat liste

glava=tek->sledeci; tek->sledeci=NULL;

5) Brisanje liste

while(glava!=NULL) { tek=glava; glava=tek->sledeci; free(tek); }

Zadatak 2

Zadata je tekstualna datoteka spisak.txt koja sadri spisak imena i prezimena. U svakom redu datoteke nalazi se tano jedno ime i prezime meusobno razdvojeni prazninama. Datoteka je sortirana po abecednom kriterijumu. U datoteci brisi.txt nalazi se u istom formatu kao u datoteci spisak.txt spisak imena i prezimena koje treba izbaciti iz datoteke spisak.txt, i formirati datoteku izlaz.txt.

You might also like