E wyk09 id 827341 Nieznany

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Operacje na stercie

Implementacja stosu
Implementacja kolejki

Kurs C z elementami C++

Marek Piotrów - Wykład 9

Sterta i budowanie dynamicznych struktur za pomoc ˛

a

wska´zników

Efektywne u˙zycie rekursji

29 listopada 2007

Uwaga: w załacznikach do tego pliku znajduj ˛

a si ˛e teksty

prezentowanych przykładów (do łatwiejszego kopiowania).

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Operacje na stercie

Implementacja stosu
Implementacja kolejki

Operacje na stercie

I

Operacje na stercie nie s ˛

a cz ˛e´sci ˛

a definicji j ˛ezyka C

(pojawiaj ˛

a si ˛e dopiero w definicji C++), ale s ˛

a dost ˛epne w

standardowej bibliotece C stdlib.

I

Do przydziału pami ˛eci ze sterty u˙zywa si ˛e jednej z funkcji:
void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size);

I

Do zwolnienia przydzielonej pami ˛eci słu˙zy funkcja:
void free(void *ptr);

I

Do zmiany rozmiaru przydzielonej pami ˛eci mo˙zna u˙zy´c
funkcji:
void *realloc(void *ptr, size_t size);

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Operacje na stercie

Implementacja stosu

Implementacja kolejki

Struktury dynamiczne - stos.h

#include <stdlib.h>

#define TYP_INFO

char*

#define TYP_NULL

NULL

struct e_stos {

TYP_INFO info;

struct e_stos *nast;

} *stos = NULL;

int empty(void);

int push(TYP_INFO info);

TYP_INFO top(void);

TYP_INFO pop(void);

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Operacje na stercie

Implementacja stosu

Implementacja kolejki

Struktury dynamiczne - stos.c

#include <stdlib.h>

#include "stos.h"

int empty(void)

{

return (stos == NULL);

}

int push(TYP_INFO info)

{

struct e_stos *p;

if ((p=(struct e_stos *)malloc(sizeof(struct e_stos))) == NULL)

return 1;

else {

p->info=info;

p->nast=stos;

stos=p;

return 0;

}

}

TYP_INFO top(void)

