danh sach cay 1 số bai tập từ trang 37

62
 ĐỀ CƯƠNG MÔN : CU TRÚC DLIU Chương 1: CÁC KHÁI N IM CƠ B N 1.1. Thu t t oán v à cu t rúc d li u 1.2. Các k iu d liu cơ b n tr ong n gôn n gC 1.2.1. Ki u dli u đơn gi n 1. 2.1 .1. Ki u ký t 1.2.1.2. Kiu sng uyên 1.2.1.3. Kiu sthc 1.2.2. Kiu dliu c ó cu trúc 1. 2.2 .1. Ki u mn g 1.2.2.2. Kiu chui ký t 1.2.2.3. Kiu bn ghi 1.3. Ki u co n t r 1.3.1. Đị nh ngh ĩ a 1.3. 2. Khai báo kiu con tr1.3.3. m đị a ch 1.3. 4. Các ph ép toán t rên ki u con tr1. 4. Ki u t ha m c hi ếu 1.4.1. Đị nh ngh ĩ a 1.4. 2. Khai báo kiu t ham c hiếu 1.4.3. ng dng kiu tha m ch iếu 1.5. Đq ui 1.5.1. Đị nh ngh ĩ a 1.5. 2. Các ng uyên l ý khi dù ng kth ut đệ qu i Chương 2: DANH SÁCH 2. 1. Kh ái ni m 2. 2. Da nh sách đặc 2. 2.1. Đị nh ngh ĩ a 2.2. 2. Biu din danh sác h đặc 2.2.3 . Các ph ép toán t rên da nh sác h đặc 2.2.4 . Ưu như c đim ca d anh s ách đặ c 2.3 . Da nh sác h l n k ết 2.3. 1. Định n ghĩa danh sách l iên kế t 2.3. 2. Biu d in danh sác h liê n kết 2.3. 3. Các ph ép to án trê n danh sá ch li ên kết 2.3. 4. Ưu nhượ c đim c a dan h sách l iên kết 2.4 . Da nh sác h đa li ên k ết 2. 4.1. Đị nh ngh ĩ a 2.4. 2. Biu d in danh sác h đa li ên kết 2.4. 3. Các phé p toán t rên danh sá ch đa liê n kết 2.5 . Da nh sác h li ên k ết k ép 2. 5.1. Đị nh ngh ĩ a 2.5. 2. Biu d in dan h sác h liê n kết kép 2.5. 3. Các phé p toán t rên danh sá ch liê n kết kép 2.6 . Da nh sác h li ên k ết v òng 2. 7. Da nh sác h hn ch ế 2. 7.1. Khái n i m 2. 7.2. Ng ăn xếp 2.7.2.1. Định nghĩ a 2.7.2.2. Biu di n ngăn xếp bng danh sách liê n kết 2.7.2.3. Các phép toán trên ngăn xếp được biu di n bng danh sách li ên kết 2. 7.3. ng đợi 2.7.3.1. Định nghĩ a ------------------------------------------------------------------------------------------------------------ 08/01/2011 - Cu trúc dliu – Trang 1

Upload: quangphuong1987

Post on 03-Nov-2015

222 views

Category:

Documents


0 download

DESCRIPTION

Số Bai Tập Từ Trang 37

