Professional Documents
Culture Documents
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
<KieuDuLieu> *<TenBien>; V d:
int* pa; // con tr n kiu int DIEM *pd; // con tr n kiu DIEM
1.2. Khi to bin con tr dng cp pht vng nh (cp pht ng)
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
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, )
cu lnh
printf("%d\n", *pa);
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
Cch hy tng ng s l
delete pa; delete pb[];
} Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010
Trang
tro:
c i thnh
int a = 10;
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);
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
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];
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010
Trang
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); }
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); }
Trang
v
printf("a sau ham TruyenThamBien = %d\n", a);
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;
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010
Trang
10
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
B2:
//ghi du lieu ra file fprintf(fo, "%d ",n);
Trang
11
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"); }
Trang
14
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)
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
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
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 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
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
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.
Trang
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)
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.
(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.
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.
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
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
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
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); }
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
Ti liu hng dn thc hnh mn Cu trc d liu v gii thut HCMUS 2010
Trang
b. Quay phi
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
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.
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.
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.
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.
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.
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.
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.
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.
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
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)
int LinearExhaustive(int a[], int n, int x){ for(int i=0; i<n; i++){ if(a[i] == x){ return i; } } return -1; }
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; }
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;
Trang
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