You are on page 1of 56

Bi 01 N TP K THUT LP TRNH

MC TIU Hon tt bi thc hnh ny, sinh vin c th: Hiu v s dng kiu con tr trong C++. Phn bit truyn tham bin v truyn tham tr. Thao tc c/ghi trn tp tin vn bn. Hiu r v lp trnh quy, vit c cc chng trnh quy.

THI GIAN THC HNH T 6-15 tit, gm Con tr: 2-5 tit Truyn tham bin v truyn tham tr: 1-3 tit Thao tc c/ghi trn tp tin vn bn: 2-4 tit Lp trnh quy: 1-3 tit

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

1. CON TR Con tr l khi nim c bit trong C/C++, l loi bin dng cha a ch. Cc thao tc vi con tr ln lt qua cc bc: Khai bo bin con tr Khi to con tr dng cp pht vng nh Truy xut gi tr nh t bin con tr Hy vng nh xin cp pht

1.1. Khai bo bin con tr trong C++

<KieuDuLieu> *<TenBien>; V d:
int* pa; // con tr n kiu int DIEM *pd; // con tr n kiu DIEM

xc nh a ch ca mt nh: ton t & V d:


int a = 1; int* pa = &a; // con tr tr n nh ca bin a

1.2. Khi to bin con tr dng cp pht vng nh (cp pht ng)

S dng ton t new V d:


int* pInt = new int; // xin cp pht vng nh cho 1 s nguyn DIEM *pDiem = new DIEM; // xin cp pht vng nh cho 1 bin kiu cu trc DIEM

Ton t new cn c th s dng th cp pht vng nh cho nhiu phn t.


int* arr = new int[5]; // xin cp pht vng nh cho 5 s nguyn

Lu : kim tra cp pht vng nh thnh cng hay khng, ta dng con tr c bit NULL. NULL l con tr c bit, c th c gn cho cc bin con tr ca cc kiu d liu khc nhau. V d:
int* pInt = NULL;

u hp l.
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

DIEM* pDiem = NULL;

kim tra cp pht thnh cng, ta lm nh sau:


DIEM* pDiem = NULL; // khai bo con tr v gn bng NULL pDiem = new DIEM; if (pDiem == NULL) // xin cp pht vng nh // nu pDiem vn bng NULL th xin cp pht khng thnh cng

printf(Cap phat khong thanh cong);

1.3. Truy xut gi tr nh t bin con tr 1.3.1. i vi cc kiu d liu c bn (nh kiu int, float, )

xc nh gi tr nh ti a ch trong bin con tr: ton t * V d: Vi khai bo cc bin a, pa


int a = 1; int* pa = &a; // con tr tr n nh ca bin a

cu lnh
printf("%d\n", *pa);

s xut ra 1 Gii thch:


int a = 1;

Vi khai bo ny, mt nh s c cp pht v ni dung nh l 1


int* pa = &a;

Sau khai bo ny, bin pa s gi a ch nh va c cp pht cho bin a Khi , *pa s ly ni dung ca nh c tr n bi bin pa, m bin pa gi a ch nh c cp pht cho bin a. Vy *pa = a = 1.
1.3.2. i vi cc kiu d liu cu trc (nh kiu SINHVIEN, DIEM, )

truy xut cc thnh phn ca kiu cu trc, dng -> V d: Vi kiu cu trc DIEM c nh ngha nh sau Trang
struct DIEM { Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

int hoanhDo, tungDo; } ; DIEM *pDiem = new DIEM;

truy xut thnh phn dng


pDiem->hoanhDo v pDiem->tungDo

1.4. Hy vng nh xin cp pht

hy vng nh xin cp pht, dng ton t delete Vi khai bo


int* pa = new int; int* pb = new int[5];

Cch hy tng ng s l
delete pa; delete pb[];

Bi tp (code mu: ConTroCoBan)


#include <stdio.h> struct DIEM { int hoanhDo, tungDo; } ; void main() { // khoi tao cac bien gia tri int a = 1; DIEM d; d.hoanhDo = 1; d.tungDo = 2; // khai bao bien con tro va tro den vung nho cua cac bien gia tri da co int *pa = &a; int *pb = pa; DIEM *pd = &d; // xac dinh dia chi o nho: toan tu & printf("Dia chi o nho: %d \n", &a); // truy xuat gia tri o nho tu bien con tro: toan tu * printf("Gia tri a: %d \n", *pa); // truy xuat thanh phan trong cau truc printf("Diem D: (%d,%d)\n", d.hoanhDo, d.tungDo);//doi voi bien gia tri: . printf("Diem D: (%d,%d)\n", pd->hoanhDo, pd->tungDo);// doi voi bien con -> delete pd;

} Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

tro:

1. Bin dch on chng trnh trn. 2. Nu lnh


int a = 1;

c i thnh
int a = 10;

Cho bit gi tr ca *pa. 3. Nu dng


int *pa = &a;

c sa li thnh
int *pa;

Cho bit kt qu bin dch chng trnh? Chng trnh c bo li khi thc thi khng? Nu c, cho bit ti sao li. 4. Nu trc dng
printf("Gia tri a: %d \n", *pa);

ta thm dng code


*pb = 2;

Cho bit kt qu ca lnh xut


printf("Gia tri a: %d \n", *pa);

Gii thch ti sao c kt qu xut nh vy.

1.5. Con tr vi mng (cp pht mng ng)

Cch lm trc y khi khng s dng cp pht ng vi mng 1 chiu


int a[100]; // xin 100 nh cho mng ti a 100 phn t int n; printf("Nhap so luong phan tu: "); scanf("%d", &n); for (int i = 0; i < n; i++) { printf("Nhap a[%d]: ",i); scanf("%d", &a[i]); }

Cch lm ny c nhiu hn ch nh: cp pht tha trong trng hp n nhp vo < 100 v khng cho php n nhp vo ln hn mt s lng nh trc c ci t trong code (100). cp pht mng ng (s lng phn t cp pht ng bng vi n nhp vo v khng gii hn gi tr n), ta lm nh sau
int n; printf("Nhap so luong phan tu: "); scanf("%d", &n); //khai bao bien con tro a va xin cap phat vung nho chua n so interger int* a = new int[n]; //dung vong lap de nhap cac gia tri a[i] Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

for (int i = 0; i < n; i++) { printf("Nhap a[%d]: ",i); scanf("%d", &a[i]); }

Sau khai bo
int* a = new int[n];

mt vng nh cha n s nguyn s c cp pht, con tr a s ch n phn t u tin ca dy n s . Cc phn t ca mng c truy xut qua ton t [] nh vi mng trc y dng.

Bi tp (code mu: ConTroVoiMang) Nhp mng mt chiu cc s nguyn dng cp pht mng ng.
#include <stdio.h> void main() { // MANG 1 CHIEU int n; printf("Nhap so luong phan tu: "); scanf("%d", &n); //khai bao bien con tro a va xin cap phat vung nho chua n so interger int* a = new int[n]; //dung vong lap de nhap cac gia tri a[i] for (int i = 0; i < n; i++) { printf("Nhap a[%d]: ",i); scanf("%d", &a[i]); } printf("a[0] = %d\n", a[0]); printf("*a = %d\n", *a); //xuat cac gia tri a[i] for (int i = 0; i < n; i++) { printf("a[%d] = %d\n",i, a[i]); } }

1. Bin dch on chng trnh trn. 2. Nhp vo mt vi mng s nguyn, nhn xt v kt qu ca 2 lnh xut sau cc ln chy.
printf("a[0] = %d\n", a[0]); printf("*a = %d\n", *a);

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

3. Gii thch ti sao c th rt ra kt lun cu 2. 4. Sa li on chng trnh trn nhp vo mt mng s nguyn v xut ra tng cc s trong mng .

5. Vit chng trnh cho php nhp vo mt mng 2 chiu cc s nguyn dng cp pht ng. Gi : Mng 2 chiu mxn cc s nguyn c khai bo nh sau
int** b = new int*[m];

trong mi b[i] (kiu int*) l mt mng mt chiu n s nguyn


b[i] = new int[n];

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

2. TRUYN THAM S: TRUYN THAM BIN vs TRUYN THAM TR Gi s ta c on chng trnh:


void BinhPhuong(int a) { a = a * a; } void main() { int a = 2; BinhPhuong(a); printf(%d, a); }

vi hm BinhPhuong nhn vo 1 tham s kiu int v tnh bnh phng ca s ( a = a * a). Ta mong mun kt qu xut ra l 4. Tuy nhin, thc t kt qu xut ra li l 2. Gii thch: Khi gi thc hin hm Funtciton(a), gi tr ca a s c truyn cho hm, khng phi l bn thn bin a. Do , d cu lnh
a = a * a;

c thc hin v gi tr ca a trong hm BinhPhuong c thay i nhng do ta ch truyn gi tr ch khng phi bn thn bin nn khi ra khi hm BinhPhuong(), gi tr ca bin a khi thc hin cu lnh in ra vn l 2. Cch truyn tham s a vo hm BinhPhuong nh trn gi l cch truyn tham tr (ch truyn gi tr vo hm, cc thao tc lm thay i gi tr ca bin bn trong hm khng nh hng n gi tr bin khi kt thc hm). Tuy nhin trong trng hp ny, ta mun nhng thay i gi tr bin a trong hm BinhPhuong vn c tc dng khi ra khi hm. Ta sa li on chng trnh trn nh sau
void BinhPhuong(int& a) { a = a * a; } void main() { int a = 2; BinhPhuong(a); printf(%d, a); }

th kt qu xut ra l 4. trong cch khai bo