TRANSCRIPT

  • CNG MN : CU TRC D LIU

    Chng 1: CC KHI NIM C BN1.1. Thut ton v cu trc d liu1.2. Cc kiu d liu c bn trong ngn ng C

    1.2.1. Kiu d liu n gin1.2.1.1. Kiu k t1.2.1.2. Kiu s nguyn1.2.1.3. Kiu s thc

    1.2.2. Kiu d liu c cu trc1.2.2.1. Kiu mng1.2.2.2. Kiu chui k t1.2.2.3. Kiu bn ghi

    1.3. Kiu con tr1.3.1. nh ngha1.3.2. Khai bo kiu con tr1.3.3. Hm a ch1.3.4. Cc php ton trn kiu con tr

    1.4. Kiu tham chiu1.4.1. nh ngha1.4.2. Khai bo kiu tham chiu1.4.3. ng dng kiu tham chiu

    1.5. qui1.5.1. nh ngha1.5.2. Cc nguyn l khi dng k thut qui

    Chng 2: DANH SCH2.1. Khi nim2.2. Danh sch c

    2.2.1. nh ngha2.2.2. Biu din danh sch c2.2.3. Cc php ton trn danh sch c2.2.4. u nhc im ca danh sch c

    2.3. Danh sch lin kt2.3.1. nh ngha danh sch lin kt2.3.2. Biu din danh sch lin kt2.3.3. Cc php ton trn danh sch lin kt2.3.4. u nhc im ca danh sch lin kt

    2.4. Danh sch a lin kt2.4.1. nh ngha2.4.2. Biu din danh sch a lin kt2.4.3. Cc php ton trn danh sch a lin kt

    2.5. Danh sch lin kt kp2.5.1. nh ngha2.5.2. Biu din danh sch lin kt kp2.5.3. Cc php ton trn danh sch lin kt kp

    2.6. Danh sch lin kt vng2.7. Danh sch hn ch

    2.7.1. Khi nim2.7.2. Ngn xp

    2.7.2.1. nh ngha2.7.2.2. Biu din ngn xp bng danh sch lin kt2.7.2.3. Cc php ton trn ngn xp c biu din bng danh sch lin kt

    2.7.3. Hng i2.7.3.1. nh ngha

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 1

  • 2.7.3.2. Biu din hng i bng danh sch lin kt2.7.3.3. Cc php ton trn hng i c biu din bng danh sch lin kt

    Chng 3: CY3.1. Mt s khi nim

    3.1.1. Cc nh ngha3.1.2. Cc cch biu din cy

    3.2. Cy nh phn3.2.1. nh ngha v tnh cht

    3.2.1.1. nh ngha3.2.1.2. Cc dng c bit ca cy nh phn3.2.1.3. Cc tnh cht ca cy nh phn

    3.2.2. Biu din cy nh phn3.2.2.1. Biu din cy nh phn bng danh sch c3.2.2.2. Biu din cy nh phn bng danh sch lin kt

    3.2.3. Cc php ton trn cy nh phn c biu din bng danh sch lin kt3.3. Cy nh phn tm kim

    3.3.1. nh ngha3.3.2. Cc php ton trn cy nh phn tm kim3.3.3. nh gi

    3.4. Cy nh phn cn bng3.4.1. Cy cn bng hon ton

    3.4.1.1. nh ngha3.4.1.2. nh gi

    3.4.2. Cy cn bng3.4.2.1. nh ngha3.4.2.2. Lch s cy cn bng (AVL)3.4.2.3. Chiu cao ca cy AVL3.4.2.4. Cu trc d liu cho cy AVL3.4.2.5. nh gi cy AVL

    3.5. Cy tng qut3.5.1. nh ngha3.5.2. Biu din cy tng qut bng danh sch lin kt3.5.3. Cc php duyt cy tng qut3.5.4. Cy nh phn tng ng

    ---o-O-o---

    Ti liu tham kho:

    [1] Xun Li, Cu trc d liu v gii thut, NXB Khoa hc v k thut, 2003[2] Nguyn Hng Chng, Cu trc d liu ng dng v ci t bng C, NXB TPHCM, 2003[3] L Xun Trng, Cu trc d liu bng ngn ng C, NXB Thng k, 1999[4] Larry Nyhoff Sanford Leestma, Lp trnh nng cao bng Pascal vi cc cu trc d liu,

    1991[5] Nguyn Trung Trc, Cu trc d liu, 2000[6] inh Mnh Tng, Cu trc d liu v thut ton, NXB Khoa hc v k thut, 2000[7] Yedidyah Langsam, Moshe J.Augenstein, Aaron M.Tenenbaum, Data Structures Using C

    and C++, Prentice Hall, 1996[8] Alfred V.Aho, John E.Hopcroft, Jeffrey D. Ullman, Data Structures and Algorithms, Addison

    Wesley, 1983

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 2

  • Chng 1: CC KHI NIM C BN1.1. Thut ton v cu trc d liu:- D liu: ni chung d liu l bt k nhng g m my tnh x l- Kiu d liu: Mi kiu d liu gm cc gi tr c cng chung cc tnh cht no v trn xc nh cc php ton- Cu trc d liu: l cch t chc v lu tr d liu trong my tnh- Thut ton (hay gii thut): l tp hp cc bc theo mt trnh t nht nh gii mt bi ton- Gia cu trc d liu v thut ton c quan h mt thit. Nu ta bit cch t chc cu trc d liu hp l th thut ton s n gin hn. Khi cu trc d liu thay i th thut ton s thay i theo

    1.2. Cc kiu d liu c bn trong ngn ng C:1.2.1. Kiu d liu n gin: Kiu d liu n gian co gi tr n duy nht, gm cc kiu:

    1.2.1.1. Kiu k t:Kiu ky t c gi tr l mt k t bt k t gia hai du nhy n, c kch thc 1 Byte v biu din c mt k t trong bng m ASCII, vi du: A , 9 hoc + . Gm 2 kiu k t chi tit:

    Kiu Min gi trChar t -128 n 127unsigned char t 0 n 255

    1.2.1.2. Kiu nguyn:Kiu nguyn c gi tr l mt s nguyn, v d s 1991, gm cc kiu nguyn sau:

    Kiu Min gi tr Kch thcint t -32768 n 32767 2 Byteunsigned int t 0 n 65535 2 Bytelong t -2147483648 n 2147483647 4 Byteunsigned long t 0 n 4294967295 4 Byte

    Lu : Cc kiu k t cng c th xem l kiu nguyn 1 Byte

    1.2.1.3. Kiu thc:Kiu thc co gi tr l mt s thc, vi du s 1.65, gm cc kiu thc sau:

    Kiu Min gi tr Kch thcfloat t 3.4E-38 n 3.4E+38 4 Bytedouble t 1.7E-308 n 1.7E+308 8 Bytelong double t 3.4E-4932 n 1.1E4932 10 Byte

    1.2.2. Kiu d liu c cu trc:Kiu d liu co cu truc co gia tri gm nhiu thanh phn, gm cac kiu sau:

    1.2.2.1. Kiu mng: Kiu mang gm nhiu thnh phn c cng kiu d liu, mi thnh phn gi l mt phn t, cc phn t c nh ch s t 0 tr i. vit mt phn t ca bin mng th ta vit tn mng, tip theo l ch s ca phn t t gia hai du ngoc vungVi du lnh: float A[3] ;Khai bo A l mt bin mng gm 3 phn t l A[0] , A[1] , A[2] u co gia tri thuc kiu float

    1.2.2.2. Kiu chui k t:Kiu chui ky t co gi tr l mt dy k t bt k t gia 2 du nhy kp, v d Le LiTa c th xem chui k t l mt mng m mi phn t l mt k tTa c th khai bo v gn gi tr cho bin chui k t nh sau:

    char ht[15] = Le Li ;

    1.2.2.3. Kiu bn ghi:

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 3

  • Kiu ban ghi gm nhiu thnh phn c kiu d liu ging nhau hoc khc nhau, mi thnh phn gi l mt trng. vit mt trng ca bin bn ghi ta vit tn bin bn ghi, tip theo l du chm, ri n tn trngV d: struct SVIEN

    { char ht[15]; int ns, t; float cc;};SVIEN SV;

    u tin khai bo kiu bn ghi SVIEN gm cc trng ht, ns, t, cc ln lt cha h tn, nm sinh, tui, chiu cao ca mt sinh vin. Sau khai bo bin SV thuc kiu SVIEN, nh vy SV l bin bn ghi gm cc trng c vit c th l SV.ht , SV.ns, SV.t v SV.ccV d#include #include #include main(){ struct SVIEN { char ht[15]; int ns, t; float cc; }; SVIEN SV; printf("\n Nhap ho ten:"); fflush(stdin); gets(SV.ht); printf("\n Nhap nam sinh:"); scanf("%d", &SV.ns); SV.t=2011-SV.ns; printf("\n Nhap chieu cao:"); scanf("%f", &SV.cc); printf("\n Ban %s , cao %7.2f m , %7d tuoi", SV.ht, SV.cc, SV.t); getch();}

    1.3. Kiu con tr:1.3.1. nh ngha:Con tr l mt bin m gi tr ca n l a ch ca mt i tng d liu trong b nh. i

    tng y c th l mt bin hoc mt hma ch ca mt vng nh trong b nh l a ch ca byte u tin ca vng nh

    1.3.2. Khai bo bin con tr:Ta c th khai bo kiu con tr trc, ri sau khai bo bin con tr thuc kiu con tr

    typedef kiud liu *kiucontr ;kiucontr bincontr ;

    hoc ta c th khai bo trc tip bin con tr nh sau:kiudliu *bincontr ;

    v d typedef float *xyz;xyz pf;

    hoc: float *pf;khai bo pf l bin con tr ch n mt gi tr kiu floatTng t ta c cc khai bo:

    float cc=1.65;char nm=0, *pc; // pc l con tr kiu k t charint ns=1991, t, *p, *p2;

    Khi bin p c gi tr l a ch ca mt vng nh m trong vng nh c cha d liu D th ta ni rng p l bin con tr ch n d liu D, vng nh m bin con tr p ch n s c tn gi l *p

    1.3.3. Hm a ch:&bin

    Tr v a ch ca bin trong b nh

    1.3.4. Cc php ton trn kiu con tr- Php gn: Ta c th gn a ch ca mt bin cho bin con tr cng kiu, v d

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 4

  • p = &ns ;Hoc gn gi tr ca hai bin con tr cng kiu cho nhau, v d

    p2 = p;Khng c dng cc lnh gn:

    p=&cc;hoc pf=&ns; hoc pf=p;- Php cng thm vo con tr mt s nguyn (i vi con tr lin quan n mng)- Php so snh bng nhau = = hoc khc nhau !=V d: if (p==p2) . . . hoc if (p!=p2) . . . - Hng con tr NULL: cho bit con tr khng ch n i tng no c, gi tr ny c th c gn cho mi bin con tr kiu bt k, v d p = NULL; hoc pf=NULL;

    - Php cp pht vng nhLnh bincontr = new kiudliu;Vd lnh p = new int;Cp pht vng nh c kch thc 2 Byte (ng vi kiu d liu int) v gn a ch ca vng nh ny cho bin con tr p, nh vy vng nh c tn gi l *pTng t ta c lnh pf=new float;

    - Php thu hi vng nhLnh delete bincontr;Vd lnh delete p;Thu hi vng nh m bin con tr p ch nV d:#include #include #include main(){ struct SVIEN { char ht[15]; int ns, t; float cc; }; SVIEN *p; p=new SVIEN; printf("\n Nhap ho ten:"); fflush(stdin); gets((*p).ht); printf("\n Nhap nam sinh:"); scanf("%d", &(*p).ns); (*p).t=2011-(*p).ns; printf("\n Nhap chieu cao:"); scanf("%f", &(*p).cc); printf("\n Ban %s , cao %7.2f m , %7d tuoi", (*p).ht, (*p).cc, (*p).t); delete p; getch();}

    1.4. Kiu tham chiu1.4.1. nh nghaNgn ng C c 3 loi bin:

    - Bin gi tr cha mt gi tr d liu thuc v mt kiu no (nguyn, thc, k t . . . ), v d int ns=1991;

    - Bin con tr cha a ch ca mt i tng, v d int *p=&ns;Hai loi bin ny u c cp b nh v c a ch ring- Loi th ba l bin tham chiu, l bin khng c cp pht b nh, khng c a ch

    ring, c dng lm b danh cho mt bin khc v dng chung vng nh ca bin

    1.4.2. Khai bo kiu tham chiuC php: kiudliu &binthamchiu = binbthamchiu ;Trong , binthamchiu s tham chiu n binbthamchiu v dng chung vng nh ca binbthamchiu ny. Vd float cc=1.65;

    float &f = cc;Khai bo 2 bin thc cc v f . Bin tham chiu f s tham chiu n bin cc cng kiu float, dng chung vng nh ca bin cc. Khi nhng thay i gia tri ca bin cc cng l nhng thay i ca bin f v ngc li, chng hn nu tip theo c lnh:

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 5

  • f = -7.6;th bin cc s c gi tr mi l -7.6

    1.4.3. ng dng kiu tham chiu#include #include void DOI(int x, int &y, int *z){ printf("\n Con truoc: %d %d %d", x, y, *z); x = x+1; y = y+2; *z = *z+3; printf("\n Con sau: %d %d %d", x, y, *z);}void main(){ int i=10, j=20, k=30; DOI(i, j, &k); printf("\n Chinh sau: %d %d %d", i, j, k); getch();}

    1.5. qui1.5.1. nh ngha

    Mt chng trnh gi ngay chnh n thc hin gi l tnh qui ca chng trnh

    1.5.2. Cc nguyn l khi dng k thut qui- Tham s ha bi ton: th hin kch c ca bi ton- Tm trng hp d nht: m ta bit ngay kt qu bi ton- Tm trng hp tng qut: a bi ton vi kch c ln v bi ton c kch c

    nh hnV d: Bi ton Thp H Ni: Cn chuyn n a t cc A (trong a ln di, a nh trn) sang cc B vi cc iu kin:

    . Mi ln ch c chuyn mt a

    . Trn cc cc, lun lun a ln di, a nh trn

    . c dng cc trung gian th ba CGii: - Tham s ha bi ton:

    Gi n: l s lng a cn chuynx: cc xut phty: cc chz: cc trung gian

    Hm con CHUYEN(n, x, y, z) dng chuyn n a t cc xut pht x sang cc ch y vi cc trung gian z

    - Tm trng hp d nht: n = 1 , khi ta chuyn a t cc x sang cc y- Tm trng hp tng qut:

    B1: Chuyn n-1 a t cc xut pht x sang cc trung gian zB2: Chuyn 1 a t cc xut pht x sang cc ch yB3: Chuyn n-1 a t cc trung gian z sang cc ch y

    #include #include int i;void CHUYEN(int &n, char x, char y, char z){ if (n==1)

    { i++; printf("\n %d : %c --> %c", i, x, y);}

    else { CHUYEN(n-1, x, z, y); CHUYEN(1, x, y, z); CHUYEN(n-1, z, y, x);}

    }void main(){ int n; printf("\n Nhap so dia can chuyen:"); scanf("%d", &n); CHUYEN(n, 'A', 'B', 'C'); getch();}

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 6

  • Chng 2: DANH SCH2.1. Khi nim

    - Danh sch: l mt dy cc phn t a0, a1, a2, . . . an-1 trong nu bit c phn t ng trc th s bit c phn t ng sau

    - n: l s phn t ca danh sch- Danh sch rng: l danh sch khng c phn t no c, tc n=0- Danh sch khi nim thng gp trong cuc sng, nh danh sch cc sinh vin trong mt

    lp, danh sch cc mn hc trong mt hc k . . .- C 2 cch c bn biu din danh sch:

    + Danh sch c: Cc phn t c lu tr k tip nhau trong b nh, phn t th i-1 c lu tr ngay trc phn t th i ging nh mt mng

    + Danh sch lin kt: Cc phn t c lu tr ti nhng vng nh khc nhau trong b nh, nhng chng c kt ni vi nhau nh cc vng lin kt

    - Cc php ton thng dng trn danh sch:+ Khi to danh sch (tc l lm cho danh sch c, nhng l danh sch rng)+ Kim tra xem danh sch c rng khng+ Lit k cc phn t c trong danh sch+ Tm kim phn t trong danh sch+ Thm phn t vo danh sch+ Xa phn t ra khi danh sch+ Sa cc thng tin ca phn t trong danh sch+ Thay th mt phn t trong danh sch bng mt phn t khc+ Sp xp th t cc phn t trong danh sch+ Ghp mt danh sch vo mt danh sch khc+ Trn cc danh sch c th t c mt danh sch mi cng c th t+ Tch mt danh sch ra thnh nhiu danh sch. . .

    - Trong thc t mt bi ton c th ch dng mt s php ton no , nn ta phi bit cch biu din danh sch cho ph hp vi bi ton

    2.2. Danh sch c2.2.1. nh ngha

    Cc phn t ca danh sch c lu tr k tip nhau trong b nh di hnh thc mt mng

    2.2.2. Biu din danh sch cXt danh sch c ti a 100 sinh vin gm cc thng tin: h tn, chiu cao, cn nng tiu

    chun, nh : L Li 1.7 65L Bi 1.8 75L Vi 1.4 35L Ni 1.6 55L Hi 1.5 45

    Khai bo:#include #include #include const int Nmax=100;typedef char infor1[15];typedef float infor2;typedef int infor3;struct element{ infor1 ht; infor2 cc; infor3 cntc;};typedef element DS[Nmax];DS A;int n;Hng Nmax kiu int cha s phn t ti a c th c ca danh sch

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 7

  • Bin n kiu int cha s phn t thc t hin nay ca danh sch, v d n=5Kiu bn ghi element gm cc trng ht, cc, cntc ln lt cha h tn, chiu cao, cn nng tiu chun ca mt sinh vininfor1, infor2, infor3 ln lt l cc kiu d liu ca cc trng ht, cc, cntcDS l kiu mng gm Nmax phn t kiu elementBin A kiu DS l bin mng gm Nmax phn t kiu element

    2.2.3. Cc php ton trn danh sch c- Khi to danh sch: Khi mi khi to danh sch l rng, ta cho n nhn gi tr 0

    void Create(DS A, int &n){ n=0;}

    - Lit k cc phn t trong danh sch: Ta lit k cc phn t t phn t u tin tr ivoid Display(DS A, int n){ int i; for (i=0; i

  • Danh sch lin kt l danh sch m cc phn t c kt ni vi nhau nh cc vng lin kt

    2.3.2. Biu din danh sch lin ktXt danh sch sinh vin gm cc thng tin: h tn, chiu cao, cn nng tiu chun

    #include #include #include typedef char infor1[15];typedef float infor2;typedef int infor3;struct element{ infor1 ht; infor2 cc; infor3 cntc; element *next;};typedef element *List;List F; // hoc element *F;

    Kiu bn ghi element gm cc trng ht, cc, cntc dng cha cc thng tin ca mt phn t trong danh sch, ngoi ra cn c thm trng lin kt next cha a ch ca phn t tip theo trong danh schKiu con tr List dng ch n mt phn t kiu elementBin con tr F dng ch n phn t u tin trong danh sch lin kt

    2.3.3. Cc php ton trn danh sch lin kt- Khi to danh sch: Khi mi khi to danh sch l rng ta cho F nhn gi tr NULL

    void Create(List &F){ F=NULL;}

    - Lit k cc phn t trong danh sch: Ta lit k cc phn t k t phn t u tin c ch bi bin con tr F v da vo trng lin kt next ln lt lit k cc phn t tip theo

    Bin con tr p ln lt ch n tng phn t trong danh sch bt u t phn t u tin ch bi F tr ivoid Display(List F){ List p; p=F; while (p != NULL) { printf("\n %15s %7.2f %7d", (*p).ht , (*p).cc , (*p).cntc); p=(*p).next; }}

    - Tm kim mt phn t trong danh sch: Tm phn t c h tn x trong danh schTa tm bt u t phn t u tin c ch bi F tr i cho n khi tm c phn t cn

    tm hoc kim tra xong phn t cui cng m khng c th dng. Hm Search(F, x) kiu List, tm v tr v a ch ca phn t u tin tm c hoc tr v gi tr NULL nu tm khng cList Search(List F, infor1 x){ List p; p=F; while ( (p!=NULL) && strcmp((*p).ht,x) !=0 ) p= (*p).next; return p;}

    - Thm mt phn t vo u danh sch: Thm mt phn t c h tn x, chiu cao y, cn nng tiu chun z vo u danh sch. Bin con tr p ch n phn t mi cn thm vo

    void InsertFirst(List &F, infor1 x, infor2 y, infor3 z){ List p; p=new element; strcpy((*p).ht,x); (*p).cc=y; (*p).cntc=z; (*p).next=F; // 1 F=p; // 2}

    - Thm mt phn t vo danh sch c th t

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 9

  • Thm mt phn t c h tn x, chiu cao y, cn nng tiu chun z vo danh sch trc c th t h tn tng dn

    p ch n phn t mi cn thm voCc bin con tr before v after ln lt ch n phn t ng ngay trc v ngay sau phn

    t mi. tm after th ta tm bt u t phn t u tin ch bi F tr i cho n khi gp c phn t u tin c h tn ln hn x th dng, ri chn phn t mi vovoid InsertSort(List &F, infor1 x, infor2 y, infor3 z){ List p, before, after; p=new element; strcpy((*p).ht,x); (*p).cc=y; (*p).cntc=z; after=F; while ( (after!=NULL) && ( strcmp((*after).ht,x)

  • infor2 cc; infor3 cntc; element *next1, *next2;};typedef element *List;List F1, F2;

    Bin con tr F1 ch n phn t u tin trong danh sch c sp theo th t h tn tng dn, bin con tr F2 ch n phn t u tin c sp theo th t chiu cao tng dn

    2.4.3. Cc php ton trn danh sch a lin kt- Khi to danh sch: Khi mi khi to danh sch l rng, ta cho F1 v F2 nhn gi tr

    NULLvoid Create(List &F1, List &F2){ F1=NULL; F2=NULL;}

    - Lit k cc phn t trong danh sch theo th t h tn: Ta lit k bt u t phn t u tin ch bi bin con tr F1, v da vo trng lin kt next1 ln lt lit k cc phn t tip theovoid Display1(List F1){ List p; p=F1; while (p != NULL) { printf("\n %15s %7.2f %7d", (*p).ht , (*p).cc , (*p).cntc);

    p=(*p).next1; }}

    - Lit k cc phn t trong danh sch theo th t chiu cao: Ta lit k bt u t phn t u tin ch bi bin con tr F2, v da vo trng lin kt next2 ln lt lit k cc phn t tip theovoid Display2(List F2){ List p; p=F2; while (p != NULL) { printf("\n %15s %7.2f %7d", (*p).ht , (*p).cc , (*p).cntc);

    p=(*p).next2; }}

    - Thm mt phn t c h tn x, chiu cao y, cn nng tiu chun z vo danh sch:Bin con tr p ch n phn t mi cn thm vo. Bin con tr before ch n phn t ng

    ngay trc phn t mi theo th t h tn v th t chiu cao. Bin con tr after ch n phn t ng ngay sau phn t c ch bi beforevoid InsertElement(List &F1, List &F2, infor1 x, infor2 y, infor3 z){ List p, before, after; p=new element; strcpy((*p).ht,x); (*p).cc=y; (*p).cntc=z; // Tim before va after theo ho ten after=F1; while ( (after!=NULL) && (strcmp((*after).ht,x)

  • void DeleteElement(List &F1, List &F2, infor1 x, infor2 y){ List p, t, before; // Tim p // Tim before theo ho ten p=F1; while ( (p!=NULL) && ( (strcmp((*p).ht,x)Info = x;

    p->pPrev = NULL;p->pNext = NULL;return p;

    }2.5.3. Cc php ton trn danh sch lin kt kp

    Tng t danh sch lin kt n, ta c th xy dng cc thao tc c bn trn danh sch lin kt kp (xu kp). Mt s thao tc khng khc g trn xu n. Di y l mt s thao tc c trng ca xu kp:

    - Chn mt phn t vo danh sch:

    C 4 loi thao tc chn new_ele vo danh sch:

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 12

  • Cch 1: Chn vo u danh sch

    Ci t :

    void AddFirst(DLIST &l, DNODE* new_ele){ if (l.pHead==NULL) //Xu rng { l.pHead = new_ele; l.pTail = l.pHead;}else{ new_ele->pNext = l.pHead; // (1)l.pHead ->pPrev = new_ele; // (2)l.pHead = new_ele; // (3)}}NODE* InsertHead(DLIST &l, Data x){ NODE* new_ele = GetNode(x); if (new_ele ==NULL) return NULL;if (l.pHead==NULL) { l.pHead = new_ele; l.pTail = l.pHead;}else{ new_ele->pNext = l.pHead; // (1) l.pHead ->pPrev = new_ele; // (2) l.pHead = new_ele; // (3)}return new_ele;}

    Cch2: Chn vo cui danh sch

    Ci t : void AddTail(DLIST &l, DNODE *new_ele){ if (l.pHead==NULL) { l.pHead = new_ele; l.pTail = l.pHead;}else{ l.pTail->Next = new_ele; // (1)new_ele ->pPrev = l.pTail; // (2)l.pTail = new_ele; // (3)}}

    NODE* InsertTail(DLIST &l, Data x) { NODE* new_ele = GetNode(x); if (new_ele ==NULL) return NULL;if (l.pHead==NULL) { l.pHead = new_ele; l.pTail = l.pHead;}else{ l.pTail->Next = new_ele; // (1)new_ele ->pPrev = l.pTail; // (2)l.pTail = new_ele; // (3)}return new_ele;}

    Cch 3 : Chn vo danh sch sau mt phn tq

    Ci t :

    void AddAfter(DLIST &l, DNODE* q,DNODE* new_ele){ DNODE* p = q->pNext; if ( q!=NULL) { new_ele->pNext = p; //(1)new_ele->pPrev = q; //(2)q->pNext = new_ele; //(3) if(p != NULL) p->pPrev = new_ele; //(4)if (q == l.pTail)l.pTail = new_ele;

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 13

  • }else //chn vo u danh sch AddFirst(l, new_ele);}

    void InsertAfter(DLIST &l, DNODE *q, Data x){ DNODE* p = q->pNext;

    NODE* new_ele = GetNode(x);if (new_ele ==NULL) return NULL;

    if ( q!=NULL) { new_ele->pNext = p; //(1)new_ele->pPrev = q; //(2)q->pNext = new_ele; //(3) if(p != NULL) p->pPrev = new_ele; //(4)if(q == l.pTail)l.pTail = new_ele;}else //chn vo u danh sch AddFirst(l, new_ele);}

    Cch 4 : Chn vo danh sch trc mt phn t q

    Ci t : void AddBefore(DLIST &l, DNODE q, DNODE* new_ele){ DNODE* p = q->pPrev;if ( q!=NULL) { new_ele->pNext = q; //(1)new_ele->pPrev = p; //(2)q->pPrev = new_ele; //(3) if(p != NULL) p->pNext = new_ele; //(4)if(q == l.pHead)l.pHead = new_ele;}else //chn vo u danh sch AddTail(l, new_ele);}

    void InsertBefore(DLIST &l, DNODE q, Data x) { DNODE* p = q->pPrev;

    NODE* new_ele = GetNode(x); if (new_ele ==NULL) return NULL; if ( q!=NULL) { new_ele->pNext = q; //(1)new_ele->pPrev = p; //(2)q->pPrev = new_ele; //(3) if(p != NULL) p->pNext = new_ele; //(4)if(q == l.pHead)l.pHead = new_ele;}else //chn vo u danh sch AddTail(l, new_ele);}

    - Hy mt phn t khi danh sch

    C 5 loi thao tc thng dng hy mt phn t ra khi xu. Chng ta s ln lt kho st chng.

    Hy phn t u xu:

    Data RemoveHead(DLIST &l){ DNODE *p;Data x = NULLDATA; if ( l.pHead != NULL){ p = l.pHead; x = p->Info;l.pHead = l.pHead->pNext;l.pHead->pPrev = NULL;

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 14

  • delete p;if(l.pHead == NULL) l.pTail = NULL;else l.pHead->pPrev = NULL;} return x; }

    Hy phn t cui xu:

    Data RemoveTail(DLIST &l){ DNODE *p;Data x = NULLDATA;if ( l.pTail != NULL) {p = l.pTail; x = p->Info;l.pTail = l.pTail->pPrev;l.pTail->pNext = NULL;delete p;if(l.pHead == NULL) l.pTail = NULL;else l.pHead->pPrev = NULL;} return x; }

    Hy mt phn t ng sau phn t q

    void RemoveAfter (DLIST &l, DNODE *q){ DNODE *p; if ( q != NULL){ p = q ->pNext ;if ( p != NULL){ q->pNext = p->pNext;if(p == l.pTail) l.pTail = q;else p->pNext->pPrev = q;delete p;}} else RemoveHead(l);}

    Hy mt phn t ng trc phn t q

    void RemoveAfter (DLIST &l, DNODE *q){ DNODE *p; if ( q != NULL){ p = q ->pPrev;if ( p != NULL){ q->pPrev = p->pPrev;if(p == l.pHead) l.pHead = q;else p->pPrev->pNext = q;delete p;}} else RemoveTail(l);}

    Hy 1 phn t c kho k

    int RemoveNode(DLIST &l, Data k){ DNODE *p = l.pHead;NODE *q;while( p != NULL){ if(p->Info == k) break;p = p->pNext;}If (p == NULL) return 0; //Khng tm thy k q = p->pPrev;if ( q != NULL){ p = q ->pNext ;if ( p != NULL){ q->pNext = p->pNext;if(p == l.pTail)

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 15

  • l.pTail = q;else p->pNext->pPrev = q;}} else //p l phn t u xu { l.pHead = p->pNext;if(l.pHead == NULL)

    l.pTail = NULL;else l.pHead->pPrev = NULL;}delete p;return 1;}

    * Nhn xt: Danh sch lin kt kp v mt c bn c tnh cht ging nh xu n. Tuy nhin n c mt s tnh cht khc xu n nh sau:

    Xu kp c mi lin kt hai chiu nn t mt phn t bt k c th truy xut mt phn t bt k khc. Trong khi trn xu n ta ch c th truy xut n cc phn t ng sau mt phn t cho trc. iu ny dn n vic ta c th d dng hy phn t cui xu kp, cn trn xu n thao tc ny tn chi ph O(n).

    B li, xu kp tn chi ph gp i so vi xu n cho vic lu tr cc mi lin kt. iu ny khin vic cp nht cng nng n hn trong mt s trng hp. Nh vy ta cn cn nhc la chn CTDL hp l khi ci t cho mt ng dng c th.

    2.6. Danh sch lin kt vngDanh sch lin kt vng l mt danh sch n (hoc kp) m phn t ng cui cng ch

    n phn t u tin trong danh sch. biu din ta c th s dng cc k thut biu din nh danh sch n (hoc kp)

    Ta c th khai bo xu vng nh khai bo xu n (hoc kp). Trn danh sch vng ta c cc thao tc thng gp sau:

    - Tm phn t trn danh sch vng

    Danh sch vng khng c phn t u danh sch r rt, nhng ta c th nh du mt phn t bt k trn danh sch xem nh phn t u xu kim tra vic duyt qua ht cc phn t ca danh sch hay cha.

    NODE* Search(LIST &l, Data x){ NODE *p;p = l.pHead;do{ if ( p->Info == x)return p;p = p->pNext;}while (p != l.pHead); // cha i gip vngreturn p;}

    - Thm phn t u xu:

    void AddHead(LIST &l, NODE *new_ele){ if(l.pHead == NULL) //Xu rng { l.pHead = l.pTail = new_ele;l.pTail->pNext = l.pHead;}else{ new_ele->pNext = l.pHead;l.pTail->pNext = new_ele;l.pHead = new_ele;}}

    - Thm phn t cui xu:

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 16

  • void AddTail(LIST &l, NODE *new_ele){ if(l.pHead == NULL) //Xu rng { l.pHead = l.pTail = new_ele;l.pTail->pNext = l.pHead;}else{ new_ele->pNext = l.pHead;l.pTail->pNext = new_ele;l.pTail = new_ele;}}

    - Thm phn t sau nt q:

    void AddAfter(LIST &l, NODE *q, NODE *new_ele){ if(l.pHead == NULL) //Xu rng { l.pHead = l.pTail = new_ele;l.pTail->pNext = l.pHead;}else{ new_ele->pNext = q->pNext;q->pNext = new_ele; if(q == l.pTail)l.pTail = new_ele;}}

    - Hy phn t u xu:

    void RemoveHead(LIST &l){ NODE *p = l.pHead; if(p == NULL) return;if (l.pHead = l.pTail) l.pHead = l.pTail = NULL;else{ l.pHead = p->Next;if(p == l.pTail)l.pTail->pNext = l.pHead;}delete p;}

    - Hy phn t ng sau nt q:

    void RemoveAfter(LIST &l, NODE *q){ NODE *p; if(q != NULL){ p = q ->Next ;if ( p == q) l.pHead = l.pTail = NULL;else{ q->Next = p->Next;if(p == l.pTail)l.pTail = q;}delete p;} }

    Nhn xt: i vi danh sch vng, c th xut pht t mt phn t bt k duyt ton b danh sch

    2.7. Danh sch hn ch2.7.1. Khi nimDanh sch hn ch l danh sch m cc php ton ch c thc hin mt phm vi no

    ca danh sch, trong thng ngi ta ch xt cc php thm vo hoc loi b ch c thc hin u danh sch. Danh sch hn ch c th c biu din bng danh sch c hoc bng danh sch lin kt. C 2 loi danh sch hn ch ph bin l ngn xp v hng i

    2.7.2. Ngn xp (hay chng hoc Stack)------------------------------------------------------------------------------------------------------------

    08/01/2011 - Cu trc d liu Trang 17

  • 2.7.2.1. nh nghaNgn xp l mt danh sch m cc php ton thm vo hoc loi b ch c thc hin

    cng mt u ca danh sch. u ny gi l nh ca ngn xp. Nh vy phn t thm vo u tin s c ly ra cui cng

    2.7.2.2. Biu din ngn xp bng danh sch lin ktXt ngn xp cc sinh vin gm h tn, chiu cao, cn nng tiu chun

    typedef char infor1[15];typedef float infor2;typedef int infor3;struct element{ infor1 ht; infor2 cc; infor3 cntc; element *next;};typedef element *Stack;Stack S;

    Ta dng danh sch lin kt cha cc phn t trong ngn xp. Mt phn t trong danh sch lin kt cha mt phn t trong ngn xp theo th t l phn t u tin trong danh sch lin kt cha phn t nh ca ngn xp

    Stack l kiu con tr ch n 1 phn t trong danh schBin con tr S ch n phn t u tin trong danh sch

    2.7.2.3. Cc php ton trn ngn xp c biu din bng danh sch lin kt- Khi to ngn xp: Khi mi khi to, ngn xp l rng ta cho S nhn gi tr NULL

    void Create(Stack &S){ S=NULL;}

    - Php lit k cc phn t trong ngn xp:void Display(Stack S){ Stack p; p=S; while (p != NULL) { printf("\n %15s %7.2f %7d", (*p).ht , (*p).cc , (*p).cntc);

    p=(*p).next; }}

    - Php thm mt phn t c h tn x, chiu cao y, cn nng tiu chun z vo ngn xp (thm vo u ngn xp):void InsertStack(Stack &S, infor1 x, infor2 y, infor3 z){ Stack p; p=new element; strcpy((*p).ht,x); (*p).cc=y; (*p).cntc=z; (*p).next=S; S=p;}

    - Php xa mt phn t trong ngn xp (xa phn t u tin) void DeleteStack(Stack &S){ Stack p; if (S!=NULL) { p=S; S=(*p).next; delete p; }}

    2.7.3. Hng i (hay Queue):2.7.3.1. nh ngha

    Hng i l danh sch m php thm vo c thc hin u ny cn php loi b c thc hin u kia ca danh sch. Nh vy phn t thm vo u tin s c ly ra u tin

    2.7.3.2. Biu din hng i bng danh sch lin ktXt hng i cc sinh vin gm h tn, chiu cao, cn nng tiu chun

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 18

  • struct element{ infor1 ht; infor2 cc; infor3 cntc; element *next;};typedef element *Queue;Queue Front, Rear;

    Ta dng danh sch lin kt cha cc phn t trong hng i, mt phn t trong danh sch lin kt cha mt phn t trong hng i theo th t l phn t u tin trong danh sch lin kt cha phn t u tin trong hng i

    Bin con tr Front ch n phn t u tin ca danh sch lin kt, chnh l phn t u tin ca hng i

    Bin con tr Rear ch n phn t cui cng ca danh sch lin kt, chnh l phn t cui cng ca hng i

    2.7.3.3. Cc php ton trn hng i c biu din bng danh sch lin kt- Khi to hng i: Khi mi khi to, hng i l rng ta cho Front v Rear nhn gi tr

    NULLvoid Create(Queue &Front, Queue &Rear){ Front=NULL; Rear=NULL;}

    - Lit k cc phn t trong hng i:void Display(Queue Front, Queue Rear){ Queue p; p=Front; while (p != NULL) { printf("\n %20s %7.2f %7d" , (*p).ht , (*p).cc , (*p).cntc);

    p=(*p).next; }}

    - Thm mt phn t c h tn x, chiu cao y, cn nng tiu chun z vo hng i (vo cui danh sch lin kt)void InsertQueue(Queue &Front, Queue &Rear, infor1 x, infor2 y, infor3 z){ Queue p; p=new element; strcpy((*p).ht,x); (*p).cc=y; (*p).cntc=z; (*p).next=NULL; // 1 if (Front==NULL) Front=p; // 2 else (*Rear).next=p; // 2 Rear=p; // 3}

    - Php xa mt phn t trong hng i (xa phn t u tin) void DeleteQueue(Queue &Front, Queue &Rear){ Queue p; if (Front!=NULL) { p=Front;

    Front=(*Front).next; // 1 if (Front==NULL) Rear=NULL; // 2 delete p; }}

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 19

  • BI TP L THUYTBI 1: Phn tch u, khuyt im ca xu lin kt so vi mng. Tng qut ha cc trng hp nn dng xu lin kt.BI 2: Xy dng mt cu trc d liu thch hp biu din a thc P(x) c dng :

    P(x) = c1xn1 + c2xn2 +...+ckxnk Bit rng:

    - Cc thao tc x l trn a thc bao gm :+ Thm mt phn t vo cui a thc+ In danh sch cc phn t trong a thc theo :

    . th t nhp vo

    . ngc vi th t nhp vo+ Hy mt phn t bt k trong danh sch

    - S lng cc phn t khng hn ch- Ch c nhu cu x l a thc trong b nh chnh.

    a)Gii thch l do chn CTDL nh ngha.b)Vit chng trnh con c lng gi tr ca a thc P(x) khi bit x.c)Vit chng trnh con rt gn biu thc (gp cc phn t cng s m).Bi 3: Xt on chng trnh to mt xu n gm 4 phn t (khng quan tm d liu) sau y:Dx = NULL; p=Dx;Dx = new (NODE);for(i=0; i < 4; i++){ p = p->next;

    p = new (NODE);}(*p).next = NULL;on chng trnh c thc hin c thao tc to nu trn khng ? Ti sao ? Nu khng th c th sa li nh th no cho ng ?Bi 4: Mt ma trn ch cha rt t phn t vi gi tr c ngha (v d: phn t khc khng) c gi l ma trn tha.Dng cu trc xu lin kt t chc biu din mt ma trn tha sao cho tit kim nht (ch lu tr cc phn t c ngha).a)Vit chng trnh cho php nhp, xut ma trn.b)Vit chng trnh con cho php cng hai ma trn.Bi 5: Bi ton Josephus : c N ngi quyt nh t st tp th bng cch ng trong vng trn v git ngi th M quanh vng trn, thu hp hng ng li khi tng ngi ln lt ng khi vng trn. Vn l tm ra th t tng ngi b git.V d : N = 9, M = 5 th th t l 5, 1, 7, 4, 3, 6, 9, 2, 8Hy vit chng trnh gii quyt bi ton Josephus, x dng cu trc xu lin kt.Bi 6: Hy cho bit ni dung ca stack sau mi thao tc trong dy :EAS*Y**QUE***ST***I*ONVi mt ch ci tng trng cho thao tc thm ch ci tng ng vo stack, du * tng trng cho thao tc ly ni dung mt phn t trong stack in ln mn hnh.Hy cho bit sau khi hon tt chui thao tc, nhng g xut hin trn mn hnh ?Bi 7: Hy cho bit ni dung ca hng i sau mi thao tc trong dy :EAS*Y**QUE***ST***I*ONVi mt ch ci tng trng cho thao tc thm ch ci tng ng vo hng i, du * tng trng cho thao tc ly ni dung mt phn t trong hng i in ln mn hnh.Hy cho bit sau khi hon tt chui thao tc, nhng g xut hin trn mn hnh ?Bi 8: Gi s phi xy dng mt chng trnh son tho vn bn, hy chn cu trc d liu thch hp lu tr vn bn trong qu trnh son tho. Bit rng :- S dng vn bn khng hn ch.- Mi dng vn bn c chiu di ti a 80 k t.- Cc thao tc yu cu gm :

    + Di chuyn trong vn bn (ln, xung, qua tri, qua phi)+ Thm, xo sa k t trong mt dng

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 20

  • + Thm, xo mt dng trong vn bn+ nh du, sao chp khi

    Gii thch l do chn cu trc d liu .Bi 9: Vit hm ghp 2 xu vng L1, L2 thnh mt xu vng L vi phn t u xu l phn t u xu ca L1.

    BI TP THC HNH

    Bi 10: Ci t thut ton sp xp Chn trc tip trn xu kp. C pht huy u th ca thut ton hn trn mng hay khng ?Bi 11: Ci t thut ton QuickSort theo kiu khng qui.Bi 12: Ci t thut ton MergeSort trn xu kp.Bi 13: Ci t li chng trnh qun l nhn vin theo bi tp 6 chng 1, nhng s dng cu trc d liu xu lin kt. Bit rng s nhn vin khng hn ch.Bi 14: Ci t mt chng trnh son tho vn bn theo m t trong bi tp 8.Bi 15: Ci t chng trnh to mt bng tnh cho php thc hin cc php tnh +, -, *, /, div trn cc s c ti a 30 ch s, c chc nng nh (M+, M-, MC, MR).Bi 16: Ci t chng trnh cho php nhn vo mt biu thc gm cc s, cc ton t +, -, *, /, %, cc hm ton hc sin, cos, tan, ln, ex, du m, ng ngoc "(", ")" v tnh ton gi tr ca biu thc ny.

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 21

  • Chng 3: CYTrong chng ny chng ta s nghin cu m hnh d liu cy. Cy l mt cu trc phn

    cp trn mt tp hp no cc i tng. Mt v d quen thuc v cy, l cy th mc.Cy c s dng rng ri trong rt nhiu vn khc nhau. Chng hn, n c p dng t chc thng tin trong cc h c s d liu, m t cu trc c php ca cc chng trnh ngun khi xy dng cc chng trnh dch. Rt nhiu cc bi ton m ta gp trong cc lnh vc khc nhau c quy v vic thc hin cc php ton trn cy. Trong chng ny chng ta s trnh by nh ngha v cc khi nim c bn v cy. Chng ta cng s xt cc phng php biu din cy v s thc hin cc php ton c bn trn cy. Sau chng ta s nghin cu k mt dng cy c bit, l cy tm kim nh phn.

    3.1. Mt s khi nim3.1.1. Cc nh ngha

    - Cy: l mt tp hp hu hn cc phn t, mi phn t gi l mt nt (Node), trong c mt nt c bit gi l gc (Root), gia cc nt c mt quan h phn cp gi l quan h cha conV d cho cy cc k t Mc 1 gc

    Mc 2

    Mc 3

    Mc 4

    A: nt gcA l nt cha ca B, C, DB, C, D l cc nt con ca A

    - Cy rng: cy khng c nt no c- Cp ca nt: s nt con ca n, vd nt B c cp l 2- Cp ca cy: cp ln nht ca cc nt c trn cy. Cy c cp n gi l cy n phn, v d

    cy trn l cy tam phn- L: nt c cp l 0, v d cc l F, C, G, J- Mc: Nt gc c mc l 1. Nt cha c mc i th nt con c mc i+1- Chiu cao ca cy: mc ln nht trn cy, v d cy trn c chiu cao 4- Nt trc, nt sau: Nt x l nt trc ca nt y nu cy con gc x c cha nt y, khi y

    l nt sau ca nt x. v d D l nt trc ca nt J- ng i (path): Dy nt u1, u2, . . . uk m nt bt k ui l cha ca nt ui+1 th dy l

    ng i t nt u1 n nt uk- di ng i: s cnh c trn ng i, v d dy DHJ l ng i t nt D n nt J

    vi di l 2- Cy c th t (ordered tree): l cy m nu ta thay i v tr ca cc cy con th ta c mt

    cy mi. Nh vy nu ta i cc nt bn tri v bn phi th ta c mt cy mi, v d sau y l 2 cy khc nhau:

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 22

    A

    CA D

    GA

    B

    FA

    EA

    HA

    IA

    JA

    KA

    AJA

    AA

  • - Rng: l tp hp hu hn cc cy phn bit

    3.1.2. Cc cch biu din cy- Biu din cy bng th- Biu din cy bng gin - Biu din cy bng cc cp du ngoc lng nhau- Biu din cy bng phng php cn l- Biu din cy bng phng php ch s

    3.2. Cy nh phn3.2.1. nh ngha v tnh cht

    3.2.1.1. nh nghaCy nh phn l cy m mi nt trn cy c ti a 2 con. Trong cy nh phn ngi ta c phn bit nt con tri v nt con phi, nh vy cy nh phn l cy c th t

    T 0

    1 2

    3 5 6

    8 13 14

    3.2.1.2. Cc dng c bit ca cy nh phnCy nh phn suy bin l cy lch tri hoc cy lch phiCy zic-zcCy nh phn hon chnh: cc nt ng vi cc mc tr mc cui cng u c 2 con

    Cy nh phn y : c cc nt ti a c mi mcCy nh phn y l mt trng hp c bit ca cy nh phn hon chnh

    3.2.1.3. Cc tnh cht Mc i ca cy nh phn c ti a 2i-1 nt Cy nh phn vi chiu cao i c ti a 2i-1 nt Cy nh phn vi n nt th chiu cao h>=log2(n)

    3.2.2. Biu din cy nh phn

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 23

    BJA

    CA

    CJA

    BJA

    A

    B CA

    EA

    FA

    HA

    IA

    DA

    GA

  • 3.2.2.1. Biu din cy nh phn bng danh sch cVi cy nh phn hon chnh, ta c th nh s th t cho cc nt trn cy t gc tr xung

    v t tri sang phi bt u t 0 tr i, khi nt th i c nt con tri l th 2i+1 v c nt con phi th 2i+2

    Khi ta dng mt mng 1 chiu lu tr cc nt trn cy nh phn, trong phn t th i ca mng cha nt th i ca cy nh phn

    Mi nh ca cy c biu din bi bn ghi gm ba trng: trng data m t thng tin gn vi mi nh, trng left ch nh con tri, trng right ch nh con phi. Gi s cc nh ca cy c nh s t 0 n max-1, khi cu trc d liu biu din cy nh phn c khai bo nh sau.

    Khai bo: const int max= . . . ;struct element{ char data; // trng cha d liu int left; int right;};typedef node Tree[max];Tree V;

    V d cy nh phn cho trn c biu din nh sau:

    data left right0 A 1 21 B 3 -12 C 5 63 D -1 84 -1 -15 E -1 -16 F 13 147 -1 -18 G -1 -19 0 010 0 0

    3.2.2.2. Biu din cy nh phn bng danh sch lin ktChng ta cn c th s dng con tr ci t cy nh phn. Trong cch ny mi bn ghi

    element biu din mt nt ca cy gm trng data cha d liu ca bn thn nt, ngoi ra cn c thm 2 trng lin kt left, right ln lt ch n nt con tri v con phi ca n. Ta c khai bo sau:

    struct element{ char data; // trng cha d liu element *left , *right;};typedef element *Tree;Tree T;

    Kiu bn ghi element cha mt nt ca cy nh phn, gm trng data cha d liu ca nt, hai trng con tr left, right ln lt cha a ch ca nt con tri v a ch ca nt con phi ca nKiu con tr Tree cha a ch ca 1 nt ca cy nh phnBin con tr T kiu Tree cha a ch ca nt gc ca cy nh phn Vi cch ci t ny, cu trc d liu biu din cy nh phn trn c minh ha bi hnh sau:

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 24

  • T

    A

    B C

    D E F G

    H I J K

    T nay v sau chng ta s ch s dng cch biu din cy nh phn bng con tr. Cc php ton i vi cy nh phn sau ny u c th hin trong cch biu din bng con tr.

    3.2.3. Cc php ton trn cy nh phn c biu din bng danh sch lin kta. Khi to: Khi mi khi to, cy l rng ta cho T nhn gi tr NULL

    void Create(Tree &T){ T = NULL;}

    b. Cc php duyt cyPhp duyt cy l lit k tt c cc nt c trn cy mi nt ng 1 ln theo mt th t no

    . Thng c 3 php duyt cy l:- Duyt cy theo th t trc (i vi gc): Kiu duyt ny trc tin thm nt

    gc, sau thm cc nt ca cy con tri ri n cy con phi.. Gc

    . Cy con tri

    . Cy con phiVi du khi duyt cy nhi phn a cho theo th t trc ta c day nut ABDGCEFHIHm duyt c th trnh by n gin nh sau:

    void DuyetTruoc(Tree T){ if (T != NULL)

    { printf((*T).data); DuyetTruoc( (*T).left ); DuyetTruoc( (*T).right );}

    }- Duyt cy theo th t gia: Kiu duyt ny trc tin thm nt cc nt ca cy

    con tri, sau thm nt gc ri n cy con phi.. Cy con tri. Gc

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 25

  • . Cy con phiVi du khi duyt cy nhi phn a cho theo th t gia ta c day nut DGBAECHFIHm duyt c th trnh by n gin nh sau:

    void DuyetGiua(Tree T){ if (T != NULL)

    { DuyetGiua( (*T).left ); printf((*T).data);

    DuyetGiua( (*T).right );}

    }- Duyt cy theo th t sau:Kiu duyt ny trc tin thm cc nt ca cy con tri,

    sau thm cc ca cy con phi, cui cng thm nt gc. Cy con tri. Cy con phi. Gc

    Vi du khi duyt cy nhi phn a cho theo th t sau ta c day nut GDBEHIFCAHm duyt c th trnh by n gin nh sau:

    void DuyetSau(Tree T){ if (T != NULL)

    { DuyetSau( (*T).left ); DuyetSau( (*T).right );

    printf((*T).data);}

    }c. Hm to cy nh phn mi t 2 cy nh phn cho trc

    d. To trc tip cy nh phn

    3.3. Cy nh phn tm kim3.3.1. nh ngha

    Cy nh phn tm kim (CNPTK) l cy nh phn trong ti mi nt bt k th kha ca nt ang xt ln hn kha ca tt c cc nt thuc cy con tri v nh hn kha ca tt c cc nt thuc cy con phi.

    Nh rng buc v kha trn CNPTK, vic tm kim tr nn c nh hng. Hn na, do cu trc cy vic tm kim tr nn nhanh ng k.

    3.3.2. Cc php ton trn cy nh phn tm kim Duyt cy:

    Thao tc duyt cy trn cy nh phn tm kim hon ton ging nh trn cy nh phn. Ch c mt lu nh l khi duyt theo th t gia, trnh t cc nt duyt qua s cho ta mt dy cc nt theo th t tng dn ca kha

    Tm mt phn t x trn cyTNODE *searchNode(TREE T, Data X){if (T) {if ( T->.Key = = X) return T;if(T->Key > X)return searchNode(T->pLeft, X);elsereturn searchNode(T->pRight, X);}return NULL;

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 26

  • }Ta c th xy dng mt hm tm kim tng ng khng qui nh sau:

    TNODE * searchNode(TREE Root, Data x){ NODE *p = Root; while (p != NULL) { if(x == p->Key) return p;else if(x < p->Key) p = p->pLeft;else p = p->pRight;}return NULL;}

    D dng thy rng s ln so snh ti a phi thc hin tm phn t X l h, vi h l chiu cao ca cy. Nh vy thao tc tm kim trn CNPTK c n nt tn chi ph trung bnh khong O(log2n)

    Thm mt phn t x vo cy

    Vic thm mt phn t X vo cy phi bo m iu kin rng buc ca CNPTK. Ta c th thm vo nhiu ch khc nhau trn cy, nhng nu thm vo mt nt l s l tin li nht do ta c th thc hin qu trnh tng t thao tc tm kim. Khi chm dt qu trnh tm kim cng chnh l lc tm c ch cn thm.

    Hm insert tr v gi tr 1, 0, 1 khi khng b nh, gp nt c hay thnh cng:

    int insertNode(TREE &T, Data X){ if(T) {if(T->Key == X) return 0; // cif(T->Key > X)return insertNode(T->pLeft, X);elsereturn insertNode(T->pRight, X);}T =new Tnode; if(T == NULL) return -1; //thiu b nh T->Key = X;T->pLeft =T->pRight = NULL;return 1; //thm vo thnh cng}

    Xa mt phn t trn cyVic hy mt phn t ra khi cy phi m bo iu kin rng buc ca cy nh phn tm kim

    C 3 trng hp khi hy nt X c th xy ra:

    X l nt l.

    X ch c 1 con (tri hoc phi).

    X c c 2 con

    Trng hp th nht: ch n gin hy X v n khng mc ni n phn t no khc.

    Trng hp th hai: trc khi hy X ta mc ni cha ca X vi con duy nht ca n. ------------------------------------------------------------------------------------------------------------

    08/01/2011 - Cu trc d liu Trang 27

  • Trng hp cui cng: ta khng th hy trc tip do X c 2 con Ta s hy gin tip. Thay v hy X, ta s tm mt phn t th mng Y. Phn t ny c ti a mt con. Thng tin lu ti Y s c chuyn ln lu ti X. Sau , nt b hy tht s s l Y ging nh 2 trng hp u.

    Vn l phi chn Y sao cho khi lu Y vo v tr ca X, cy vn l CNPTK.

    C 2 phn t tha mn yu cu:

    Phn t nh nht (tri nht) trn cy con phi.

    Phn t ln nht (phi nht) trn cy con tri.

    Vic chn la phn t no l phn t th mng hon ton ph thuc vo thch ca ngi lp trnh. y, chng ta s chn phn t (phi nht trn cy con tri lm phn t th mng.

    Sau khi hy phn t X=18 ra khi cy tnh trng ca cy s nh trong hnh di y (phn t 23 l phn t th mng):

    Hm delNode tr v gi tr 1, 0 khi hy thnh cng hoc khng c X trong cy:

    int delNode(TREE &T, Data X){ if(T==NULL) return 0;if(T->Key > X)return delNode (T->pLeft, X);if(T->Key < X)return delNode (T->pRight, X);else { //T->Key == X TNode* p = T;if(T->pLeft == NULL)T = T->pRight;else if(T->pRight == NULL) T = T->pLeft;else { //T c c 2 con TNode* q = T->pRight;searchStandFor(p, q);}delete p;}}

    Trong , hm searchStandFor c vit nh sau:

    //Tm phn t th mng cho nt p

    void searchStandFor(TREE &p, TREE &q){ if(q->pLeft) searchStandFor(p, q->pLeft);else { p->Key = q->Key;p = q;q = q->pRight;}}

    To mt cy nh phn tm kimTa c th to mt cy nh phn tm kim bng cch lp li qu trnh thm 1 phn t vo

    mt cy rng.

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 28

  • Xa ton b cy

    Vic ton b cy c th c thc hin thng qua thao tc duyt cy theo th t sau. Ngha l ta s hy cy con tri, cy con phi ri mi hy nt gc.

    void removeTree(TREE &T){ if(T)

    { removeTree(T->pLeft);removeTree(T->pRight);delete(T);

    }}

    3.3.3. nh gi

    Tt c cc thao tc searchNode, insertNode, delNode trn CNPTK u c phc tp trung bnh O(h), vi h l chiu cao ca cy

    Trong trong trng hp tt nht, CNPTK c n nt s c cao h = log2(n). Chi ph tm kim khi s tng ng tm kim nh phn trn mng c th t.

    Tuy nhin, trong trng hp xu nht, cy c th b suy bin thnh 1 DSLK (khi m mi nt u ch c 1 con tr nt l). Lc cc thao tc trn s c phc tp O(n). V vy cn c ci tin cu trc ca CNPTK t c chi ph cho cc thao tc l log2(n)

    3.4. Cy nh phn cn bng3.4.1. Cy cn bng hon ton

    3.4.1.1. nh nghaCy cn bng hon ton l cy nh phn tm kim m ti mi nt ca n th s nt ca cy con tri chnh lch khng qu mt so vi s nt ca cy con phi. V d cho cy cn bng hon ton sau:

    3.4.1.2. nh gi

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 29

    50

    30

    70

    80

    60

    40

    10

    90

    45

    20

  • Mt cy rt kh t c trng thi cn bng hon ton v cng rt d mt cn bng v khi thm hay hy cc nt trn cy c th lm cy mt cn bng (xc sut rt ln), chi ph cn bng li cy ln v phi thao tc trn ton b cy.

    Tuy nhin nu cy cn i th vic tm kim s nhanh. i vi cy cn bng hon ton, trong trng hp xu nht ta ch phi tm qua log2n phn t (n l s nt trn cy).

    CCBHT c n nt c chiu cao h log2n. y chnh l l do cho php bo m kh nng tm kim nhanh trn CTDL ny.

    Do CCBHT l mt cu trc km n nh nn trong thc t khng th s dng. Nhng u im ca n li rt quan trng. V vy, cn a ra mt CTDL khc c c tnh ging CCBHT nhng n nh hn.

    Nh vy, cn tm cch t chc mt cy t trng thi cn bng yu hn v vic cn bng li ch xy ra phm vi cc b nhng vn phi bo m chi ph cho thao tc tm kim t mc O(log2n).

    3.4.2. Cy cn bng3.4.2.1. nh ngha:

    Cy cn bng l cy nh phn tm kim m ti mi nt ca n th cao ca cy con tri chnh lch khng qu mt so vi cao ca cy con phi, v d cho cy cn bng sau:

    D dng thy CCBHT l cy cn bng. iu ngc li khng ng, v d cy cn bng cho l khng cn bng hon ton

    3.4.2.2. Lch s cy cn bng (AVL tree)

    AVL l tn vit tt ca cc tc gi ngi Nga a ra nh ngha ca cy cn bng Adelson-Velskii v Landis (1962). V l do ny, ngi ta gi cy nh phn cn bng l cy AVL. T nay v sau, chng ta s dng thut ng cy AVL thay cho cy cn bng.

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 30

    50

    30

    70

    80

    60

    40

    10

    90

    45

    20

    75

  • T khi c gii thiu, cy AVL nhanh chng tm thy ng dng trong nhiu bi ton khc nhau. V vy, n mau chng tr nn thnh hnh v thu ht nhiu nghin cu. T cy AVL, ngi ta pht trin thm nhiu loi CTDL hu dng khc nh cy -en (Red-Black Tree), B-Tree,

    3.4.2.3. Chiu cao ca cy AVL

    Mt vn quan trng, nh cp n phn trc, l ta pji khng nh cy AVL n nt phi c chiu cao khong log2(n).

    nh gi chnh xc v chiu cao ca cy AVL, ta xt bi ton: cy AVL c chiu cao h s phi c ti thiu bao nhiu nt ?

    Gi N(h) l s nt ti thiu ca cy AVL c chiu cao h.

    Ta c N(0) = 0, N(1) = 1 v N(2) = 2.

    Cy AVL ti thiu c chiu cao h s c 1 cy con AVL ti thiu chiu cao h-1 v 1 cy con AVL ti thiu chiu cao h-2. Nh vy:

    N(h) = 1 + N(h-1) + N(h-2) (1)

    Ta li c: N(h-1) > N(h-2)

    Nn t (1) suy ra:

    N(h) > 2N(h-2)

    N(h) > 22N(h-4)

    N(h) > 2iN(h-2i)

    N(h) > 2h/2-1

    h < 2log2(N(h)) + 2

    Nh vy, cy AVL c chiu cao O(log2(n)).

    3.4.2.4. Cu trc d liu cho cy AVL

    Ch s cn bng ca mt nt:

    nh ngha: Ch s cn bng ca mt nt l hiu ca chiu cao cy con phi v cy con tri ca n.

    i vi mt cy cn bng, ch s cn bng (CSCB) ca mi nt ch c th mang mt trong ba gi tr sau y:

    CSCB(p) = 0 cao cy tri (p) = cao cy phi (p)

    CSCB(p) = 1 cao cy tri (p) < cao cy phi (p)

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 31

  • CSCB(p) =-1 cao cy tri (p) > cao cy phi (p)

    tin trong trnh by, chng ta s k hiu nh sau:

    p->balFactor = CSCB(p);

    cao cy tri (p) k hiu l hL

    cao cy phi(p) k hiu l hR

    kho st cy cn bng, ta cn lu thm thng tin v ch s cn bng ti mi nt. Lc , cy cn bng c th c khai bo nh sau:

    typedef struct tagAVLNode {

    char balFactor; //Ch s cn bng

    Data key;

    struct tagAVLNode* pLeft;

    struct tagAVLNode* pRight;

    }AVLNode;

    typedef AVLNode *AVLTree;

    tin cho vic trnh by, ta nh ngha mt s hng s sau:

    #define LH -1 //Cy con tri cao hn

    #define EH -0 //Hai cy con bng nhau

    #define RH 1 //Cy con phi cao hn

    3.4.2.5. nh gi cy AVL

    Cy cn bng l CTDL n nh hn hn CCBHT v ch khi thm hy lm cy thay i chiu cao cc trng hp mt cn bng mi c kh nng xy ra.

    Cy AVL vi chiu cao c khng ch s cho php thc thi cc thao tc tm thm hy vi chi ph O (log2(n)) v bo m khng suy bin thnh O(n).

    3.5. Cy tng qut3.5.1. nh ngha

    Cy tng qut l cy m cc nt trn cy c s con l bt kV d cho cy tam phn cc k t:

    Gc

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 32

    A

  • 3.5.2. Biu din cy tng qut bng danh sch lin ktMi nt ca cy l mt bn ghi, ngoi cc trng cha d liu ca bn thn n, cn c

    thm cc trng lin kt khc lu tr a ch ca cc nt con

    3.5.3. Cc php duyt cy tng qutTng t nh cy nh phn, i vi cy tng qut cng c 3 php duyt c bn l:

    - Duyt cy theo th t trc (i vi gc): Kiu duyt ny trc tin thm nt gc, sau ln lt thm cc nt ca cc cy con

    . Gc. Cy con tri nht. Cc cy con phi

    - Duyt cy theo th t gia: Kiu duyt ny trc tin thm nt cc nt ca cy con tri nht, sau thm nt gc ri n cc cy con phi.

    . Cy con tri nht

    . Gc

    . Cy con phi- Duyt cy theo th t sau:Kiu duyt ny trc tin thm cc nt ca cy con tri

    nht, sau thm cc nt ca cc cy con phi, cui cng thm nt gc. Cy con tri nht. Cc cy con phi. Gc

    3.5.4. Cy nh phn tng ng

    Nhc im ca cc cu trc cy tng qut l bc ca cc nt trn cy c th dao ng trong mt bin ln vic biu din gp nhiu kh khn v lng ph. Hn na, vic xy dng cc thao tc trn cy tng qut phc tp hn trn cy nh phn nhiu. V vy, thng nu khng qu cn thit phi s dng cy tng qut, ngi ta chuyn cy tng qut thnh cy nh phn.

    Ta c th bin i mt cy bt k thnh mt cy nh phn theo qui tc sau:

    - Gi li nt con tri nht lm nt con tri.

    - Cc nt con cn li chuyn thnh nt con phi.

    - Nh vy, trong cy nh phn mi, con tri th hin quan h cha con v con phi th hin quan h anh em trong cy tng qut ban u.

    Ta c th xem v d di y thy r hn qui trnh.

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 33

    CA D

    GA

    B

    FA

    EA

    HA

    IA

    JA

    KA

  • Mt v d quen thuc trong tin hc v ng dng ca duyt theo th t sau l vic xc nh tng kch thc ca mt th mc trn a

    Mt ng dng quan trng khc ca php duyt cy theo th t sau l vic tnh ton gi tr ca biu thc da trn cy biu thc

    (3 + 1) 3/(9 5 + 2) (3 (7 4) + 6) = 13

    Mt v d hay v cy nh phn l cy biu thc. Cy biu thc l cy nh phn gn nhn, biu din cu trc ca mt biu thc (s hc hoc logic). Mi php ton hai ton hng (chng hn, +, -, *, /) c biu din bi cy nh phn, gc ca n cha k hiu php ton, cy con tri biu din ton hng bn tri, cn cy con phi biu din ton hng bn phi. Vi cc php ton mt hng nh ph nh hoc ly gi tr i hoc cc hm chun nh exp ( ) hoc cos ( ) th cy con bn tri rng. Cn vi cc php ton mt ton hng nh php ly o hm ( ) hoc hm giai tha ( )! Th cy con bn phi rng.

    Hnh bn minh ha mt s cy biu thc.Ta c nhn xt rng, nu i qua cy biu thc theo th t trc ta s c biu thc Balan

    dng prefix (k hiu php ton ng trc cc ton hng). Nu i qua cy biu thc theo th t sau, ta c biu thc Balan dng postfix (k hiu php ton ng sau cc ton hng); cn theo th t gia ta nhn c cch vit thng thng ca biu thc (k hiu php ton ng gia hai ton hng).

    + exp !

    a a+b b exp(x) x n n!

    / or

    a + < >=

    b c a b c d

    a/(b+c) (a=d)

    ---o-O-o---

    BI TP CHNG 3

    BI TP L THUYT

    Bi 1. Hy trnh by cc vn sau y:

    a. nh ngha v c im ca cy nh phn tm kim.

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 34

  • b. Thao tc no thc hin tt trong kiu ny.

    c. Hn ch ca kiu ny l g ?

    Bi 2. Xt thut gii to cy nh phn tm kim. Nu th t cc kha nhp vo l nh sau:

    8 3 5 2 20 11 30 9 18 4

    th hnh nh cy to c nh th no ?

    Sau , nu hy ln lt cc nt theo th t nh sau :

    15, 20

    th cy s thay i nh th no trong tng bc hy, v s (nu r phng php hy khi nt c c 2 cy con tri v phi)

    Bi 3. p dng thut gii to cy nh phn tm kim cn bng to cy vi th t cc kha nhp vo l nh sau :

    5 7 2 1 3 6 10

    th hnh nh cy to c nh th no ? Gii thch r tng tnh hung xy ra khi thm tng kha vo cy v v hnh minh ha.

    Sau , nu hy ln lt cc nt theo th t nh sau :

    5, 6, 7, 10

    th cy s thay i nh th no trong tng bc hy, v s v gii thch

    Bi 4. Vit cc hm xc nh cc thng tin ca cy nh phn T:

    a. S nt l

    b. S nt c ng 1 cy con

    c. S nt c ng 2 cy con

    d. S nt c kha nh hn x (gi s T l CNPTK)

    e. S nt c kha ln hn x (gi s T l CNPTK)

    f. S nt c kha ln hn x v nh hn y (T l CNPTK)

    g. Chiu cao ca cy

    h. In ra tt c cc nt tng (mc) th k ca cy T

    i. In ra tt c cc nt theo th t t tng 0 n tng th h-1 ca cy T (h l chiu cao ca T).

    j. Kim tra xem T c phi l cy cn bng hon ton khng.

    k. lch ln nht trn cy. ( lch ca mt nt l lch gia chiu cao ca cy con tri v cy con phi ca n. lch ln nht trn cy l lch ca nt c lch ln nht).

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 35

  • Bi 5. Xy dng cu trc d liu biu din cy N-phn (2
  • #include// Khai bao cac kieu du lieu moitypedef int KeyType;typedef struct tagNode{

    KeyType key;struct tagNode *Left;struct tagNode *Right;

    }Node;typedef Node *BTree;// Khai bao cac ham dung trong chuong trinhvoid MakeNullBTree(BTree &Root); // Tao cay rongint EmptyBTree(BTree Root); // Kiem tra cay rongint IsLeaf(Node *p); // Kiem tra node lavoid InsertNode(KeyType x,BTree &Root); // Them mot node co khoa x vao cay NPTKNode *CreateNode(KeyType x); // Tao mot node co khoa x va tra ve dia chi cua Node do

    void InputBTree(BTree &Root); // Nhap cay NPTK;void InputBTreeFromFile(BTree &Root); // Nhap cay NPTK tu filevoid PreOrder(BTree Root); // Duyet cay NPTK Tien tu(Node-Left-Right);void InOrder(BTree Root); // Duyet cay NPTK Trung tu(Left-Node-Right);void PostOrder(BTree Root); // Duyet cay NPTK Hau tu(Left-Right-Node);void OutputBTree(BTree Root,int i,int muc); // Xuat cay theo kieu de nhinMax(int a,int b); // Ham so sanhint HightBTree(BTree Root); // Ham tinh chieu cao cua cayint CountKeyofNode(BTree Root); // Ham dem tong gia tri cua cac node tren cayNode *SearchNode(BTree Root,KeyType x); // Tim kiem mot node tra ve dia chi node dovoid OutputNode(BTree Root,Node *p,int i,int Muc); // Duyet cac nut theo muc;void OutputMinNode(BTree Root,Node *p,int i); // ham xuat nhung nut co key be hon xvoid DestroyBTree(BTree &Root); // Huy cay NPTKvoid Error(int i); // Ham thong bao loiint Menu();

    // Xay dung menu cua chuong trinh chinh/*---------------------Main Program--------------------------*/void main(){

    BTree Root;Node *p;int Router,Key;MakeNullBTree(Root);do{

    Router=Menu();switch(Router) // Phan tich Router{case 1:

    printf("\n------------------------------------------------------");printf("\n Ban muon nhap theo phuong phap nao:");printf("\n 1.Nhap truc tiep.");printf("\n 2.Nhap tu file.");scanf("%d",&Key);printf("\n------------------------------------------------------");switch(Key){case 1:

    InputBTree(Root);break;

    case 2:InputBTreeFromFile(Root);break;

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 37

  • default:Error(2);

    }printf("\n------------------------------------------------------");break;

    case 2:printf("\n------------------------------------------------------");if(EmptyBTree(Root))

    Error(5);else{

    printf("\n Ban muon duyet cay NPTK theo phuong phap nao ");printf("\n 1.Duyet Tien tu(NLR).");printf("\n 2.Duyet Tien tu(NLR).");printf("\n 3.Duyet Tien tu(NLR).");printf("\n------------------------------------------------------");printf("\n-->Key=");scanf("%d",&Key);printf("\n------------------------------------------------------");switch(Key){case 1:

    PreOrder(Root);break;

    case 2:InOrder(Root);break;

    case 3:PostOrder(Root);break;

    default:Error(2);

    }}printf("\n------------------------------------------------------");break;

    case 3:printf("\n------------------------------------------------------");printf("\n Chieu cao cua cay la :%d",HightBTree(Root));printf("\n------------------------------------------------------");break;

    case 4:printf("\n------------------------------------------------------");printf("\n Tong gia tri cua cac node la :%d",CountKeyofNode(Root));printf("\n------------------------------------------------------");break;

    case 5:KeyType x;printf("\n------------------------------------------------------");printf("\n Moi ban nhap khoa muon tim:");scanf("%d",&x);p=SearchNode(Root,x);if(p==NULL)

    Error(3);else{

    printf("\n Da tim thay khoa nay trong cay.");printf("\n Danh sach cac khoa nho hon x trong cay:");OutputMinNode(Root,p,0);

    }

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 38

  • printf("\n------------------------------------------------------");break;

    case 6:printf("\n------------------------------------------------------");DestroyBTree(Root);printf("\n------------------------------------------------------");break;

    default:printf("\n------------------------------------------------------");Error(2);printf("\n------------------------------------------------------");

    }}while(Router!=0);

    }/*----------------------Functions--------------------------*/// Dinh nghia ham tao cay NPTK rongvoid MakeNullBTree(BTree &Root){

    Root=NULL;}// Dinh nghia ham kiem tra cay rongint EmptyBTree(BTree Root){

    return (Root==NULL);}// Dinh nghia ham kiem tra nut laint IsLeaf(Node *p){

    if((*p).Left==NULL && (*p).Right==NULL)return 1;

    elsereturn 0;

    }// Dinh nghia ham tao mot Node co khoa x tra ve dia chi nut vua taoNode *CreateNode(KeyType x){

    Node *p;p=new Node;if(p==NULL)

    Error(1);else{

    (*p).key=x;(*p).Left=NULL;(*p).Right=NULL;

    }return p;

    }// Dinh nghia ham chen mot node co khoa x vao cay Nhi Phanvoid InsertNode(KeyType x,BTree &Root){

    if(Root==NULL)// Neu cay nay dang rong{

    Root=CreateNode(x);}else{

    if(x(*Root).key)

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 39

  • InsertNode(x,(*Root).Right);}

    }// Dinh nghia ham nhap cay NPTKvoid InputBTree(BTree &Root){

    Node *p;KeyType key;int n,i;printf("\n Ban muon nhap bao nhieu node:");scanf("%d",&n);for(i=1;i

  • void PreOrder(BTree Root){

    if(Root!=NULL){

    printf("\n %d",(*Root).key);PreOrder((*Root).Left);PreOrder((*Root).Right);

    }}// Dinh nghia ham duyet cay Trung tuvoid InOrder(BTree Root){

    if(Root!=NULL){

    InOrder((*Root).Left);printf("\n %d",(*Root).key);InOrder((*Root).Right);

    }}// Dinh nghia ham duyet cay Hau tuvoid PostOrder(BTree Root){

    if(Root!=NULL){

    PostOrder((*Root).Left);PostOrder((*Root).Right);printf("\n %d",(*Root).key);

    }}// Dinh nghia ham xuat de nhinvoid OutputBTree(BTree Root,int i,int muc){

    if(Root){

    if(i==muc){

    printf("%d",(*Root).key);}OutputBTree((*Root).Left,i+1,muc);OutputBTree((*Root).Right,i++,muc);

    }}// Dinh nghia ham Max cua a va bMax(int a,int b){

    if(a>b)return a;

    elsereturn b;

    }// Dinh nghia ham tinh chieu cao cua cayint HightBTree(BTree Root){

    if((Root==NULL) || (IsLeaf(Root)))return 0;

    elsereturn (1 +Max(HightBTree((*Root).Left),HightBTree((*Root).Right)));

    }// Dinh nghia ham dem tong gia tri cac node tren cayint CountKeyofNode(BTree Root)

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 41

  • {if(EmptyBTree(Root))

    return 0;elsereturn (*Root).key + CountKeyofNode((*Root).Left) +

    CountKeyofNode((*Root).Right);}// Dinh nghia ham tim mot node co key x va tra ve dia chi cua node doNode *SearchNode(BTree Root,KeyType x){

    if(EmptyBTree(Root))return NULL;

    else{

    if((*Root).key==x)return Root;

    if((*Root).key

  • printf("\n Khong du bo nho.");break;

    case 2:printf("\n Khong co chuc nang nay.Moi ban thu lai.");break;

    case 3:printf("\n Khong tim thay khoa nay trong cay.");break;

    case 4:printf("\n So nay da duoc nhap.Moi ban chon so khac.");break;

    case 5:printf("\n Cay hien dang rong.Khong the thuc hien thao tac.");break;

    case 6:printf("\n Khong mo duoc file.Please try again");break;

    default:printf("\n Undefined Error. Please try again.");

    }}// Xay dung menu cho chuong trinh chinhint Menu(){

    int Router;printf("\n Moi ban chon chuc nang:");printf("\n 1.Nhap cay nhi phan tim kiem.");printf("\n 2.Duyet cay NPTK.");printf("\n 3.Tinh do dai cua cay.");printf("\n 4.Tinh tong gia tri cua cac node tren cay");printf("\n 5.Tim mot node x tren cay.");printf("\n 6.Huy cay NPTK vua tao.");printf("\n 0.Thoat chuong trinh.");printf("\n --->Router=");scanf("%d",&Router);return Router;

    }/*--------------------------------End--------------------------------*/

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 43

  • 2 Danh sch lin kt c th c v lu li danh sch n file:

    #include#include#include#include#include#includeusing namespace std;// Dinh nghia cac kieu du lieu moitypedef char info1[30];typedef float info2;typedef int info3;typedef struct tagsv{ info1 ht; info2 cc; info3 cntc;}sv;typedef struct tagnode{ sv info; struct tagnode *next;}node;typedef struct tagList{ node *head; node *tail;}List;// Chuong trinh chinh//****************************************************************************// Tao mot danh sach rongvoid createList(List &L){ L.head=NULL; L.tail=NULL;}// Tao mot node co info x va tra ve dia chi cua nut donode *createnode(sv x){ node *p; p=new node; if (p==NULL) exit(1); else { p->info=x; p->next=NULL; } return p;}// Them mot node vao dau danh sachvoid addhead(List &L,node *p){ if (L.head==NULL) { L.head=p; L.tail=p; } else

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 44

  • { p->next=L.head; L.head=p; }}// Them mot node vao cuoi danh sachvoid addtail(List &L,node *p){ if (L.head==NULL) { L.head=p; L.tail=p; } else { L.tail->next=p; L.tail=p; }}// Cac ham phuc vu cho bo nho//*********************************************************************************// Ham nay kiem tra moi chuoi co dang so khongbool Check_Num(char *str){ bool ok=true; bool dot=false; for (int i=0;i
  • strcpy(x.ht,pch); } pch=strtok(NULL,"||"); } x.cntc=int(x.cc*100-105); p=createnode(x); addtail(L,p);}// Ham nay khoi tao ung dungvoid Import_Data(string s,List &L){ char* str=new char[s.length()+1]; strcpy(str,s.c_str()); string line; ifstream myfile(str); if (myfile.is_open()) { while (!myfile.eof()) { getline(myfile,line); Process_Line(line,L); } myfile.close(); } else cout next==NULL) fprintf(fp,"%s||%0.3f",p->info.ht,p->info.cc); else fprintf(fp,"%s||%0.3f\n",p->info.ht,p->info.cc); p=p->next; } fclose(fp);}//*********************************************************************************// Ham duyet danh sachvoid outputList(List L){ int i=1; node *p; p=L.head; printf("\n-------------------------------------------------------------------"); printf("\n %2s|%20s|%10s|%10s","ID","FULL NAME","HEIGHT","SW"); printf("\n-------------------------------------------------------------------"); while (p!=NULL) { printf("\n %2d|%20s|%10.2f|%10d",i,p->info.ht,p->info.cc,p->info.cntc); i++;

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 46

  • p=p->next; }}// Dinh nghia ham xuat mot nodevoid outputnode(node *p){ printf("\n-------------------------------------------------------------------"); printf("\n %2s|%20s|%10s|%10s","ID","FULL NAME","HEIGHT","SW"); printf("\n-------------------------------------------------------------------"); printf("\n %2d|%20s|%10.2f|%10d",1,p->info.ht,p->info.cc,p->info.cntc);}// Dinh nghia ham tim mot nodenode *searchnode(List L,info1 ht){ node *p; p=L.head; while ((p!=NULL) && (strcmp(p->info.ht,ht))) p=p->next; return p;}// Ham xoa sinh vien dau danh sachvoid deletehead(List &L){ node *p; p=L.head; L.head=p->next; if (L.head==NULL) L.tail=NULL; delete p;}// Xoa mot node bat kivoid deletenode(List &L,node *p){ node *before=NULL; node *after; after=L.head; while ((after!=NULL) && (after!=p)) { before=after; after=after->next; } if (before==NULL) deletehead(L); else { before->next=p->next; if (p==L.tail) L.tail=before; delete p; }}// Hoan doi hai svvoid swap(sv &a,sv &b){ sv temp; temp=a; a=b; b=temp;}// Sap xep theo ten

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 47

  • void sortbyname(List &L){ node *i,*j; i=L.head; while (i!=NULL) { j=i->next; while (j!=NULL) { if (strcmp(i->info.ht,j->info.ht)>0) swap(i->info,j->info); j=j->next; } i=i->next; }}// Dem so nut trong danh sachint countnode(List L){ int count=0; node *p; p=L.head; while (p!=NULL) { count++; p=p->next; } return count;}// Dao nguoc danh sachvoid reverseList(List L,List &L1){ node *p,*p1; p=L.head; while (p!=NULL) { p1=createnode(p->info); addhead(L1,p1); p=p->next; }}// Dinh nghia ham xoa danh sachvoid destroy(List &L){ node *p; while (L.head!=NULL) { p=L.head; L.head=L.head->next; delete p; } L.tail=NULL;}// Dinh nghia ham tao menu cua chuong trinhint menu(){ int i; printf("\n-------------------------------------------------------------------"); printf("\n Moi ban chon chuc nang:"); printf("\n 1.Nhap danh sach sinh vien.");

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 48

  • printf("\n 2.Xuat danh sach sinh vien."); printf("\n 3.Tim mot sinh vien trong danh sach."); printf("\n 4.Xoa sinh vien trong danh sach."); printf("\n 5.Sap xep danh sach theo ten."); printf("\n 6.Dem so nut trong danh sach."); printf("\n 7.Dao nguoc danh sach."); printf("\n 8.Huy danh sach sinh vien."); printf("\n 0.Thoat khoi chuong trinh."); printf("\n -->?Router="); scanf("%d",&i); printf("\n-------------------------------------------------------------------"); return i;}// Ham thong bao loivoid error(int i){ switch (i) { case 1: printf("\n Khong co chuc nang nay. Moi ban chon lai."); break; case 2: printf("\n Khong tim thay sinh vien nay trong danh sach."); break; default: printf("\n Ghost..."); }}// Chuong trinh chinhint main(){ int router,i=1; sv x; node *p; List L,L1; createList(L); printf("\n ----> Importing Data from file..."); printf("\n ----> Press any key to continue."); getch(); Import_Data("data.txt",L); do { router=menu(); switch (router) { case 1: do { fflush(stdin); printf("\n Nhap thong tin sinh vien thu %d",i); printf("\n Nhap ten sinh vien:"); printf("\n -->"); gets(x.ht); if (strcmp(x.ht,"")) { printf("\n Nhap chieu cao sinh vien nay:"); printf("\n -->"); scanf("%f",&x.cc); x.cntc=int(x.cc*100 -105); p=createnode(x);

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 49

  • addtail(L,p); i++; printf("\n-------------------------------------------------------------------"); } } while (strcmp(x.ht,"")!=0); break; case 2:// Duyet danh sach outputList(L); break; case 3:// Tim mot sinh vien trong danh sach printf("\n-------------------------------------------------------------------"); printf("\n Nhap ten sinh vien muon tim :"); printf("\n -->"); fflush(stdin); gets(x.ht); p=searchnode(L,x.ht); if (p==0) error(2); else { printf("\n Co sinh vien nay trong danh sach."); printf("\n Thong tin ve sinh vien nay la :"); outputnode(p); } break; case 4:// Xoa mot node cua danh sach printf("\n-------------------------------------------------------------------"); printf("\n Nhap ten sinh vien muon xoa :"); printf("\n -->"); fflush(stdin); gets(x.ht); p=searchnode(L,x.ht); if (p==0) error(2); else { deletenode(L,p); printf("\n Xoa thanh cong"); } printf("\n-------------------------------------------------------------------"); break; case 5:// Sap xep danh sach printf("\n-------------------------------------------------------------------"); sortbyname(L); printf("\n Sap xep thanh cong."); printf("\n-------------------------------------------------------------------"); break; case 6:// Dem so nut trong danh sach printf("\n-------------------------------------------------------------------"); printf("\n Tong so node cua danh sach la :%d",countnode(L)); printf("\n-------------------------------------------------------------------"); break; case 7:// Dao nguoc danh sach lien ket printf("\n-------------------------------------------------------------------"); printf("\n Dao nguoc danh sach lien ket don:"); createList(L1); reverseList(L,L1); printf("\n Danh sach dao nguoc cua danh sach cu:"); outputList(L1);

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 50

  • printf("\n-------------------------------------------------------------------"); break; case 8:// Xoa danh sach printf("\n-------------------------------------------------------------------"); destroy(L); printf("\n Danh sach da bi xoa."); printf("\n-------------------------------------------------------------------"); break; case 0: Save_Data("data.txt",L); printf("\n ----> Saving Data to file..."); printf("\n ----> Press any key to Exit."); getch(); break; default: error(1); } } while (router!=0); return 0;}

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 51

  • 3. Chuyn i qua li gia tt c cc c s:#include#include#include#includeconst int MAX=100;// Khai bao cau truc ngan xeptypedef struct tagStack{

    int top;int nodes[MAX];

    }Stack;// Tao ngan xep rongvoid MakeNull_Stack(Stack &S){

    S.top=-1;}// Kiem tra ngan xep rongint Empty_Stack(Stack S){

    return (S.top==-1);}// Kiem tra ngan xep dayint Full_Stack(Stack S){

    return (S.top==MAX-1);}// Chen mot phan tu vo dinh stackvoid Push(Stack &S,int x){

    if(Full_Stack(S))printf("\n Ngan xep day.");

    else{

    S.top++;S.nodes[S.top]=x;

    }}// Lay phan tu tren dinh cua ngan xepint Top(Stack S){

    if(Empty_Stack(S))printf("\n Ngan xep trong");

    elsereturn S.nodes[S.top];

    }// Xoa phan tu dinh ngan xepvoid Pop(Stack &S){

    if(Empty_Stack(S))printf("\n Ngan xep rong.");

    elseS.top--;

    }// Chuong trinh chinhvoid main(){

    Stack S;MakeNull_Stack(S);char c;

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 52

  • int cs;int n,temp;printf("\n Moi ban nhap mot so thap phan:");printf("\n -->");scanf("%d",&n);printf("\n Moi ban nhap co so muon chuyen:");printf("\n -->");scanf("%d",&cs);do{

    temp=n%cs;Push(S,temp);n/=cs;

    }while(n!=0);printf("\n So moi o he %d",cs);printf("\n -->");while(!Empty_Stack(S)){

    printf("%d",Top(S));Pop(S);

    }getch();

    }

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 53

  • 4. o Chui:#include#include#include#includeconst int MAX=100;typedef struct tagStack{

    int top;int nodes[MAX];

    }Stack;// Tao ngan xep rongvoid MakeNull_Stack(Stack &S){

    S.top=-1;}// Kiem tra ngan xep rongint Empty_Stack(Stack S){

    return (S.top==-1);}// Kiem tra ngan xep dayint Full_Stack(Stack S){

    return (S.top==MAX-1);}void Push(Stack &S,int x){

    if(Full_Stack(S))printf("\n Ngan xep day.");

    else{

    S.top++;S.nodes[S.top]=x;

    }}int Top(Stack S){

    if(Empty_Stack(S))printf("\n Ngan xep trong");

    elsereturn S.nodes[S.top];

    }void Pop(Stack &S){

    if(Empty_Stack(S))printf("\n Ngan xep rong.");

    elseS.top--;

    }void main(){

    Stack S;MakeNull_Stack(S);char c;printf("\n Moi ban nhap mot chuoi.Ket thuc bang dau(.)\n");printf(" ");do{

    c=getchar();

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 54

  • Push(S,c);}while(c!='.');printf("\n In chuoi vua nhap theo thu tu nguoc lai:\n");printf(" ");while(!Empty_Stack(S)){

    printf("%c",Top(S));Pop(S);

    }getch();

    }

    5. Thp H Ni. (Thp HaNoi (Dng stack kh quy))#include#include#include#includeconst int MAX=100;// Khai bao cau truc ngan xeptypedef struct{

    int N;int A,B,C;

    }Disk;typedef struct tagStack{

    int top;Disk nodes[MAX];

    }Stack;// Tao ngan xep rongvoid MakeNull_Stack(Stack &S){

    S.top=-1;}// Kiem tra ngan xep rongint Empty_Stack(Stack S){

    return (S.top==-1);}// Kiem tra ngan xep dayint Full_Stack(Stack S){

    return (S.top==MAX-1);}// Chen mot phan tu vo dinh stackvoid Push(Stack &S,Disk x){

    if(Full_Stack(S))printf("\n Ngan xep day.");

    else{

    S.top++;S.nodes[S.top]=x;

    }}// Lay phan tu tren dinh cua ngan xepDisk Top(Stack S){

    if(Empty_Stack(S))printf("\n Ngan xep trong");

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 55

  • elsereturn S.nodes[S.top];

    }// Xoa phan tu dinh ngan xepvoid Pop(Stack &S){

    if(Empty_Stack(S))printf("\n Ngan xep rong.");

    elseS.top--;

    }// Chuong trinh con Movevoid Move(Disk x){

    Disk temp,temp1;Stack S;MakeNull_Stack(S);Push(S,x);do{

    temp=Top(S);Pop(S);if(temp.N==1){

    printf("\n Chuyen 1 dia tu %c sang % c",temp.A+64,temp.C+64);}else{

    // Chuyen N-1 dia A->Btemp1.N=temp.N-1;temp1.A=temp.B;temp1.B=temp.A;temp1.C=temp.C;Push(S,temp1);// Chuyen 1 dia A->Ctemp1.N=1;temp1.A=temp.A;temp1.B=temp.B;temp1.C=temp.C;Push(S,temp1);// Chuyen N-1 dia B->Ctemp1.N=temp.N-1;temp1.A=temp.A;temp1.B=temp.C;temp1.C=temp.B;Push(S,temp1);

    }}while(!Empty_Stack(S));

    }// Chuong trinh chinhvoid main(){

    Disk x;x.N=2;x.A=1;x.B=2;x.C=3;Move(x);getch();

    }

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 56

  • 6. Danh Sach Lin Kt Kp.#include#include#include#include#include#include// Define Struct Addtressusing namespace std;struct Address{ char name[100]; char teln[100]; char mail[100];};// Define Struct AddressListstruct AddressList{ struct Address addr; struct AddressList *next; struct AddressList *prev;};struct AddressList *insert_e(struct AddressList *root,struct Address ad,int n){ struct AddressList *new_e,*cur=NULL; int pos; bool ok=true; new_e= new AddressList; if(new_e==NULL) { printf("\n Memory Overflow."); exit(1); } else { new_e->addr=ad; new_e->next=NULL; new_e->prev=NULL; } if(n==0) { new_e->next=root; if(new_e->next!=NULL) new_e->next->prev=new_e; root=new_e; } else { if(root) { cur=root; for(pos=1;posnext==NULL) { ok=false; break; }

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 57

  • cur=cur->next; } if(ok) { if(cur->next!=NULL) cur->next->prev=new_e; new_e->prev=cur; new_e->next=cur->next; cur->next=new_e; } else { printf("\n -->Can't Insert."); }

    } else { printf("\n -->Can't Insert."); } } return root;}// Delete a elementstruct AddressList *delete_e(struct AddressList *root,int n){ struct AddressList *del=NULL,*cur=NULL; int pos; bool ok=true; if(n==0) { del=root; if(del->next!=NULL) del->next->prev=NULL; root=del->next; delete del; } else { if(root) { cur=root; del=cur->next; for(pos=1;posnext==NULL) { ok=false; break; } cur=cur->next; del=del->next; } if(ok) { del->next->prev=cur; cur->next=del->next; delete del; } else

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 58

  • { printf("\n -->Can't Delete."); }

    } else { printf("\n -->Can't Delete."); } } return root;}// Search a element// Search a element.Return address of elementstruct AddressList *search_e(struct AddressList *root,char *email){

    struct AddressList *cur=NULL;for(cur=root;cur!=NULL;cur=cur->next)

    if(strcmp(cur->addr.mail,email)==0)break;

    return cur;}//**********************************************************************// Define a function to check email Addressint check_email(char *email){ int ok=0; for(int i=0;iaddr.name,cur->addr.teln,cur->addr.mail);

    pos++;cur=cur->next;

    }}// Define a function to get AdddressList from file//**********************************************************************// Ham nay xu li tuung dong cua filevoid Process_Line(string s,struct AddressList *&root){ struct Address x; char *pch=NULL; int Level=1; char* str=new char[s.length()+1]; strcpy(str,s.c_str()); pch=strtok(str,"||"); while (pch!=NULL)

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 59

  • { switch(Level) { case 1: strcpy(x.name,pch); Level++; break; case 2: strcpy(x.teln,pch); Level++; break; case 3: strcpy(x.mail,pch); Level++; break; } pch=strtok(NULL,"||"); } root=insert_e(root,x,0);}void Import_Data(string s,struct AddressList *&root){ char* str=new char[s.length()+1]; strcpy(str,s.c_str()); string line; ifstream myfile(str); if (myfile.is_open()) { while (!myfile.eof()) { getline(myfile,line); Process_Line(line,root); } myfile.close(); } else cout next==NULL) fprintf(fp,"%s||%s||%s",cur->addr.name,cur->addr.teln,cur->addr.mail); else fprintf(fp,"%s||%s||%s\n",cur->addr.name,cur->addr.teln,cur->addr.mail); cur=cur->next; } fclose(fp);}//**********************************************************************// Menu of Programint menu()

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 60

  • {char router;printf("\n -----------------------------------------------------------------------");printf("\n Please select a function:");printf("\n 1.Insert a element into List.");printf("\n 2.Output List to screen.");

    printf("\n 3.Delete a element."); printf("\n 4.Search a element by name.");

    printf("\n 0.Save AddressList and Exit Program.");printf("\n -->?Router=");router=getch();printf("\n -----------------------------------------------------------------------");if(router< '0' || router> '9')printf("\n Please input a number.Not char.");elsereturn (router-48);

    }// Main Programint main(){ int choise,position; struct AddressList *root=NULL,*cur=NULL; struct Address x; printf("\n ----> Importing Data from file..."); printf("\n ----> Press any key to continue."); getch(); Import_Data("data.txt",root); do { choise=menu(); switch(choise) { case 1: // Input do

    {printf("\n

    -----------------------------------------------------------------------");printf("\n Name:");fflush(stdin);gets(x.name);if(strcmp(x.name,"")){

    printf("\n Telephone:");fflush(stdin);gets(x.teln);InputEmail:printf("\n Email:");fflush(stdin);gets(x.mail);if(check_email(x.mail)!=1)

    { printf("\n -->This Email is invalid \n"); goto InputEmail; } printf("\n Position to insert:");

    scanf("%d",&position);root=insert_e(root,x,position);printf("\n-----------------------------------------------------");

    }}while(strcmp(x.name,""));

    ------------------------------------------------------------------------------------------------------------08/01/2011 - Cu trc d liu Trang 61

  • break; case 2: printf("\n -----------------------------------------------------------------------"); Show_AddressList(root); printf("\n -----------------------------------------------------------------------"); break; case 3: printf("\n -----------------------------------------------------------------------");

    printf("\n Input Position which you want delete.");scanf("%d",&position);root=delete_e(root,position);printf("\n -----------------------------------------------------------------------");

    break; case 4: printf("\n -----------------------------------------------------------------------");

    printf("\n Input Email:");fflush(stdin);gets(x.mail);if(check_email(x.mail)!=1){

    printf("\n This Email is invalid");}else{ cur=search_e(root,x.mail);

    if(cur==NULL) printf("\n Can't found."); else { FILE *fp; fp=fopen("Result.txt","w"); fprintf(fp,"\%2d|%20s|%15s|%25s|",1,cur->addr.name,cur->addr.teln,cur->addr.mail);