You are on page 1of 19

CHUYN T CHC D LIU

CC KIU D LIU NNG CAO 2


CU TRC Ging vin: V QUC HONG (vqhoang@fit.hcmus.edu.vn)

Ni dung trnh by
2

Kiu d liu phc hp Kiu cu trc Con tr cu trc Cu trc t tr Kiu hp Mt s vn vi cu trc

Kiu d liu phc hp


3

Kiu d liu phc hp (composite datatype) l kiu d liu c xy dng t cc kiu d liu khc, cc kiu c th l:
kiu d liu c bn hoc, kiu d liu phc hp khc

Hai loi kiu d liu phc hp quan trng l:


Kiu cu trc (struct) Kiu lp (class)

Nhng kiu do ngi dng nh ngha thng l nhng kiu d liu phc hp:
Ngn ng cung cp phng tin ngi dng nh ngha (khai bo) nhng kiu ny

Kiu cu trc (struct)


4

Kiu cu trc l kiu d liu gm nhiu thnh phn d liu:


Cc thnh phn c th khc kiu nhau Cc thnh phn c lu tr lin tip nhau trn vng nh
Vng nh lu tr mt cu trc l tng vng nh lu tr cc thnh phn (v cc vng m nu cn)

Cc thnh phn c th c kiu l kiu cu trc khc Kiu cu trc cn c gi l kiu bn ghi (record); cc thnh phn cn c gi l trng (field)

Kiu cu trc
5

struct Point { int x; int y; };

struct Line { Point p1; Point p2; }; Line l;


struct cho php nhm cc d liu lin quan thnh mt n v d liu c ngha

l p1 x y p2 x

Kiu cu trc Cc thao tc c bn


6

Khai bo kiu struct Point Tn kiu { Kiu v tn cc int x; thnh phn int y; }; Khai bo bin struct Point p; //C x: Point q; //C++ p: 10 Khi to Point p = {10, 20};

y: 20

Kiu cu trc Cc thao tc c bn


7

Php gn Point p = {10, 20}; Point q = p; //q={10, 20} Truy cp thnh phn Line l; l.p1 = p; l.p1.x = l.p2.x;

Con tr cu trc
8

Line l = {{10, 20}, {30, 40}}; Point p = {50, 60}; Point *pp = &p; Point &rp = l.p1; Line *pl = &l; printf(%d, %d, pp->x, (*pp).y);//50, 60 printf(%d, %d, rp.x, rp.y); //10, 20 pp = &(pl->p1); pp++; printf(%d, %d, pp->x, (*pp).x);//30, 40

p kiu cu trc
9

C/C++ khng cho php chuyn kiu trn kiu cu trc struct Int1 { int a; }; struct Int2 { int a; }; Int1 i1 = {10}; int i = i1.a; //ok int j = (int)i1; //error i1 = 10; //error Int2 i2 = (Int2)i1; //error

p kiu cu trc
10

C/C++ cho php chuyn kiu tng minh trn kiu con tr cu trc
struct Point { int x, y; }; struct Line { Point p1, p2; };

Point p = {10, 20}; int *pi = (int*)&p; (*pi) = 30; printf(%d, %d, p.x, p.y); //30, 20 Line l = {{1, 2}, {3, 4}}; Line *pl = &l; Point *pp = (Point*)l; pp++; printf(%d, %d, pp->x, pp->y); //3, 4 int ai[] = {5, 6, 7, 8}; pl = (Line*)ai; printf(%d, %d, pl->p1.x, pl->p2.y); //5, 8

Cu trc t tr
11

Nhiu cu trc d liu l cu trc qui: cu trc c mt hay nhiu thnh phn c dng ca chnh n Cy nh phn l mt cu trc qui gm mt nt mang d liu v hai cy con tri phi (cng l cy nh phn) struct BinTree { int data; BinTree left, right; //!!! };

Cu trc t tr
12

Nhng cu trc qui c hin thc trong C/C++ bng nhng cu trc t tr struct BinTree { int data; BinTree *left, *right; //ok };

Cu trc t tr
13

BinTree BinTree BinTree BinTree t3.left

t1 = {10, t2 = {20, t4 = {40, t3 = {30, = &t2;

NULL, NULL}; &t1, NULL}; NULL, NULL}; NULL, &t4};


30

20

40

10

Kiu hp (union)
14

Kiu hp l kiu d liu gm nhiu thnh phn d liu c lu tr ti cng mt vng nh Kiu hp cho php nhiu cch din gii (cch hiu) trn cng mt d liu C php nh kiu cu trc

Kiu hp
15

union XXX { int is[4]; Point ps[2]; Line l; }; XXX xxx = {10, 20, 30, 40}; printf("%d, %d", xxx.ps[0].x, xxx.ps[0].y); //10, 20 printf("%d, %d", xxx.l.p2.x, xxx.l.p2.y); //30, 40 xxx.l.p2 = xxx.l.p1; printf("%d", xxx.is[3]); //20

Mt s vn vi cu trc Sao chp cu trc


16

Thao tc sao chp cu trc l sao chp ton b v ch vng nh ca cu trc struct X { char *s; int i; }; char a[] = hi; X x1 = {a, 1}; X x2 = x1; printf(%s, %d, x1.s, x1.i); //hi, 1 x2.i = 2; x2.s[0] = H; printf(%s, %d, x1.s, x1.i); //Hi, 1

Mt s vn vi cu trc Kiu m rng


17

Kiu cu trc A c gi l kiu m rng ca kiu cu trc B nu A c y v ng th t cc thnh phn ca B (v c th c thm cc thnh phn khc)
L mt dng c bit ca kiu con (subtype) L mt dng k tha chc nng: cc thao tc trn mt kiu cng c th dng thao tc trn cc kiu m rng ca n

Mt s vn vi cu trc Kiu m rng


18

struct X { int a, b; }; struct XX { int c, d; int e; }; void f(X *x) { x->a = x->b; } XX xx = {1, 2, 3}; f((X*)&xx); printf(%d, %d, %d, x.c, xx.d, xx.e); //2, 2, 3

19

Hi v p

You might also like