void BinhPhuong(int& a) // dng ton t &

cho bit bin a s c truyn theo kiu tham bin (truyn trc tip bin vo hm, do nhng thay i gi tr ca bin bn trong hm s nh hng n gi tr bin k c khi kt thc hm. Trang Bi tp (code mu: ThamBien_ThamTri)
#include <stdio.h> Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

struct DIEM { int x, y; }; void TruyenThamTri(int a) { a = a * 10; } void TruyenThamBien(int &a) { a = a * 10; } void ThamTriConTro(DIEM* d) { d->x = d->x * 10; d->y = d->y * 10; } void ThamBienConTro(DIEM* &d, DIEM* p) { d->x = d->x * 10; d->y = d->y * 10; d = p; } void main() { // tham tri, tham bien voi bien du lieu int a = 1, b = 10; printf("a = %d\n", a); TruyenThamTri(a); printf("a sau ham TruyenThamTri = %d\n", a); TruyenThamBien(a); printf("a sau ham TruyenThamBien = %d\n", a); // bien con tro DIEM* d2 = new DIEM; d2->x = 5; d2->y = 5; printf("Diem d2(%d, %d)\n", d2->x, d2->y); ThamTriConTro(d2); printf("d2 sau khi goi ham ThamTriConTro: (%d,%d)\n", d2->x, d2->y); printf("\n"); DIEM* d1 = new DIEM; d1->x = 5; d1-> y = 5; d2->x = 5; d2->y = 5; printf("Diem d2(%d, %d)\n", d2->x, d2->y); ThamBienConTro(d2, d1); printf("d2 sau khi goi ham ThamBienConTro: (%d,%d)\n", d2->x, d2->y); }

1. Bin dch on chng trnh trn. 2. Cho bit kt qu ca lnh in


Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

printf("a sau ham TruyenThamTri = %d\n", a);

v
printf("a sau ham TruyenThamBien = %d\n", a);

3. Cho bit kt qu ca lnh in


printf("d2 sau khi goi ham ThamTriConTro: (%d,%d)\n", d2->x, d2->y);

Nhn xt gi tr ca d2->x v d2->y c b thay i khng? Nu gi tr ca d2->x v d2->y c b thay i, gii thch ti sao khi khai bo hm
void ThamTriConTro(DIEM* d)

bin d truyn theo kiu tham tr (khng s dng &) nhng d2->x, d2->y li b thay i Gi : d l kiu con tr. 4. Cho bit kt qu ca lnh in
printf("d2 sau khi goi ham ThamBienConTro: (%d,%d)\n", d2->x, d2->y);

Nhn xt gi tr ca d2->x v d2->y c b thay i khng? Nu gi tr ca d2->x v d2->y khng b thay i, gii thch ti sao khi khai bo hm
void ThamBienConTro(DIEM* &d, DIEM* p)

bin d truyn theo kiu tham bin (s dng &) nhng d2->x, d2->y li khng b thay i Gi Thay i
d1->x = 5; d1-> y = 5;

thnh gi tr khc ri quan st kt qu ca lnh in rt ra nhn xt.

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

10

3. NHP/XUT TRN TP TIN VN BN


3.1. Nhp

c mt file vn bn, cn thc hin cc bc sau B1:


#include <stdio.h> // mo file de doc FILE* fi = fopen("input.txt", "rt");

trong hm fopen nhn 2 tham s: tham s u tin (kiu char*) l tn file (input.txt), tham s th 2 l chui rt (read + text: c dng file vn bn) Trong trng hp mun vit hm c file v truyn tn file nh mt tham s vo hm:
void DocFile(char* tenFile) { FILE* fi = fopen(tenFile, "rt"); }

B2:
//doc du lieu int n; fscanf(fi, "%d", &n);

dng hm fscanf c d liu. Cch dng hm fscanf tng t hm scanf (ch khc c thm tham s u tin kiu FILE* l con tr n tp tin m trn) B3:
//dong file fclose(fi);

3.2. Xut

Tng t vi nhp d liu, ta cng c cc bc B1:


//mo file de ghi FILE* fo = fopen(tenFile, "wt"); // wt = write (ghi) + text (dang van ban)

B2:
//ghi du lieu ra file fprintf(fo, "%d ",n);

Dng hm fprintf() tng t printf() B3:


// dong file fclose(fo); Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

11

3.3. Cch qun l tp tin nhp/xut trong project ca VS2005

Khi lm vic vi tp tin, ta cn phi t tp tin ng th mc c th debug/thc thi chng trnh. Ta c th s dng VS2005 to tp tin txt, VS2005 s t ng t file ng th mc v ta c th qun l file d dng hn. to file txt, t ca s Solution Explorer, nhn chut phi vo Resources Files, chn Add -> New Item Chn Text File (.txt) v g tn (khng g ui .txt) Sau g ni dung tp tin. Vi cc file m ta xut kt qu ra, ta cng c th thm file vo project d qun l. Cch lm tng t, nhn chut phi vo Resources Files, chn Add -> Existing Item Chn file m ta xut ra. (Xem Demo)

Bi tp (code mu: NhapXuatFile) c t file input.txt mng mt chiu cc s thc. Tp tin input.txt c ni dung nh sau: V d:
5 1.2 2.3 3.4 4.5 5.6

Dng u cha 1 s nguyn l s lng phn t ca mng Dng sau cha cc phn t ca mng cch nhau bi khong trng

#include <stdio.h> void XuatFile(char* tenFile, float* arr, int n) { //mo file de ghi FILE* fo = fopen(tenFile, "wt"); // wt = write (ghi) + text (dang van ban) //ghi du lieu ra file for (int i = 0; i < n; i++) fprintf(fo, "%0.1f ", arr[i]); // dong file fclose(fo); Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

12

} void main() { // mo file de doc FILE* fi = fopen("input.txt", "rt"); //doc du lieu int n; fscanf(fi, "%d", &n); float* arr = new float[n]; for (int i = 0; i < n; i++) fscanf(fi, "%f", &arr[i]); //dong file fclose(fi); // in ra man hinh de kiem tra for (int i = 0; i < n; i++) printf("%0.1f ", arr[i]); printf("\n"); // xuat ra file XuatFile("output.txt", arr, n); }

1. Bin dch on chng trnh trn. 2. To tp tin d liu mi MSSV.txt thay cho file input.txt. Nhp d liu cho file MSSV.txt v chy chng trnh. 3. Xut ra file out_MSSV.txt thay cho file output.txt. Thm file output.txt vo project c th xem kt qu xut t Visual Studio thay v phi dng Windows Explorer v Notepad. 3. Sa li chng trnh ch xut ra file cc tp tin c ch s l ca mng. (ch in ra arr[1], arr[3], ) 4. Sa li chng trnh tnh tng cc phn t v xut ra file tng .
3.4. c n ht file

Nu bi ton c mng cc s thc trn khng c thng tin s lng phn t th ta s gii quyt theo hng c c vo n khi no ht file th dng. Vy ta cn phi bit du hiu kt thc file: hm feof() Xem on chng trnh mu sau: c mt mng khng bit trc s lng cc s thc v in ra mn hnh.
void DocHetFile1(char* tenFile) { FILE* fi = fopen(tenFile, "rt"); float temp; while (!feof(fi)) // khi chua ket thuc file { fscanf(fi, "%f", &temp); // doc so thuc vao bien temp printf("%0.1f ", temp); } Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

13

printf("\n"); fclose(fi); }

Trong , ta s dng vng while v iu kin thc hin l cha ht file: !feof(fi) Hm feof() nhn 1 tham s kiu FILE* l file ang c v tr v true/false nu kt thc/cha kt thc file. Bi tp (code mu: NhapXuatFile)
#include <stdio.h> void DocHetFile1(char* tenFile) { FILE* fi = fopen(tenFile, "rt"); float temp; while (!feof(fi)) { fscanf(fi, "%f", &temp); printf("%0.1f ", temp); } printf("\n"); fclose(fi); } void DocHetFile2(char* tenFile) { FILE* fi = fopen(tenFile, "rt"); float temp; while (!feof(fi)) { if (fscanf(fi, "%f", &temp)>0) printf("%0.1f ", temp); else break; } printf("\n"); fclose(fi); } void main() { printf("Doc khi khong biet so luong phan tu, doc den het file thi dung:\n"); DocHetFile1("input2.txt"); DocHetFile1("input3.txt"); }

Trong input2.txt c ni dung


1.2 2.3 3.4 4.5 5.6

input3.txt c ni dung (c 1 du khong trng cui file)


Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

14

1.2 2.3 3.4 4.5 5.6

1. Bin dch on chng trnh trn. 2. Nhn xt v kt qu xut ra mn hnh (2 dng tng ng vi 2 file input2.txt v input3.txt). 2 dng kt qu xut ra c ging nhau khng? 3. Nu 2 dng kt qu xut ra khng ging nhau, gii thch ti sao vi d liu vo nh nhau (xem ni dung file input2.txt v input3.txt) kt qu xut li khng ging nhau. Gi : file input3.txt c mt du khong trng cui file nn vng lp cui sau khi c 5.6 iu kin (!feof(fi)) vn tr v ng (v ht s 5.6 cha l cui file) . 4. Sa li 2 dng
DocHetFile1("input2.txt"); DocHetFile1("input3.txt");

thnh
DocHetFile2("input2.txt"); DocHetFile2("input3.txt");

v chy li chng trnh. Nhn xt kt qu xut. T rt ra kt lun hm no c ht file chnh xc hn. Gi : Hm DocHetFile2 v DocHetFile1 ch khc nhau ch hm DocHetFile2 c kim tra lnh c s thc t file c thnh cng hay khng nh sau: Hm fscanf() c gi tr tr v l s lng bin c thnh cng
if (fscanf(fi, "%f", &temp)>0)

y ta c 1 bin , do ch cn kim tra gi tr tr v > 0 l c thnh cng.

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

15

4. QUY Mt hm c gi l quy nu bn trong thn ca hm c li gi hm li chnh n mt cch tng minh hay tim n Khi vit hm quy, cn xc nh: V d: Tnh tng S(n) = 1 + 2 + + n Ta c S(n) = (1 + 2 + + n-1) + n hay S(n) = S(n-1) + n S(0) = 0 (cng thc quy) (iu kin dng) iu kin dng Cng thc quy

Ta c chng trnh tng ng vi cng thc quy trn nh sau:


int Tong(int n ) { if (n == 0) return 0; return Tong(n-1) + n; }

Bi tp (code mu: DeQuy)


#include <stdio.h> int Tong(int* a, int n) { if ( n == 0) return a[0]; return Tong(a, n-1) + a[n]; } void main() { int n; printf("Nhap n: "); scanf("%d", &n); int* a = new int[n]; for (int i = 0; i < n; i++) { printf("Nhap a[%d] = ",i); scanf("%d",&a[i]); } Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

16

printf("%d\n",Tong(a, n-1)); }

1. Bin dch on chng trnh trn. 2. Cho bit on chng trnh trn thc hin tc v g. 3. Vit cng thc quy v iu kin dng ca chng trnh quy trn. Nu chng trnh quy khng c iu kin dng th iu g s xy ra? 4. Sa li chng trnh tnh tch ca cc phn t ca mt dy s nguyn bng phng php quy 5. Sa li chng trnh tnh tng cc s l c trong mng bng phng php quy

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

17

DANH SCH LIN KT


MC TIU
Hon tt bi thc hnh ny, sinh vin c th: Hiu c cc thnh phn ca danh sch lin kt. Thnh tho cc thao tc trn danh sch lin kt: thm phn t, xa phn t, duyt danh sch lin kt. p dng cu trc d liu danh sch lin kt vo vic gii quyt mt s bi ton n gin.

Thi gian thc hnh: t 120 pht n 400 pht

TM TT
Danh sch lin kt l cu trc d liu dng lu tr mt danh sch (tp hp hu hn) d liu. im c bit ca cu trc ny l kh nng cha ca n ng (c th m rng v thu hp d dng). C cc loi danh sch lin kt: Danh sch lin kt n Danh sch lin kt kp Danh sch lin kt vng

Mi danh sch lin kt l tp hp cc phn t (node) cha thng tin lu tr ca d liu. Gia cc phn t c mt hoc nhiu lin kt m bo danh sch lin kt c th gi cc phn t ny mt cch cht ch. V d 1:

Phn t c mt lin kt V d 2:

Phn t c hai lin kt

Phn t rng Danh sch lin kt n Danh sch lin kt kp Danh sch lin kt vng

Trong mi phn t ca danh sch lin kt, thng tin lin kt l v cng quan trng. Ch cn mt x l khng cn thn c th lm mt phn lin kt ny th danh sch lin kt s b gy t phn t (khng th truy xut tip cc phn t t phn t tr v trc hoc tr v sau). Cc thao tc c bn trn danh sch lin kt: Thm phn t: vo u danh sch lin kt, vo cui danh sch lin kt, vo trc/sau mt phn t trn danh sch lin kt. Xa phn t: u danh sch lin kt, cui danh sch lin kt, mt phn t trn danh sch lin kt. Duyt danh sch lin kt: c th i c ht cc phn t trn danh sch lin kt.

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

NI DUNG THC HNH C bn


Sinh vin c k pht biu bi tp v thc hin theo hng dn: T chc mt danh sch lin kt n trong mi phn t cha thng tin d liu nguyn. Ngi dng s nhp cc gi tr nguyn t bn phm. Vi mi gi tr nguyn c nhp vo, gi tr c thm vo pha u ca danh sch lin kt. Nu ngi dng nhp vo gi tr -1, qu trnh nhp d liu s kt thc. Sau , in ra cc phn t ang c trn danh sch lin kt. Khi chng trnh kt thc, tt c cc phn t trn danh sch lin kt b xa b khi b nh. Phn tch Danh sch lin kt n gm mi phn t cha d liu nguyn. Thng tin ca mi phn t c khai bo theo ngn ng C/C++ nh sau:

struct NODE{ int Key; NODE *pNext; };

Thao tc cn thc hin: thm phn t nguyn vo u danh sch lin kt (AddHead), in cc phn t ca danh sch lin kt (PrintList), loi b tt c cc phn t trn danh sch lin kt (RemoveAll).

Chng trnh mu
#include "stdafx.h" struct NODE{ int Key; NODE *pNext; }; NODE* CreateNode(int Data) { NODE* pNode; pNode = new NODE; //Xin cp pht b nh ng to mt phn t (node) mi if (pNode == NULL) return NULL; pNode->Key = Data; pNode->pNext = NULL; return pNode; } bool AddHead(NODE* &pHead, int Data) { NODE *pNode; pNode = CreateNode(Data); if (pNode == NULL) return false; if (pHead == NULL) pHead = pNode; else { pNode->pNext = pHead; pHead = pNode; } return true; } Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

void PrintList(NODE *pHead) { NODE *pNode; pNode = pHead; while (pNode != NULL) { printf("%5d", pNode->Key); pNode = pNode->pNext; //Ghi chu: thao tc ny dng lm g? } } void RemoveAll(NODE* &pHead) //Ghi chu: ngha ca k hiu & { NODE *pNode; while (pHead != NULL) { pNode = pHead; pHead = pHead->pNext; delete pNode; } pHead = NULL; //Ghi chu: Ti sao phi thc hin php gn ny? } int _tmain(int argc, _TCHAR* argv[]) { NODE *pRoot; //Ghi chu: Ti sao li phi thc hin php gn pha di? pRoot = NULL; int Data; do { printf("Nhap vao du lieu, -1 de ket thuc: "); scanf("%d", &Data); if (Data == -1) break; AddHead(pRoot, Data); }while (Data != -1); printf("\nDu lieu da duoc nhap: \n"); //Ghi chu: Chc nng ca dng lnh pha di PrintList(pRoot); //Ghi chu : Chc nng ca dng lnh pha di RemoveAll(pRoot); return 0; }

Yu cu 1. Bin dch on chng trnh nu trn. 2. Cho bit kt qu in ra mn hnh khi ngi dng nhp vo cc d liu sau: -1 5 7 1 -1 2 3 4 -1 10 -23 -25 -4 1 -1

3. Nu nhn xt ngn gn mi lin h gia th t nhp d liu vo vi th t in d liu ra mn hnh.


Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

4. V hnh danh sch lin kt theo d liu c nhp cu 2. 5. Nu trong hm main (_tmain) th t hai dng lnh sau y b hon i cho nhau th kt qu kt xut ra mn hnh s nh th no i vi d liu cu 2? Gii thch l do?
//Ghi chu PrintList(pRoot); //Ghi chu RemoveAll(pRoot);

6. Nu trong hm main (_tmain) vng lp dowhile c thay i nh di y th kt qu kt xut ra mn hnh s nh th no i vi d liu cu 2? Gii thch l do?
do { printf("Nhap vao du lieu, -1 de ket thuc: "); scanf("%d", &Data); AddHead(pRoot, Data); if (Data == -1) break; }while (Data != -1);

7. Vi cc hm CreateNode, AddHead c cung cp sn, hy cho bit ngha ca cc gi tr tr v ca hm. 8. Hy ghi ch cc thng tin bng cch tr li cc cu hi ng vi cc dng lnh c yu cu ghi ch (//Ghi ch) trong cc hm RemoveAll, PrintList, _tmain. 9. Kt qu s nh th no nu hm RemoveAll c thay i nh di y? Gii thch l do
void RemoveAll(NODE* &pHead) { while (pHead != NULL) { pHead = pHead->pNext; delete pHead; } pHead = NULL; //Ghi chu: Ti sao phi thc hin php gn ny? }

10. Gi tr cui cng ca bin pRoot trong on chng trnh mu l g? Gii thch l do.

p dng Nng cao


1. B sung chng trnh mu cho php tnh tng gi tr cc phn t trn danh sch lin kt n gm cc gi tr nguyn. Gi : tham kho hm PrintList vit hm SumList. 2. B sung chng trnh mu cho php tm gi tr nguyn ln nht trong s cc phn t nguyn trn danh sch lin kt n gm cc gi tr nguyn. Gi : tham kho hm PrintList vit hm MaxList. 3. B sung chng trnh mu cho php tnh s lng cc phn t ca danh sch lin kt n gm cc gi tr nguyn. Gi : tham kho hm PrintList vit hm CountList. 4. B sung chng trnh mu cho php thm vo cui danh sch lin kt n mt gi tr nguyn. 5. B sung chng trnh mu cho php xa phn t u danh sch lin kt n. 6. B sung chng trnh mu cho php xa phn t cui danh sch lin kt n.
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

Gi : tham kho hm AddHead vit hm AddTail.

7. B sung chng trnh mu cho bit s lng cc phn t trn danh sch lin kt n c gi tr trng vi gi tr x c cho trc. Gi : tham kho thao tc duyt danh sch lin kt trong hm PrintList. 8. B sung chng trnh mu cho php to mt danh sch lin kt n gm cc phn t mang gi tr nguyn trong khng c cp phn t no mang gi tr ging nhau. Gi : s dng hm AddHead hoc AddTail c b sung thao tc kim tra phn t ging nhau. 9. Cho sn mt danh sch lin kt n gm cc phn t mang gi tr nguyn v mt gi tr nguyn x. Hy tch danh sch lin kt cho thnh 2 danh sch lin kt: mt danh sch gm cc phn t c gi tr nh hn gi tr x v mt danh sch gm cc phn t c gi tr ln hn gi tr x. Gii quyt trong 2 trng hp: a. Danh sch lin kt ban u khng cn tn ti. b. Danh sch lin kt ban u bt buc phi tn ti.

BI TP THM
1. xut cu trc d liu thch hp biu din a thc (anxn + an-1xn-1+..+ a1x + a0) bng danh sch lin kt (n hoc kp). Ci t cc thao tc trn danh sch lin kt n biu din a thc: a. b. c. d. In a thc Rt gn a thc Cng hai a thc Nhn hai a thc Tn sch (chui) Tc gi (chui, ti a 5 tc gi) Nh xut bn (chui)

2. Thng tin ca mt quyn sch trong th vic gm cc thng tin:

Nm xut bn (s nguyn) a. Hy to danh sch lin kt (n hoc kp) cha thng tin cc quyn sch c trong th vin (c nhp t bn phm). b. Cho bit s lng cc quyn sch ca mt tc gi bt k (nhp t bn phm). c. Trong nm YYYY (nhp t bn phm), nh xut bn ABC (nhp t bn phm) pht hnh nhng quyn sch no.

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

STACK v QUEUE
MC TIU
Hon tt phn thc hnh ny, sinh vin c th: Hiu c cch thc s dng stack v queue trn c s s dng danh sch lin kt ci t. Hiu v vn dng cc cu trc stack v queue trong nhng bi ton n gin.

Thi gian thc hnh: 120 pht n 360 pht. Lu : yu cu vn dng thnh tho danh sch lin kt Lab02.

TM TT
Stack (ngn xp) v queue (hang i) l nhng cu trc d liu dng lu tr cc phn t ca tp hp theo nhng nguyn tc c bit khi thm phn t cng nh ly phn t ra khi cu trc. Stack (last in, first out LIFO): phn t vo stack sau cng, l phn t c ly ra khi stack trc nht. Queue (first in, first out FIFO): phn t vo queue trc nht, l phn t c ly ra khi queue trc nht.

Lab03 l phn vn dng danh sch lin kt thc hnh Lab02 ci t Stack v Queue. (Lu : chng ta cng c th dng mng ci t stack v queue, nhng mng c trng cho c ch tnh, do vy danh sch lin kt c ch ng - l cu trc tt hn mng khi hin thc Stack v Queue). V d: minh ha Stack Ly

Thm

STACK

+ Phn t mi c thm vo nh ca ngn xp. + Thao tc ly phn t ra khi ngn xp, nu ngn xp khc rng th phn t u ngn xp c ly ra, ngc li, ngn xp rng th thao tc ly phn t tht bi. V d: minh ha Queue

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

Thm

QUEUE

Ly

+ Phn t c thm vo u queue. Do vy, phn t vo u tin s y ca queue. Do vy, khi ly phn t ra, nu queue khc rng th phn t y queue c ly ra, ngc li, queue b rng th thao tc ly phn t ra khi queue tht bi.

NI DUNG THC HNH C bn


Yu cu: ci t stack v queue bng danh sch lin kt. Do c trng ca stack v queue, chng ta cn xy dng 2 thao tc chnh l thm 1 phn t vo stack hoc queue, v ly 1 phn t ra khi stack hoc queue. Da vo nguyn tc thm v ly phn t ra khi stack/queue, ta cn xy dng cc hm sau: i vi Stack o Thm phn t: thm phn t vo u danh sch lin kt. o Ly phn t: ly phn t u danh sch ra khi danh sch lin kt.

(Lu : ta cng c th thm phn t vo cui danh sch lin kt, do vy thao tc ly phn t, ta thc hin ly phn t cui danh sch lin kt). i vi Queue o Thm phn t: thm vo u danh sch lin kt. o Ly phn t: ly phn t cui danh sch lin kt.

(Lu : ta cng c th thc hin vic thm phn t vo cui danh sch lin kt v ly ra u danh sch lin kt). S dng bi tp Lab02 Chng trnh mu
#include <stdio.h> struct NODE{ int Key; NODE *pNext; }; NODE* CreateNode(int Data) { NODE* pNode; pNode = new NODE; if (pNode == NULL) return NULL; pNode->Key = Data; pNode->pNext = NULL; return pNode; } bool AddHead(NODE* &pHead, int Data) { NODE *pNode; pNode = CreateNode(Data); if (pNode == NULL) return false; if (pHead == NULL) pHead = pNode; else { pNode->pNext = pHead; pHead = pNode; Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

} return true; } NODE* RemoveHead(NODE* &pHead) { if(pHead == NULL) return NULL; NODE* pResult = pHead; pHead = pHead->pNext; return pResult; } NODE* RemoveTail(NODE* &pHead) { NODE *pNode; if(pHead == NULL) { return NULL; } else if(pHead->pNext == NULL) { pNode = pHead; pHead = NULL; return pNode; } pNode = pHead; while(pNode->pNext->pNext != NULL) { pNode = pNode->pNext; } NODE* pResult = pNode->pNext; pNode->pNext = NULL; return pResult; } //-------STACK : //----PUSH tng ng AddHead //----POP tng ng RemoveHead bool PushStack(NODE* &pStack, int Data) { return AddHead(pStack, Data); } NODE* PopStack(NODE* &pStack) { return RemoveHead(pStack); } //--------QUEUE : //----ENQUEUE tng ng AddHead //----DEQUEUE tng ng RemoveTail bool EnQueue(NODE* &pQueue, int Data) { return AddHead(pQueue, Data); } NODE* DeQueue(NODE* &pQueue) { return RemoveTail(pQueue); } Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

//<1>

//<2>

//<3>

Trang

void main() { NODE* pStack = NULL; NODE* pQueue = NULL; int n = 10; while(n!=0) { PushStack(pStack, n); EnQueue(pQueue, n); n--; } NODE* pNode = DeQueue(pQueue); if(pNode != NULL) //<4> printf("\nGia tri phan tu (Queue) : %d\n", pNode->Key); else printf("\nNULL\n"); NODE* pNode2 = PopStack(pStack); if(pNode2 != NULL) printf("\nGia tri phan tu (Stack) : %d\n", pNode2->Key); else printf("\nNULL\n"); }

1. Bin dch on chng trnh trn. 2. Thay gi tr n=10 thnh n=1 trong main, c gi tr Queue v Stack in ra mn hnh. 3. Gii thch <4> khi no gi tr pNode khc NULL, khi no pNode bng NULL, ngha ca mi trng hp trn. 4. Gii thch hm RemoveTail cc im <1>, <2>, <3> cho bit ngha ca chng. 5. S dng cc hm PushStack, PopStack, EnQueue, DeQueue ci t. a. V Stack: Trong hm main, thc hin vic thm vo 3 gi tr do ngi dng nhp vo (thc hin 3 lnh thm phn t vo stack), sau thc hin 4 ln lnh ly gi tr phn t ra khi stack, nu c, in gi tr phn t ra mn hnh, nu khng c (stack rng), in ra mn hnh STACK RONG, KHONG LAY DUOC PHAN TU. b. V Queue: Trong hm main, thc hin vic thm vo 3 gi tr do ngi dng nhp vo (thc hin 3 ln lnh thm phn t vo queue), sau thc hin 4 ln lnh ly gi tr phn t ra khi queue, nu c, in gi tr phn t ra mn hnh, nu khng c (queue rng), in ra mn hnh QUEUE RONG, KHONG LAY DUOC PHAN TU.

p dng Nng cao


1. Ci t hm AddTail c phin bn ci t Stack (thm phn t vo cui danh sch v ly phn t cui danh sch lin kt) cng nh p dng 1 phin bn khc khi ci t Queue (thm phn t vo cui danh sch lin kt v ly phn t u danh sch lin kt). 2. Nhn xt cch ci t trn phn 1 (p dng nng cao) so vi chng trnh mu i vi trng hp stack cng nh queue. 3. S dng cu trc Stack chuyn gi tr t c s 10 sang c s 2. Gi : thc hin vic chia lin tip gi tr trong c s 10 cho 2, ly phn d a vo stack, cho n khi gi tr em i chia l 0. In gi tr trong stack ra ( chnh l kt qu khi chuyn s t h c s 10 sang h c s 2).
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

BI TP THM
Tm ng trong m cung (thc hin loang theo chiu rng <s dng queue> hoc loang theo chiu su <s dng stack>). Bi ton: cho ma trn mxn, mi phn t l s 0 hoc 1. Gi tr 1 : c th i ti v gi tr 0 : khng th i ti c. Cu hi: T ban u c ta (x1, y1) c th i ti (x2, y2) khng? Bit rng t 1 (x,y) ch c th i qua c chung cnh vi ang ng v mang gi tr l 1, ngc li khng c ng i.

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

CY NH PHN TM KIM
MC TIU
Hon tt bi thc hnh ny, sinh vin c th: Hiu c cc thnh phn ca cy nh phn tm kim. Thnh tho cc thao tc trn cy nh phn tm kim: to cy, thm phn t, xa phn t, duyt cy nh phn tm kim. p dng cu trc d liu cy nh phn tm kim vo vic gii quyt mt s bi ton n gin.

Thi gian thc hnh: t 120 pht n 400 pht

TM TT
Cy nh phn tm kim l cy c ti a 2 nhnh (cy con), nhnh tri v nhnh phi. Cy nh phn tm kim c cc tnh cht sau: Kha ca tt c cc nt thuc cy con tri nh hn kha nt gc. Kha ca nt gc nh hn kha ca tt c cc nt thuc cy con phi. Cy con tri v cy con phi ca nt gc cng l cy nh phn tm kim

Mt s khi nim:

Nt l c cao bng 1

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

V d cy nh phn tm kim:

Trong mi nt ca cy nh phn tm kim, thng tin lin kt l v cng quan trng. Ch cn mt x l khng cn thn c th lm mt phn lin kt ny th cy s b gy cy con lin quan ng vi lin kt (khng th truy xut tip tt c cc nt ca nhnh con b mt). Cc thao tc c bn trn cy nh phn tm kim: Thm 1 nt: da vo tnh cht ca cy nh phn tm kim tm v tr thm nt mi. o To cy: t cy rng, ln lt thm cc nt vo cy bng phng thc thm nt vo cy nh phn tm kim Xa 1 nt: l nt l, l nt c 1 nhnh con, l nt c 2 nhnh con. Duyt cy nh phn tm kim: c th i c ht cc phn t trn cy nh phn tm kim: duyt trc (NLR), duyt gia (LNR), duyt sau (LRN). Do tnh cht ca cy nh phn tm kim, php duyt gia cho php duyt cc kha ca cy theo th t tng dn

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

NI DUNG THC HNH C bn


Sinh vin c k pht biu bi tp v thc hin theo hng dn: T chc mt cy nh phn tm kim trong mi phn t cha thng tin d liu l s nguyn. Ngi dng s nhp cc gi tr nguyn t bn phm. Vi mi gi tr nguyn c nhp vo, gi tr c thm vo cy nh phn tm kim m vn m bo cy sau khi thm vn l cy nh phn tm kim. Nu ngi dng nhp vo gi tr -1, qu trnh nhp d liu s kt thc. Cy ban u l cy rng (cha c nt no) Sau , in ra cc phn t ang c trn cy bng phng php duyt trc. Cho ngi dng nhp vo 1 gi tr nguyn t bn phm, cho bit gi tr ny c trong cy hay khng. Nu c, cho bit nt c cao bao nhiu. Sau , xa nt khi cy, xut cy sau khi xa bng phng php duyt trc Phn tch Cy nh phn tm kim c mi nt cha d liu nguyn. Thng tin ca mi nt c khai bo theo ngn ng C/C++ nh sau:

struct NODE{ int Key; NODE *pLeft; NODE *pRight; };

Thao tc cn thc hin: o Khai bo, khi to cy o (lp) thm nt c kha nguyn vo cy nh phn tm kim (Insert), o in cc nt ca cy nh phn tm kim (NLR), o tm 1 gi tr, nu c: tnh cao ca nt (Height) xa nt khi cy (RemoveNode) in cc nt ca cy sau khi xa (NLR)

Chng trnh mu
#include "stdio.h" struct NODE{ int Key; NODE *pLeft; NODE *pRight; }; void Init(NODE *&TREE) { TREE = NULL; } void { Insert (NODE *&pRoot, int x)

if (pRoot == NULL) Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

{ NODE *q; q = new NODE; q->Key = x; q->pLeft = q->pRight = NULL; pRoot = q; } else { if (x < pRoot->Key) Insert (pRoot->pLeft, x); else if (x > pRoot->Key) Insert (pRoot->pRight, x); } } void CreateTree(NODE *&pRoot) { int Data; do{ printf("Nhap vao du lieu, -1 de ket thuc: "); scanf("%d", &Data); if (Data == -1) break; Insert(pRoot, Data); } while(1); } void NLR(NODE* pTree) { if(pTree != NULL) { printf("%4d", pTree->Key); NLR(pTree->pLeft); NLR(pTree->pRight); } } NODE* Search(NODE* pRoot, int x) { if(pRoot == NULL) return NULL; if(x < pRoot->Key) Search(pRoot->pLeft, x); else if(x > pRoot->Key) Search(pRoot->pRight, x); else { //Ghi ch: Trong trng hp no dng bn di c thc hin? return pRoot; } } int Height(NODE* pNode) { if(pNode == NULL) return 0; int HL, HR; HL = Height(pNode->pLeft); HR = Height(pNode->pRight); if(HL > HR) return (1 + HL); return (1 + HR); Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

} void SearchStandFor(NODE* &Tree, NODE* &q) { if (Tree->pRight) SearchStandFor(Tree->pRight,q); else { q->Key = Tree->Key; q = Tree; Tree = Tree->pLeft; } } void RemoveNode(NODE* &Tree, int x) { NODE* p; if(Tree == NULL) printf("%d khong co trong cay", x); else { if (x < Tree->Key) RemoveNode(Tree->pLeft,x); else if (x > Tree->Key) RemoveNode(Tree->pRight,x); else { //Ghi ch: Mc ch php gn ny l g? p = Tree; if(p->pRight == NULL) Tree = p->pLeft; else if (p->pLeft == NULL) Tree = p->pRight; else { //Ghi ch: Hm bn di dng lm g? SearchStandFor(Tree->pLeft,p); } delete p; } } } void main() { NODE* pTree, *p; int x; Init(pTree); CreateTree(pTree); NLR(pTree); printf("Nhap vao 1 gia tri de tim: "); scanf("%d", &x); p = Search(pTree, x); if(p != NULL) { printf ("%d co xuat hien trong cay.\n", x); printf("Chieu cao cua nut %d la %d\n", x, Height(p)); RemoveNode(pTree, x); NLR(pTree); } else Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

printf("%d khong co trong cay.\n", x); }

Yu cu 1. Bin dch on chng trnh nu trn. 2. Cho bit kt qu in ra mn hnh khi ngi dng nhp vo cc d liu sau: -1 -1 ---------------------------------5 -1 ---------------------------------7 -23 ----------------------------------23 -23 ---------------------------------7 -23 ---------------------------------1 3 3. Nu nhn xt ngn gn mi lin h gia th t nhp d liu vo (vi cng tp d liu d liu th 3, 4, v 5) vi th t in d liu ra mn hnh. 4. V hnh cy nh phn tm kim theo d liu c nhp cu 2. 5. Nu b Init(pTree) trong hm main kt qu c thay i hay khng? Gii thch l do? 6. Nu trong hm CreateTree vng lp dowhile c thay i nh di y th kt qu kt xut ra mn hnh s nh th no i vi d liu cu 2? Gii thch l do?
do { printf("Nhap vao du lieu, -1 de ket thuc: "); scanf("%d", &Data); Insert(pRoot, Data); if (Data == -1) break; }while (1);

-1

10

-23

-25

-4

-1

10

-25

-4

-1

10

-23

-4

-25

-1

-1

7. Trong hm NLR nu ta i trt t nh bn di th kt qu th no?


void NLR(NODE* pTree) { if(pTree != NULL) { NLR(pTree->pLeft); printf("%4d", pTree->Key); NLR(pTree->pRight); Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

} }

8. Hy ghi ch cc thng tin bng cch tr li cc cu hi ng vi cc dng lnh c yu cu ghi ch (//Ghi ch) trong cc hm Search, RemoveNode. 9. Nu trong hm RemoveNode thay i nh sau, kt qu c thay i khng? Nu c, ch ra cch kt qu khng thay i. Nu khng, gii thch l do
else { //Ghi ch: Hm bn di dng lm g? SearchStandFor(Tree->pRight,p); }

10. Trong hm RemoveNode nu khng c dng delete p; th kt qu c g khc? Dng dng lm g.

p dng Nng cao


1. B sung chng trnh mu cho php tnh tng gi tr cc nt trn cy nh phn gm cc gi tr nguyn. Gi : tham kho hm NLR vit hm SumTree. 2. B sung chng trnh mu cho php tm gi tr nguyn ln nht v nh nht trong s cc phn t nguyn trn cy nh phn tm kim gm cc gi tr nguyn. Gi : da vo tnh cht 1, 2 ca cy nh phn tm kim. 3. B sung chng trnh mu cho php tnh s lng cc nt ca cy nh phn gm cc gi tr nguyn. Gi : tham kho hm NLR vit hm CountNode. 4. B sung chng trnh mu cho bit s lng cc nt l trn cy nh phn. Gi : tham kho thao tc duyt cy nh phn NLR. 5. S dng cy nh phn tm kim gii bi ton: a. m c bao nhiu gi tr phn bit trong dy s cho trc b. Vi mi gi tr phn bit, cho bit s lng phn t

BI TP THM
1. S dng cy nh phn tm kim gii bi ton m (thng k) s lng k t c trong vn bn (Khng du). a. Xy dng cy cho bit mi k t c trong vn bn xut hin my ln b. Nhp vo 1 k t. Kim tra k t xut hin bao nhiu ln trong vn bn 2. Bi ton tng t nh trn nhng thng k s lng ting c trong vn bn (khng du) V d: Vn bn c ni dung nh sau: hoc sinh di hoc mon sinh hoc Kt qu cho thy nh sau: Trang hoc: 3 mon: 1
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

di: 1

sinh: 2

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

CY CN BNG AVL
MC TIU
Hon tt bi thc hnh ny, sinh vin c th: Hiu c cc thao tc quay cy (quay tri, quay phi) hiu chnh cy thnh cy cn b ng. Ci t hon chnh cy cn bng AVL.

Thi gian thc hnh: 120 pht 360 pht Lu : Sinh vin phi thc hnh bi tp v Cy nh phn v Cy nh phn tm kim trc khi lm bi ny.

TM T T
Cy cn b ng AVL l cy nh phn tm kim (NPTK) m ti mi nh ca cy, cao ca cy con tri v cy con phi khc nhau khng qu 1.
V d 1: cy cn bng AVL V d 2: cy khng cn bng

Khi thm node mi vo cy AVL c th xy ra cc trng hp mt cn bng nh sau:


Mt cn bng phi-phi (R-R) Mt cn bng phi-tri (R-L)

Mt cn bng tri-tri (L-L)

Mt cn bng tri-phi (L-R)

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

X l mt cn b ng bng cch s dng cc php quay cy a. Quay tri

b. Quay phi

X l c th cho cc trng hp mt cn bng nh sau:


MT CN BNG PHI Mt cn bng phi-phi (R-R) Mt cn bng phi-tri (R-L) - Quay tri ti node b mt cn - Quay phi ti node con phi ca bng node b mt cn bng - Quay tri ti node b mt cn bng MT CN BNG TRI Mt cn bng tri-phi (L-R) Mt cn bng tri-tri (L-L) - Quay tri ti node con tri ca - Quay phi ti node b mt cn bng node b mt cn bng Quay phi ti node b mt cn bng

Ging vi cy NPTK, cc thao tc trn cy cn bng bao gm: Thm phn t vo cy Tm kim 1 phn t trn cy Duyt cy Xa 1 phn t trn cy

NI DUNG THC HNH


Trang

Sinh vin c k pht biu bi tp v thc hin theo hng dn:


Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

C bn

T chc mt cy cn bng AVL trong mi node trn cy cha thng tin d liu nguyn. Ngi dng s nhp cc gi tr nguyn t bn phm. Vi mi gi tr nguyn c nhp vo, phi to cy AVL theo ng tnh cht ca n. Nu ngi dng nhp -1 qu trnh nhp d liu s kt thc. Sau , xut thng tin cc node trn cy. Khi chng trnh kt thc, tt c cc node trn cy b xa b khi b nh. Phn tch Cc node trn cy cn bng cng ging nh cc node trn cy NPTK. Tuy nhin, do mi ln thm node vo cy chng ta cn kim tra cao ca node va thm kim sot tnh cn bng ca cy nn cn b sung thm gi tr cho bit s cn bng ti node vo cu trc ca node. C th nh sau:

struct AVLNODE { int key; int bal; // thuc tnh cho bit gi tr cn bng // 0: cn bng, 1: lch tri, 2: lch phi NODE* pLeft; NODE* pRight; };

Cc thao tc cn ci t: xoay tri cy (RotateLeft), xoay phi cy (RotateRight), thm 1 node mi vo cy (InsertNode), duyt cy theo (Traverse), xa ton b node trn cy (RemoveAll) chng trnh mch lc v r rng hn, chng ta s ci t 2 hm x l cn bng khi cy lch tri v lch phi theo bng phn loi trang 2. Nh vy trong chng trnh s c thm 2 hm BalanceLeft v BalanceRight.

Chng trnh tham kho


#include <stdio.h> struct AVLNODE { int Key; int bal; // thuc tnh cho bit gi tr cn bng // 0: cn bng, 1: lch tri, 2: lch phi AVLNODE* pLeft; AVLNODE* pRight; }; AVLNODE* CreateNode(int Data) { AVLNODE* pNode; pNode = new AVLNODE; //Xin cp pht b nh ng to mt phn t (node) mi if (pNode == NULL){ return NULL; } pNode->Key = Data; pNode->pLeft = NULL; pNode->pRight = NULL; pNode->bal = 0; //Ghi ch: gii thch ngha ca thao tc ny return pNode; } void LeftRotate(AVLNODE* &P) Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

{ AVLNODE *Q; Q = P->pRight; P->pRight = Q->pLeft; Q->pLeft = P; P = Q; } void RightRotate(AVLNODE* &P) { //Ghi ch: sinh vin t code cho hm ny } void LeftBalance(AVLNODE* &P) { switch(P->pLeft->bal){ case 1: //mt cn bng tri tri RightRotate(P); P->bal = 0; P->pRight->bal = 0; break; case 2: //Ghi ch: cho bit y l trng hp mt cn bng no? LeftRotate(P->pLeft); RightRotate(P); switch(P->bal){ case 0: P->pLeft->bal= 0; P->pRight->bal= 0; break; case 1: P->pLeft->bal= 0; P->pRight->bal= 2; break; case 2: P->pLeft->bal= 1; P->pRight->bal= 0; break; } P->bal = 0; break; } } void RightBalance(AVLNODE* &P) { switch(P->pRight->bal){ case 1: //Ghi ch: cho bit y l trng hp mt cn bng no? RightRotate(P->pRight); LeftRotate(P); switch(P->bal){ case 0: P->pLeft->bal= 0; P->pRight->bal= 0; break; case 1: P->pLeft->bal= 1; P->pRight->bal= 0; break; case 2: P->pLeft->bal= 0; P->pRight->bal= 2; break; } P->bal = 0; break; case 2: //Ghi ch: cho bit y l trng hp mt cn bng no? Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

LeftRotate(P); P->bal = 0; P->pLeft->bal = 0; break; } } int InsertNode(AVLNODE* &tree, int x) { int res; if(tree==NULL){ //Ghi ch: cho bit ngha ca cu lnh ny tree = CreateNode(x); if(tree==NULL){ return -1; //thm ko thnh cng v thiu b nh } return 2;//thm thnh cng v lm tng chiu cao cy } else { if(tree->Key==x){ return 0; //kha ny tn ti trong cy } else if(tree->Key > x){ res = InsertNode(tree->pLeft,x); if(res < 2) { return res; } switch(tree->bal){ //Ghi ch: gii thch ngha ca cu lnh switch ny case 0: tree->bal = 1; return 2; case 1: LeftBalance(tree); return 1; case 2: tree->bal = 0; return 1; } } else{ res = InsertNode(tree->pRight,x); if(res<2){ return res; } switch(tree->bal){ case 0: tree->bal=2; return 2; case 1: tree->bal = 0; return 1; case 2: RightBalance(tree); return 1; } } } } void Traverse(AVLNODE* t) { if(t!=NULL) { Traverse(t->pLeft); printf("Khoa: %d, can bang: %d\n", t->Key,t->bal); Traverse(t->pRight); Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

} } void RemoveAll(AVLNODE* &t) { if(t!=NULL){ RemoveAll(t->pLeft); RemoveAll(t->pRight); delete t; } } int _tmain(int argc, _TCHAR* argv[]) { AVLNODE *tree; //Ghi chu: Ti sao li phi thc hin php gn pha di? tree = NULL; int Data; do { printf("Nhap vao du lieu, -1 de ket thuc: "); scanf("%d", &Data); if (Data == -1) break; InsertNode(tree, Data); }while (Data != -1); printf("\nCay AVL vua tao: \n"); Traverse(tree); RemoveAll(tree); return 0; }

Yu cu 1. Bin d ch on chng trnh nu trn. 2. Cho bit kt qu in ra mn hnh khi ngi dng nhp vo cc d liu sau: -1 10 30 30 40 35 50 32 -10 20 -5 8 -1 -1

3. Nhn xt trnh t cc node c xut ra mn hnh? Gii thch ti sao li in ra c trnh t nh nhn xt? 4. Sinh vin hon tt hm RightRotate trong source code. Gi : RightRotate tng t hm LeftRotate. 5. Bin d ch li chng trnh sau khi hon thnh cu 3 v cho bit kt qu in ra mn hnh khi ngi dng nhp vo cc d liu sau: 50 20 30 10 -5 7 15 35 57 65 55 -1 6. V hnh cy AVL c to ra t phn nhp liu cu 5.

8. Sinh vin ci t li cc hm dng cho cy nh phn v cy NPTK p dng cho cy AVL.


Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

7. Hy ghi ch cc thng tin bng cch tr li cc cu hi ng vi cc dng lnh c yu cu ghi ch (//Ghi ch) trong cc hm InsertNode, BalanceLeft, BalanceRight, _tmain.

p dng Nng cao


1. Sinh vin t ci t thm chc nng cho php ngi dng nhp vo kha x v kim tra xem kha x c nm trong cy AVL hay khng. Cho dy A nh sau: 1 3 5 7 9 12 15 17 21 23 25 27 a. To cy AVL t d y A. Cho bit s php so snh cn thc hin tm phn t 21 trn cy AVL va to. b. To cy nh phn tm kim t dy A dng li on code to cy ca b i thc hnh trc). Cho bit s php so snh cn thc hin tm phn t 21 trn cy nh phn tm kim va to. c. So snh 2 kt qu trn v rt ra nhn xt? 2. Ci t chng trnh c cc s nguyn t tp tin input.txt (khng bit trc s lng s nguyn trn tp tin) v to cy AVL t d liu c c 3. Ci t cy cn bng AVL trong mi node trn cy lu thng tin sinh vin. 4. T tm hiu v ci t chc nng xa mt node ra khi cy AVL.

BI TP THM
1. Vit chng trnh cho php to, tra cu v sa cha t in Anh-Vit (sinh vin lin h vi GVLT chp file t in Anh-Vit) 2. Ci t li cc bi tp thm ca cy NPTK b ng cch d ng cy AVL

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

CC THUT TON SP XP
MC TIU
Hon tt bi thc hnh ny, sinh vin c th: Hiu c cc thut ton sp xp: Selection Sort, Heap Sort, Quick Sort, Merge Sort. p dng cc thut ton sp xp gii quyt cc bi ton sp xp n gin. p dng cc thut ton sp xp gii quyt cc bi ton sp xp trn danh sch cc cu trc theo tng kha. So snh, nh gi thi gian chy ca thut ton vi s lng phn t ln.

Thi gian thc hnh: t 120 pht n 400 pht

TM TT
Sp xp l qu trnh x l mt danh sch cc phn t (hoc cc mu tin) t chng theo mt th t tha mn mt tiu chun no da trn ni dung thng tin lu gi ti mi phn t. Mc hiu qu ca tng gii thut ph thuc vo tnh cht ca cu trc d liu c th m n tc ng n. C nhiu gii thut sp xp: Selection sort, Insertion sort, Interchange sort, Bubble sort, Shaker sort, Binary Insertion sort, Shell sort, Heap sort, Quick sort, Merge sort, Radix sort Selection sort Chn phn t nh nht trong N phn t ban u, a phn t ny v v tr ng l u dy hin hnh. Xem dy hin hnh ch cn N-1 phn t ca dy ban u, bt u t v tr th 2; lp li qu trnh trn cho dy hin hnh... n khi dy hin hnh ch cn 1 phn t.

Heap sort Heap l mt dy cc phn t aleft, aleft+1,... , aright sao cho: ai a2i v ai a2i+1, i [left, right]. (ai , a2i), (ai ,a2i+1): cc cp phn t lin i. Heap c nh ngha nh trn c dng trong trng hp sp xp tng dn, khi sp xp gim dn phi i chiu cc quan h. V d 1: Dy s 5 2 6 4 8 1 c b tr theo quan h so snh v to thnh cu trc nh sau:

Phn t mc i chnh l phn t ln trong cp phn t tng ng mc i+1 V d 2: Loi b 8 ra khi cy. Trang
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut

Tin hnh nhiu ln vic loi b ph n t gc ca cy cho n khi tt c cc phn t ca cy u l , khi xp cc phn t theo th t loi b trn cy s c dy sp xp. Quick sort Phn chia dy thnh cc on con nh sau:

on th 2 c th t. Nu cc on 1 v 3 ch c 1 phn ph t th chng cng c th t, , khi d dy con ban u c sp. n 1 v 3 c nhiu nhi hn 1 phn t th dy con ban u ch c th t Ngc li, nu cc on khi cc on 1, 3 c sp. sp xp cc on n 1 v 3, ta ln l lt tin hnh vic phn hoch tng ng dy con theo cng phng php phn hoch ch dy ban u va trnh by

Vi x l mt phn t ty trong dy v thng c chn l v tr chnh gia dy y ban u. Merge sort Phn hoch dy ban u u thnh cc dy con lin tip m mi dy con u c th th t.. Lm gim s dy con bng ng cch trn tr tng cp dy con ca hai dy ph thnh mt m dy con ca dy ban u.

NI DUNG THC HNH C bn


Sinh vin c k pht biu bi tp p v th thc hin theo hng dn: S dng cc thut ton Selection Sort, Heap Sort, Quick Sort, Merge Sort sp p xp x mt dy cc s nguyn theo th t tng dn. u di n v cc phn ph t ca dy cc nguyn A t bn phm. Ton Ngi dng s ln lt nhp chiu b dy A c lu tr trong mt m ng s nguyn. Ln lt s dng cc thut ton Selection Sort, Heap Sort, Quick Sort, Merge Sort sp xp dy A. Chng trnh s in cc kt qu s p xp theo tng thut ton ra mn hnh. Phn tch Selection sort Phn tch Dng vng lp tm phn n t t nh nht trong dy hin hnh. o phn t ra u mng Chng trnh mu (CacThuatToanSapXep)

Ti liu hng dn thc c hnh mn Cu trc d liu v gii thut

Trang

#include <stdio.h> void Swap(int &a, int &b) { int c = a; a = b; b = c; } void SelectionSort(int a[],int N ){ //Ghi ch: ti sao khng s dng k hiu & trong hm ny? int min; //ch s phn t nh nht trong dy hin hnh for (int i=0; i<N-1 ; i++){ //Ghi chu: vng lp ny dng lm g? min = i; for(int j = i+1; j < N ; j++){ //Ghi chu: vng lp ny dng lm g? if (a[j] < a[min]){ min = j; //Ghi chu: thao tc ny dng lm g? } } if (min != i){ Swap(a[min], a[i]); //Ghi chu: thao tc ny dng lm g? } } } void main() { int x[10] = {12, 2, 8, 5, 1, 6, 4, 15}; // khi to cc gi tr trong mng int n = 8; // s phn t ca mng SelectionSort(x, n); for (int i=0; i<n ; i++){ printf("%d ", x[i]); } } Yu cu 1. Bin dch on chng trnh nu trn. 2. Ti sao trong hm SelectionSort, vng lp th nht c iu kin l i < N-1? 3. Tr li cc dng lnh c yu cu ghi ch. 4. Sa li chng trnh nhp dy s nguyn t file input.txt c ni dung nh sau: 5 1 2 3 8 6 23 10 5. Sa hm SelectionSort trn sp xp dy s nguyn cu 4 gim dn.
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

Sau dng thut ton Selection Sort sp xp dy s nguyn trn tng dn.

Heap Sort Phn tch Hiu chnh dy s ban u v dng heap c nh ngha trn mng (hay list). p dng thut ton Heap Sort trn cu trc ny. Chng trnh mu

void Shift (int a[], int left, int right){ int x, curr, joint; curr = left; joint =2*curr+1; // a x = a[curr];

joint

: Phn t lin i

while (joint <= right){ if (joint < right){ // Ghi ch: iu kin ny c ngha g? if (a[joint] < a[joint+1]){ joint = joint+1; } } if (a[joint]<x){ break; // Tha quan h lin i } a[curr] = a[joint]; curr = joint; // Xt kh nng hiu chnh lan truyn joint = 2*curr+1; } a[curr] = x; } Yu cu 1. Tr li cc dng lnh c yu cu ghi ch. 2. Cho bit chc nng ca on chng trnh trn. 3. Vit hm void CreateHeap(int a[], int N); chuyn i dy a0, a1, , aN-1 thnh heap. Gi : S dng hm Shift bn trn vi left hin hnh l phn t gia dy ((N-1)/2). Lp li qu trnh trn vi left gim dn v u dy. 4. Vit hm void HeapSort(int a[], int N); sp xp mt dy s nguyn tng dn. Gi : Giai on 1: Hiu chnh dy ban u thnh heap Giai on 2: Sp xp dy s da trn heap. Xt dy hin hnh l dy nhp Hon v phn t ln nht (a0) v v tr cui. Xt dy hin hnh loi tr phn t cui. Hiu chnh li dy hin hnh thnh heap Lp li qu trnh trn ti ht dy ban u.

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

5. B sung cc hm trn vo chng trnh mu (CacThuatToanSapXep) ng thi thay i hm main v file input sp xp dy s nguyn sau tng dn:

44 55 12 42 94 18 6 67 6. Vit li thut ton Heap Sort sp xp dy s cu 3 gim dn. Quick Sort Phn tch Chn phn t lm mc. Tin hnh phn hoch dy ban u thnh 3 phn ak<x (1), ak=x (2) v ak>x (3) theo th t. Lp li thao tc trn trn 2 on (1) v (3) Chng trnh mu

void QuickSort(int a[], int left, int right){ int i, j, x; if (left >= right){ return; } x = a[(left+right)/2]; // chn phn t gia lm gi tr mc i = left; j = right; while(i < j) { while(a[i] < x){ i++; } while(a[j] > x){ j--; } if(i <= j) { Swap(a[i], a[j]); i++ ; j--; } } QuickSort(a, left, j); QuickSort(a, i, right); } Yu cu 1. B sung cc hm trn vo chng trnh mu (CacThuatToanSapXep) ng thi thay i hm main v file input sp xp dy s nguyn sau tng dn: 42 23 74 11 65 58 94 36 99 87 2. Sa li chng trnh m s php gn v s php so snh s dng trong hm QuickSort.
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

Merge Sort Phn tch Phn phi u lun phin cc dy con di k t mng a vo hai mng b v c. Trn mng b v mng c vo mng a. Lp li qu trnh trn vi k tng gp i n khi k ln hn hay bng chiu di ca dy. Chng trnh mu

int b[MAX], c[MAX], nb, nc; // Ghi ch: 2 mng ny dng lm g? void Distribute(int a[], int N, int &nb, int &nc, int k){ int i, pa, pb, pc; //Ghi ch: cc bin ny c ngha g? pa = pb = pc = 0; while (pa < N){ for (i=0; (pa<N) && (i<k); i++, pa++, pb++){ //Ghi ch: vng lp ny c ngha g? b[pb] = a[pa]; } for (i=0; (pa<N) && (i<k); i++, pa++, pc++){ //Ghi ch: vng lp ny c ngha g? c[pc] = a[pa]; } } nb = pb; nc = pc; }

void Merge(int a[], int nb, int nc, int k){ int pa, pb, pc; pa = pb = pc = 0; while ((pb < nb) && (pc < nc)){ MergeSubarr(a, nb, nc, pa, pb, pc, k); } while (pb < nb){ a[pa ++] = b[pb ++]; //Ghi ch: cu lnh ny c ngha g? } while (pc < nc){ a[pa ++] = c[pc ++]; //Ghi ch: cu lnh ny c ngha g? }
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

Trong hm MergeSubarr c ci t nh sau: void MergeSubarr(int a[], int nb, int nc, int &pa, int &pb, int &pc, int k){ int rb, rc; rb = min(nb, pb+k); rc = min(nc, pb+k); while ((pb < rb) && (pc < rc)){ if (b[pb] < c[pc]) a[pa ++] = b[pb ++]; else a[pa ++] = c[pc ++]; } while (pb < rb){ a[pa ++] = b[pb ++]; } while (pc < rc){ a[pa ++] = c[pc ++]; } } Yu cu 1. Tr li cc dng lnh c yu cu ghi ch. 2. Cho bit chc nng ca tng hm trn. 3. B sung cc hm cn thit vo chng trnh mu (CacThuatToanSapXep) v vit hm void MergeSort(int a[], int N); sp xp dy s nguyn sau tng dn. 5 2 9 3 7 2 4 11 Gi : Xem li 2 thao tc nu bn trn. 4. Sa li chng trnh sp xp dy s trn gim dn.

p dng Nng cao


Cho dy s nguyn A nh sau: 12 2 15 -3 8 5 1 -8 6 0 4 15 1. Sp xp dy trn tng dn. 2. Suy ra s ln th 3 trong dy. 3. Suy ra s lng phn t ln nht trong dy. 4. Sp xp dy trn theo th t gi tr tuyt i tng dn. 5. Sp xp dy trn theo quy lut sau: cc s dng (nu c) u mng v c th t gim dn, cc s m (nu c) cui mng v c th t tng dn.

6. Sp xp dy trn theo quy lut:


Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

cc s chn (nu c) u mng v c th t tng dn, cc s l (nu c) cui mng v c th t gim dn.

Cho mt danh sch gm cc sinh vin sau:


STT MSSV 1 2 3 4 5 1005 1001 1003 1000 1008 H v tn Nm sinh

Trn Minh Thnh 1991 Trn Th Bch V Quang Vinh Nguyn Vn An 1988 1990 1990 Trn Minh Thnh 1990

7. To mt cu trc d liu x l danh sch trn. 8. Sp xp danh sch tng dn theo m s tng dn. 9. Sp xp danh sch tng dn theo tn (th t bng ch ci) v nm sinh (nu trng tn th sp theo nm sinh tng dn).

BI TP THM
1. Vit chng trnh so snh cc thut ton Selection Sort, Heap Sort, Quick Sort, Merge Sort v cc mt sau: Thi gian chy. S php gn. S php so snh.

Gi : Dng mu chng trnh sau tnh thi gian chy mt on lnh


#include <time.h>

clock_t start, finish; start = clock(); //on chng trnh cn tnh thi gian thc thi finish = clock(); clock_t duration = finish - start; //Thi gian thc thi

2. Trong thut ton QuickSort, nu ly x l phn t du dy, hy vit chng trnh v so snh thi gian chy thut ton vi khi ly x l phn t chnh gia dy. 3. Sp xp dy trn theo quy lut: cc s chn (nu c) c th t tng dn, cc s l (nu c) c th t gim dn tnh cht chn/l ti mi v tr trong dy A khng thay i sau khi sp xp (tc l trc khi sp xp, ti v tr i ca dy A l s chn/l th ti v tr i ca mng sau khi sp xp cng l s chn/l)

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

V d:

A = (1, 1, 2, 3, 4, 5, 6, 7)

Kt qu kq = (1, 1, 6, 3, 4, 5, 2, 7). 4. Vit li cc thut ton Selection Sort, Heap Sort, Quick Sort, Merge Sort.vi cu trc d liu dng danh sch lin kt n. 5.Tm hiu v ci t thut ton Insertion Sort. 6. Tm hiu v ci t thut ton Binary Insertion Sort. 7. Tm hiu v ci t thut ton Interchange Sort. 8. Tm hiu v ci t thut ton Bubble Sort. 9. Tm hiu v ci t thut ton Shaker Sort. 10. Tm hiu v ci t thut ton Shell Sort. 11. Tm hiu v ci t thut ton Radix Sort ln lt trn 2 loi cu trc d liu dng mng v dng danh sch lin kt. So snh v rt ra nhn xt.

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

LAB. 08 CC THU T TON TM KI M


MC TIU

Hon tt bi thc hnh ny, sinh vin c th: Hiu cc loi thut ton tm kim c bn. Thc hnh c cc loi thut ton ny. p dng cho bi ton thc t.
THI GIAN THC HNH

T 120pht 240pht
NI DUNG THC HNH

Tm kim: duyt mt danh sch v ly ra phn t tho tiu chun cho trc. L thao tc ph bin trn my tnh: Tm mu tin trong c s d liu Tm kim thng tin trn Internet C hai loi tm kim c bn: Tm kim tun t (Sequential/ Linear Search) Tm kim nh phn (Binary Search) Bi ton tm kim tng qut: u vo: mng A c n phn t v gi tr x cn tm Tr v: V tr phn t x trong A hoc 1 nu x khng xut hin
1. TM KIM TUN T

Gii thut: Ln lt so snh x vi cc phn t ca mng A cho n khi gp c phn t cn tm, hoc ht mng.
1.1. Tm kim tun t vt cn (Exhaustive Linear)

V d: A = {1, 25, 6, 5, 2, 37, 40}, x = 6


Trang
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

int LinearExhaustive(int a[], int n, int x){ for(int i=0; i<n; i++){ if(a[i] == x){ return i; } } return -1; }

1.2. Tm kim tun t lnh canh (Sentinel Linear)

Nhn xt: Trng hp x nm 2 bin ca mng A rt him khi xut hin (Xc sut l bao nhiu???) C th b vic kim tra iu kin cui mng (trong vng lp for) bng cch dng lnh canh. Lnh canh l phn t c gi tr bng vi phn t cn tm v t cui mng. V d: A = {1, 25, 5, 2, 37}, x = 6

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

int LinearSentinel(int a[], int n, int x){ a[n] = x; for (int i = 0; ;i++){ if (a[i] == x){ return i; } } }

2. TM KIM NH PHN

Nhn xt: Vi mng A c sp xp tng dn, phc tp ca tm kim tun t khng i Tn dng thng tin ca mng c sp xp gii hn v tr ca gi tr cn tm trong mng Thut ton tm kim nh phn Gii thut: So snh x vi phn t chnh gia ca mng A. Nu x l phn t gia th dng Nu khng, xc nh xem x c th thuc na tri hay na phi ca A. Lp li 2 bc trn vi na xc nh.

int BinarySearch(int a[], int n, int x){ int l = 0, r = n-1; while (l <= r){ int m = (l + r)/2; if (a[m] == x){ return m; } else{ if (x < a[m]){ r = m 1; } else{ l = m + 1; } } } return 1; }

3. SOURCE CODE MU Bi tp (code mu: Timkiem.cpp)


#include <stdio.h> int LinearExhaustive(int a[], int n, int x){ for(int i=0; i<n; i++){ if(a[i] == x){ return i; } Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

} return -1; //-1 y c ngha l g? } int LinearSentinel(int a[], int n, int x){ a[n] = x; //Ti sao gn x cho a[n] m khng phi cho a[n-1]? for (int i = 0; ;i++){ //Ti sao vng lp for l lp v tn? if (a[i] == x){ return i; } } //Ti sao khng c return cui hm? } int BinarySearch(int a[], int n, int x){ int l = 0, r = n-1; while (l <= r){ int m = (l + r)/2; if (a[m] == x){ return m; } else{ if (x < a[m]){ r = m 1; } else{ l = m + 1; } } } return 1; } int main(int argc, char* argv[]) { int n; printf("Nhap so luong phan tu: "); scanf("%d", &n); int* a = new int[n];

for (int i = 0; i < n; i++) { printf("Nhap a[%d]: ",i); scanf("%d", &a[i]); } int x; printf("Nhap gia tri phan tu can tim kiem: "); scanf("%d", &x); int i = LinearExhaustive(a, n, x); if (i == -1){ printf("Khong tim thay x trong mang A\n"); } else{ printf("Vi tri x trong mang A la: %d\n", i + 1); //Ti sao li xut i+1 y } return 0;

1. Bin dch on chng trnh trn.


Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

2. Cho bit kt qu in ra mn hnh vi cc trng hp mng A v x sau: A X A X A X = = = = = = 3 3 1 5 6 6 6 6 6 6 6 2 3 4 6 8 9 0 -1

3. Nu dng
int i = LinearExhaustive(a, n, x);

trong hm main ta thay hm LinearExhaustive bng hm LinearSentinel. Cho bit kt qu in ra mn hnh vi A={1,2,3,4} v x=5. 4. Sa li code trong hm main c th chy ng khi gi hm LinearSentinel cu 3. 5. Hy ghi ch cc thng tin bng cch tr li cc cu hi ng vi cc dng lnh c yu cu ghi ch (//Ghi ch) 6. ng dng hm BinarySearch trong hm main. Din gii ngha code ca hm ny. 7. Vit li hm BinarySearch dng quy. 8. (Nng cao) o thi gian tnh ton ca mi thut ton tm kim. Gi : hm clock_t ca th vin C/C++ (Xem code mu)
#include <time.h> clock_t start, end; double cpu_time_used; start = clock(); ... /* Do the work. */ end = clock(); cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("Thoi gian xu ly la: %f\n", cpu_time_used);

9. (Nng cao) Xy dng cu trc WORD trong t in (gm tn ca t v ngha ca t) v p dng thut ton tm kim xy dng chng trnh tra t in. Hm so snh chui c th dng hm strcmp (http://www.cplusplus.com/reference/clibrary/cstring/strcmp/)
struct WORD{ char Name[256]; char Meaning[512]; }

Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010

Trang

You might also like