{

return (stos == NULL ? TYP_NULL : stos->info);

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Operacje na stercie

Implementacja stosu

Implementacja kolejki

Struktury dynamiczne - stos.c (cd.)

TYP_INFO pop(void)

{

TYP_INFO info;

struct e_stos *p;

if (stos == NULL)

return TYP_NULL;

else {

info=stos->info;

p=stos;

stos=stos->nast;

free(p);

return info;

}

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Operacje na stercie
Implementacja stosu

Implementacja kolejki

Deklaracja typedef - kolejka.h

#include <stdlib.h>

#define TYP_INFO

char*

#define TYP_NULL

NULL

struct e_listy {

TYP_INFO info;

struct e_listy *nast;

} ;

typedef struct kol {

struct e_listy *pierwszy;
struct e_listy *ostatni;

} Kolejka;

Kolejka *nowa(void);
int pusta(Kolejka *kol);
int do_kolejki(Kolejka *kol,TYP_INFO info);
TYP_INFO z_kolejki(Kolejka *kol);

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Operacje na stercie
Implementacja stosu

Implementacja kolejki

U˙zywanie zdefiniowanych typów - kolejka.c

#include <stdlib.h>

#include "kolejka.h"

Kolejka *nowa(void)
{

Kolejka *p;

if ((p=(Kolejka *)malloc(sizeof(Kolejka))) == NULL)

return NULL;

else {

p->pierwszy=p->ostatni=NULL;

return p;

}

}

int pusta(Kolejka *kol)
{

return (kol->pierwszy == NULL);

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Operacje na stercie
Implementacja stosu

Implementacja kolejki

int do_kolejki(Kolejka *kol,TYP_INFO info)
{

struct e_listy *p;

if ((p=(struct e_listy *)malloc(sizeof(struct e_listy))) == NULL)

return 1;

else {

p->info=info;

p->nast=NULL;

if (kol->pierwszy == NULL)

kol->pierwszy=kol->ostatni=p;

else

kol->ostatni=kol->ostatni->nast=p;

return 0;

}

}

TYP_INFO z_kolejki(Kolejka *kol)
{

struct e_listy *p;
TYP_INFO info;

if ((p=kol->pierwszy) == NULL)

return TYP_NULL;

else {

if ((kol->pierwszy=p->nast) == NULL)

kol->ostatni=NULL;

info=p->info;

free(p);

return info;

}

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Sortowanie z u˙zyciem drzewa poszukiwa ´

n binarnych

Drzewa binarne - sortowanie liczb

#include <stdio.h>

#include <stdlib.h>

typedef struct e_drzewa *Wsk_drzewa;
typedef struct e_drzewa {

double liczba;

int ile_razy;

Wsk_drzewa lewy;

Wsk_drzewa prawy;

} Wezel_drzewa;

static Wsk_drzewa dopisz_liczbe(Wsk_drzewa p,double dana);

static void wypisz_drzewo(Wsk_drzewa p);

int main(void)

{

Wsk_drzewa Korzen=NULL;

double dana;

while (scanf("%lf",&dana) == 1)

Korzen=dopisz_liczbe(Korzen,dana);

wypisz_drzewo(Korzen);

putchar(’\n’);

return 0;

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Sortowanie z u˙zyciem drzewa poszukiwa ´

n binarnych

Sortowanie liczb - funkcja dopisz_liczbe

static Wsk_drzewa dopisz_liczbe(Wsk_drzewa p,double dana)

{

if (p == NULL) {

p=(Wsk_drzewa)malloc(sizeof(Wezel_drzewa));

p->liczba=dana;

p->ile_razy=1;

p->lewy=p->prawy=NULL;

} else if (dana < p->liczba)

p->lewy=dopisz_liczbe(p->lewy,dana);

else if (dana > p->liczba)

p->prawy=dopisz_liczbe(p->prawy,dana);

else

++p->ile_razy;

return p;

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Sortowanie z u˙zyciem drzewa poszukiwa ´

n binarnych

Sortowanie liczb - funkcja wypisz_drzewo

static void wypisz_drzewo(Wsk_drzewa p)

{

int i;

if (p != NULL) {

wypisz_drzewo(p->lewy);

for (i=1; i <= p->ile_razy; ++i)

printf("%.2lf ",p->liczba);

wypisz_drzewo(p->prawy);

free(p);

}

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Rekurencyjny kalkulator

Rekurencyjny kalkulator dla liczb rzeczywistych

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

/*********

Oblicz3.c: kalkulator dla wyrazen rzeczywistych

*************

* Program czyta ze standardowego wejscia zapisane z uzyciem nawiasow i

*

* czterech podstawowych dzialan wyrazenie i oblicza je rekurencyjnie.

*

* Wynik wyswietlany jest po znaku =.

*

***************************************************************************/

#define LICZBA ’0’

/***************** PROTOTYPY FUNKCJI ********************/

static double czytaj_liczbe(void);

static int czytaj_znak(void);

static double wyrazenie(void);

static double skladnik(void);

static double czynnik(void);

/***************** DEFINICJE FUNKCJI ********************/

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Rekurencyjny kalkulator

Rekurencyjny kalkulator dla liczb rzeczywistych

int main(void)

{

int z;

double wyn;

while ((z=czytaj_znak()) != EOF) {

ungetc(z,stdin);

wyn=wyrazenie();

if ((z=czytaj_znak()) == ’=’)

printf("WYNIK = %.8g\n",wyn);

else {

printf("BLAD: nieoczekiwany znak: ’%c’\n",(char)z);

return 1;

}

}

return 0;

}

static int czytaj_znak(void)

{

int z;

while ((z=getchar()) != EOF && isspace(z)) ;

if (isdigit(z) || z == ’.’) {

ungetc(z,stdin);

return LICZBA;

}

return z;

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Rekurencyjny kalkulator

Rekurencyjny kalkulator dla liczb rzeczywistych

static

double czytaj_liczbe(void)

{

int z;

double n=0.0, pot10=1.0;

while ((z=getchar()) != EOF && isdigit(z))

n=10.0 * n + (z-’0’);

if (z == ’.’)

while ((z=getchar()) != EOF && isdigit(z)) {

n=10.0 * n + (z-’0’);
pot10*=10.0;

}

ungetc(z,stdin);

return n/pot10;

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Rekurencyjny kalkulator

Rekurencyjny kalkulator - analiza wyrazenia

static double wyrazenie(void)

{

int z;

double wyn, x2;

if ((z=czytaj_znak()) != ’-’ && z != ’+’ && z != EOF)

ungetc(z,stdin);

wyn=skladnik();

if (z == ’-’) wyn=-wyn;

while ((z=czytaj_znak()) == ’+’ || z == ’-’) {

x2=skladnik();

wyn=(z == ’+’ ? wyn+x2 : wyn-x2);

}

if (z != EOF) ungetc(z,stdin);

return wyn;

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Rekurencyjny kalkulator

Rekurencyjny kalkulator - analiza skladnika

static double skladnik(void)

{

int z;

double wyn,x2;

wyn=czynnik();

while ((z=czytaj_znak()) == ’*’ || z == ’/’) {

x2=czynnik();

wyn=(z == ’*’ ? wyn*x2 : wyn/x2);

}

if (z != EOF) ungetc(z,stdin);

return wyn;

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++

background image

Struktury dynamiczne

Drzewa binarne

Efektywne u˙zycie rekursji

Rekurencyjny kalkulator

Rekurencyjny kalkulator - analiza czynnika

static double czynnik(void)

{

int z;

double wyn;

if ((z=czytaj_znak()) == LICZBA)

return czytaj_liczbe();

else if (z == ’(’) {

wyn=wyrazenie();

if ((z=czytaj_znak()) == ’)’)

return wyn;

else {

printf("BLAD: oczekiwano ’)’, a wystapil znak: ’%c’\n",(char)z);

exit(1);

}

}

else {

printf("BLAD: oczekiwano liczby lub ’(’, a wystapil znak: ’%c’\n",(char)z);

exit(1);

}

}

Marek Piotrów - Wykład 9

Kurs C z elementami C++


Document Outline


Wyszukiwarka

Podobne podstrony:
Abolicja podatkowa id 50334 Nieznany (2)
4 LIDER MENEDZER id 37733 Nieznany (2)
katechezy MB id 233498 Nieznany
metro sciaga id 296943 Nieznany
perf id 354744 Nieznany
interbase id 92028 Nieznany
Mbaku id 289860 Nieznany
Probiotyki antybiotyki id 66316 Nieznany
miedziowanie cz 2 id 113259 Nieznany
LTC1729 id 273494 Nieznany
D11B7AOver0400 id 130434 Nieznany
analiza ryzyka bio id 61320 Nieznany
pedagogika ogolna id 353595 Nieznany
Misc3 id 302777 Nieznany
cw med 5 id 122239 Nieznany
D20031152Lj id 130579 Nieznany
mechanika 3 id 290735 Nieznany

więcej podobnych podstron