Professional Documents
Culture Documents
GT CauTrucDuLieu
GT CauTrucDuLieu
GT CauTrucDuLieu
NI DUNG CHNG:
I. PHN M U
I.1 Cu trc d liu l g?
I.2 Gii thut
I.3 Mi quan h gia cu trc d liu v gii thut
II. THIT K GII THUT
II.1 M un ha thut ton
II. 2 Phn tch thut ton
III. MT S GII THUT C BN
III.1 Hon v 2 phn t
III.2 Tm s ln nht S nh nht
III.3 Gii thut tm kim
III.4 Gii thut qui
I. PHN M U:
I.1 Cu trc d liu l g?
V d: Danh sch (Tn, a ch, s in thoi): (Bnh, Cam Ha, 111111), (An, Cam Tn,
222222), (V, Cam c, 333333), (S, Cam An Bc, 444444)....
Nhn xt: Danh sch trn c mi quan h chung (Tn, a ch, s in thoi) c cu trc
thch hp, tin li cho vic tm kim. (Tn, a ch, s in thoi) cn c gi l cc phn t c s.
Khi nim: Tp hp cc phn t d liu (data) c tnh cht chung c t chc theo mt
cu trc thch hp.
Hc sinh cho bit thm mt s v d v cu trc d liu?
(Gi : My tnh (Hng sn xut, S hiu, .....); Hc sinh(H Tn, Lp, im Vn, im Ton,
im trung bnh....) v.v...)
I.2 Gii thut l g?
gii quyt bi ton trn nhng d liu c cu trc trn my tnh, ta phi thc hin cc
thao tc theo ng trnh t v mt s bc nht nh trn mt s i tng ca d liu c cu trc.
Theo v d trn: Ta vit chng trnh khi cho bit tn ngi no th my tnh s in ra a
ch, s in thoi ca ngi ; Cch lm ny chnh l gii bi ton x l tm kim.
Tp hp cc bc hu hn theo trnh t nht nh gii bi ton x l i tng l d liu (data)
c kt qu chnh xc trn my tnh theo mong mun.
@ chnh l dy nhng cu lnh (statement) cht ch, r rng c th hin qua mt ngn
ng lp trnh.
I.3 Mi quan h gia cu trc d liu v gii thut:
Gio trnh Cu trc d liu
Vic la chn mt cu trc d liu t chc d liu vo ra gip ta xy dng thut ton
x l hu hiu.
Cu trc d liu + Gii thut = Chng trnh
Hnh minh ha
Nhn
xt:
F Vic m un ha lm cho bi ton c nh hng r rng.
F C th phn chia cng vic cho i ng lp trnh vin.
2
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
F Vit chng trnh rt tn nhiu thi gian, cn c s lm vic nhp nhng gia cc lp
trnh vin.
V d: Vi chng trnh qun l im hc sinh
Yu cu:
F Vit hm nhp d liu.
F Vit hm x l d liu.
F Vit hm xut d liu.
* Hm nhp: * Hm x l:
void nhap( ) void xuly( )
{ {
printf(\n Ho ten hoc sinh: );
gets(hoten); dtb = float (van + toan)/2;
printf(\n Diem Van = ); }
scanf(%d,&van);
printf(\n Diem Toan = );
scanf(%d,&toan);
}
* Hm xut d liu:
void xuat( )
{
printf(\n Ho ten: %s, hoten);
printf(\n Diem van = %d, van);
printf(\n Diem toan = %d, toan);
prinf(\n Diem trung binh = %1.2
f,dtb);
}
3
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Bi tp t lm
Bi 1: Vit tip hm xp loi theo im trung bnh nh sau:
5.0 <dtb<=6.5: Trung bnh;
6.5<dtb<=8: Kh;
dtb>8.0: Gii;
dtb<5.0: Yu
Bi 2: Vit chng trnh tnh tng, tch , tng cc s nguyn l, chn, tch cc s nguyn l, chn
vi n nhp t bn phm v in kt qu ra mn hnh.
Gi : Vit cc hm:
- Tnh S=1+2+3+....+n; (t tn hm: Tong)
- Tnh P=1*2*3*...*n; (t tn hm: Tich)
- Tnh S1=1+3+5+...+n; (t tn hm: TongLe)
- Tnh S2 = 2+4+6+...+n;(t tn hm: TongChan)
- Tnh P1 = 1*3*5*...*n; (t tn hm: TichLe)
- Tnh P2 = 2*4*6...*n;(t tn hm: TichChan)
II.2 Phn tch thut ton:
II.2.1 Tnh ng n: y l yu cu quan trng nht ca mt gii thut. Vi cc cng c
ton hc, ngi ta c th chng minh c tnh ng n ca tng thut ton.
II.2.2 Tnh n gin: Ti u v thi gian v b nh ca my tnh khi thc hin chng
trnh.
III. Mt s gii thut c bn:
III.1 Hon v 2 phn t:
Bc 1
Bc 2 Bc 3
Bc 1: + nc t ly vo ly (ly tm)
Bc 2: + ly nc vo ly nc
Bc 3: + nc ly tm sang ly nc (Kt thc)
V d: Chng trnh hon v 2 s nguyn
#include "conio.h"
#include "stdio.h"
void main( )
{
int a=3, b=5, tam; /* Khai bo thm bin tm*/
tam = a;
a = b;
4
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
b = tam;
printf("\n so a = %d So b = %d", a, b);
getch();
}
Kt qu khi chy chng trnh:
Bi tp t lm
Bi 3: VCT nhp vo 2 s nguyn, tm s nh. In kt qu ra mn hnh s nh.
(Gi : Dng cu lnh if )
Bi 4: VCT nhp vo 3 s thc, tm s ln nht. In kt qu ra mn hnh s ln nht.
(Gi : Dng cu lnh if ....else)
Bi 5: Cho mng 1 chiu N = {23, 17, 68, 55, 89, 10}. Tm s ln nht trong mng ny. In kt qu
ra mn hnh.
(Gi : Dng vng lp for hoc while )
Bi 6: Vit hm thc hin bi tp 4 v 5 trn.
5
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
III.3 Gii thut tm kim:
Bi ton 1: Mun tm 1 phn t no trong mng 1 chiu: M[ ]={11, 22, 33, 44, 55, 66];
Danh sch cc phn t chnh l mt mng gm n phn t, mi phn t trong danh
sch c cng kiu d liu.
V d: Mun tm s 33, ta lm nh sau:
- u tin, em so snh 33 vi phn t u tin trong danh sch; Nu tm thy, thut ton
kt thc.
- Nu khng tm thy, li tm tip phn t th hai cho n cui danh sch ; chng no tm
thy, thut ton kt thc.
- Nu vn khng tm thy, th chng t mng khng c 33, thut ton kt thc.
#include "conio.h"
#include "stdio.h"
void main ( )
{
int a, int B[ ] ={11, 22, 33, 44, 55, 66};
int vitri =-1; /* Dat linh canh */
printf("\n Nhap so can tim:");
scanf("%d",&a);
for (int i = 0 ;i <= 5; i++)
{
if (B[i] = = a)
vitri = i;
}
if (vitri = = -1)
printf("\n Khong tim thay!");
else
printf("\n Phan tu tim thay trong mang la B[%d]= %d",vitri, B[vitri]);
getch();
}
Kt qu khi chy chng trnh:
Bi ton 2: Chng trnh kim tra c s nguyn chn trong mng khng?
#include "conio.h"
#include "stdio.h"
void main()
{
int cohieu = 0, B[ ]= {1, 3, 6, 7, 9, 11};
for (int i = 0; i<6; i++)
{
if (B[i] %2 == 0)
cohieu = 1; / * Pht c */
}
if (cohieu == 1)
printf("\n Co so nguyen chan trong mang !");
else
printf(\n Khong co so nguyen chan trong mang !);
getch();
}
6
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Kt qu khi chy chng trnh:
Bi tp t lm
Bi 7: VCT lit k cc s m trong mng 1 chiu s thc vi s phn t c nhp t bn phm.
(Gi : Vit hm nhp mng, hm xut mng (iu kin ch xut cc s m), hm chnh)
Bi 8: VCT lit k cc s nguyn t (nu c) trong mng 1 chiu s nguyn vi s phn t c
nhp t bn phm.
(Gi : Vit hm nhp mng, xut mng, hm tm s nguyn t (s nguyn t l s ch chia ht cho
1 v chnh n), hm chnh (main)
Bi 9: VCT lit k v m cc s chn c trong mng 1 chiu s nguyn vi s phn t nhp t bn
phm.
(Gi : Vit hm nhp mng, xut mng, hm lit k, hm m s chn, hm chnh (main))
V d: Chng trnh m c s l trong mng.
#include "conio.h"
#include "stdio.h"
void main()
{
int dem = 0, B[ ]= {1,3,6,7,9,11};
for (int i = 0; i < 6; i++)
{
if (B[i] %2 == 1)
dem += 1; /* Tng bin m ln 1 */
}
printf(\n Co %d so nguyen le trong mang , dem);
getch();
}
Kt qu khi chy chng trnh:
7
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
else
return tong(n-1) + n;
}
Bi tp t lm
Bi 10: Vit hm ly tha a m x bng qui.
Bi 11: Vit hm tm c s chung ln nht.
Bi 12: Vit hm tm s ln nht trong mng 1 chiu s nguyn.
Bi 13: Vit hm m s lng s nguyn t < 100 c trong mng.
Bi 14: Vit hm nhp mng 1 chiu s nguyn.
Bi 15: Vit hm xut mng 1 chiu s thc.
Bi 16: Vit hm sp xp mng 1 chiu cc s thc tng dn.
Bi 17: Vit hm m s phn t c gi tr m trong mng 1 chiu s nguyn.
Bi 18: Vit hm tm gi tr nh nht trong mng 1 chiu s nguyn.
8
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Chng 2: CC KIU D LIU C S
NI DUNG CHNG:
I. KIU D LIU
II. CC KIU D LIU C S
II.1 Cc kiu d liu c bn
II. 2 Kiu con tr
III. CC KIU D LIU C CU TRC
IV. MT S KIU D LIU C CU TRC C BN
IV.1 Kiu chui
IV.2 Kiu mng
IV.3 Kiu mu tin
IV.4 Kiu tp hp (Union)
I. KIU D LIU:
V d 1: Gi s c kiu d liu Mu t th:
- Vchar = {a-z, A-Z}(Min gi tr)
- Ochar= {Ly m ASCII ca k t, Bin i k t thng thnh K T HOA}
V d 2: Gi s c kiu d liu S nguyn, th:
- Vint = {-32768.32767}(Min gi tr)
- Oint = { +, -, *, /, % }( Cc php ton p dng cho s nguyn)
Ghi nh:
Kiu d liu K c xc nh bi mt b <V, O>, th:
V: Tp hp cc gi tr m i tng kiu K c th lu tr.
O: Tp hp cc thao tc x l c th thc hin trn i tng kiu K
@ Mun s dng 1 kiu d liu, phi bit ni dung d liu c php lu tr v cc php
x l ln n.
@ Ghi nh: Kiu d liu bao gm: Tn kiu, Min gi tr, Cc ton t c s dng ln
kiu d liu .
II. CC KIU D LIU C S:
II.1 Kiu d liu c bn:
L kiu d liu n gin, khng c cu trc
9
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
L kiu d liu khai bo bin ng, min gi tr ca bin con tr l a ch nh (Ch cha a
ch ca bin, khng cha gi tr)
C php:
<Kiu d liu> *<Tn bin> V d: int *a; char *HoTen[30];
Cch dng:
Cch 1: Cch 2:
S dng bin con tr gi a ch ca bin S dng bin con tr xin cp pht v thu hi
khc. b nh.
(Dng ton t & ly a ch ca mt bin) (Dng cc hm malloc, realloc)
V d:
float *m, a; // Khai bo bin con tr m v bin a c cng kiu float (Bt buc phi cng kiu khi
dng bin con tr m ly a ch ca bin a)
m = &a;
Hu ht cc ngn ng lp trnh cp cao u cung cp nhng th tc cp pht vng nh cho
mt bin ng v cho mt con tr gi a ch vng nh .
Mt s hm cp pht b nh ca C : (Nh khai bo thm th vin: #include malloc.h)
void* malloc(size); // Tr v con tr ch n mt vng nh va c cp pht
10
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
new // hm cp pht b nh trong C++
Hy mt bin ng do p ch n :
Hm free(p) // Hy vng nh cp pht bi hm malloc hoc calloc do p tr ti
Hm delete p // Hy vng nh cp pht bi hm new do p tr ti
V d :
int* p1, p2;
p1 = (int*) malloc(sizeof(int)); // Cp pht vng nh cho 1 bin ng kiu int
p1* = 5; // t gi tr 5 cho bin ng p1
p2 = (int*) calloc(10, sizeof(int)); // Cp pht bin ng kiu mng gm 10 phn t kiu int
V d: m t i tng hc sinh:
- M hc sinh: Chui k t; C @ char mahs[10];
- Tn hc sinh: Chui k t; C @ char tenhs[10];
- Ngy sinh: Kiu ngy thng; @ ? ? ? ! ! ! (Cha c)
- Ni sinh: Kiu k t; C @: char noisinh[30];
- im thi: Kiu s thc; C @: float diemthi;
th hin thng tin v ngy, thng, nm F ta xy dng 1 kiu bn ghi (record) nh sau:
struct ngaythang
{
int ngay;
int thang;
int nam;
};
typedef struct ngaythang NGAYTHANG;
c c 1 cu trc ph hp nhm lu tr mt hc sinh (Thc t pht sinh thm nh:
im thi cc mn, tnh trung bnh/mn, thi li, n mn) F lm ny sinh nhu cu xy dng thm
kiu d liu mi.
11
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Ghi nh:
Mc tiu ca nghin cu cu trc d liu l tm nhng phng cch thch hp t chc,
lin kt d liu, hnh thnh cc kiu d liu mi c cu trc t nhng kiu d liu c bn c
nh ngha.
Nhp chui:
gets(chui); gets(HoTen);
Xut chui:
puts(chui); V d: puts(HoTen);
V d: char S [ ] = ABC;
/* Khai bo chui k t S c chiu di bng chiu di ca chui ABC v gi tr khi u ca S
l ABC */
Trong C, th vin string.lib cha cc hm x l chui k t rt a dng v phong ph:
- So snh 2 chui: strcmp
- Sao chp 2 chui: strcpy
- Kim tra 1 chui nm trong chui kia: strstr
- Ct 1 t ra khi chui: strok
- i 1 s ra chui: itoa
- i 1 chui ra s: atoi, atof,...
- Nhp 1 chui: gets
- Xut 1 chui: puts
IV.2 Kiu mng:
L kiu d liu m mi phn t ca n l tp hp c th t cc gi tr c cng cu trc c
lu tr lin tip nhau trong b nh.
12
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Khai bo mng 1 chiu
int K[100];// Mng K c 100 phn t
<Kiu d liu> <Tn bin> [<S phn t>]; int a[ ] = { 2, 5, -8, 10, -21}
// Va khai bo mng a va gn gi tr cc phn t)
Nh li:
Nhp mng 1 chiu A c n phn t s nguyn: Xut mng 1 chiu A c n phn t s nguyn:
void nhapmang(int A[ ], int n) void xuatmang(int A[ ], int n)
{ {
for (int i=0; i<n; i++) for (int i=0; i<n; i++)
scanf(%d, & A[i]); prinf( Phan tu A[%d] = %d, i, A[i]);
} }
Sp xp mng 1 chiu A c n phn t s nguyn (tng dn):
void sapxepmang(int B[ ],int n)
{
for ( i = 0; i< n; i++)
for (j = i; j< n; j++)
{
if (B[j] < B[i])
tam = B[ j ];
B[ j ] = B[ i ];
B[ i ] = tam;
}
}
Nhn xt: Kiu mu tin b sung nhng thiu st ca kiu mng, n gip ta c kh nng th
hin cc i tng rt a dng ca i sng vo trong my tnh mt cch d dng v chnh xc
hn.
13
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Bi tp t lm
Dng kiu mu tin th hin thng tin sau:
Bi 19:
- Loi bnh;
- Nh sn xut;
- a ch nh sn xut;
- S in thoi nh sn xut;
- Hn s dng;
- n gi;
- S lng;
Bi 20:
- Nhn hiu xe my;
- Hng SX;
- S in thoi ca hng SX;
- Nm SX;
- Mu sn;
- n gi;
- S lng;
Bi 21: Cn c thng tin g cho kiu mu tin:
a/ Tam gic
b/ Hnh vung
c/ Hnh trn
d/ Hnh thang
e/ Phn s
g/ Hn s
Bi 22: Vit ra cc cu trc kiu d liu mu tin ca bi 21.
Hng dn:
xc nh 1 tam gic trn mt phng Oxy F cn c 3 im, ta thit lp cu trc d liu tam gic
nh sau:
struct diem
{
int hoanhdo;
int tungdo;
14
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
};
typedef struct diem DIEM;
struct tamgiac
{
DIEM A;
DIEM B;
DIEM C;
};
typedef struct tamgiac TAMGIC; //Lc ny tn ca cu trc d liu l TAMGIAC
@ Trong chng trnh main:
void main( )
{
TAMGIAC X; //Khai bo bin X c kiu cu trc d liu TAMGIAC
printf(\n Nhap diem A= );
scanf(%d, &X. A); // Ch cu lnh nhp ny!
..........
}
IV.4 Kiu tp hp (Union)
L dng cu trc d liu c bit ca ngn ng C. N rt ging kiu mu tin (struct) ch
khc mt iu l cc trng (field) c php dng chung mt vng nh! Ngha l, cng 1 vng
nh ta c th truy xut d liu di cc dng khc nhau.
Cch khai bo:
typedef union <Tn kiu union>
{
<Kiu d liu> <Tn trng(field)>
<Kiu d liu> <Tn trng(field)>
}<Tn>;
15
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
char DiaChi[50];
char GiaDinh; /* 0: Khng c gia nh/ 1: C gia nh */
union
{
char TenVo[50];
char TenChong[50];
};
}NGUOI;
Ty ngi m ta ang xt l Nam hay N truy xut ra thng tin TenVo hay
TenChong.
Bi tp t lm
Bi 24: cc bi tp trn c th kt hp 2 kiu d liu mu tin (struct) v kiu tp hp (union)
c khng? Nu c, hy vit li cu trc ny.
I. Mng:
hc chng 2.
16
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
+ Cch lu tr mng theo kiu k tip nhau cc phn t mng.
I. 1 Tm kim tuyn tnh:
Bi ton: Tm phn t x trong mng 1 chiu A[n].
Gii thut:
Ln lt so snh phn t x vi phn t th 1, th 2.ca mng A cho n khi gp phn t x
cn tm/ hoc c th n ht mng m khng tm thy phn t x.
+ Bc 1: vi i=1,
+ Bc 2: So snh A[i] vi x, C 2 kh nng:
- a[i] = x Tm thy. Dng
- A[i] != x : Sang bc 3.
+ Bc 3: i=i+1 /* Xt phn t k tip */
Nu i>n : Ht mng, Khng tm thy. Dng
Ngc li: Lp li bc 2.
V d: Cho dy s a:
12 2 8 5 1 6 4 15
Cho gi tr cn tm l 8, gii thut c tin hnh nh sau:
i =1
i=2
i=3
Dng.
Ci t hm TimKiem xc nh v tr phn t x trong mng A:
int TimKiem(int A[ ], int n, int x)
{
int i = 0;
while ((i<n) && (A[i] != x)) /* C 2 iu kin */
i++;
if (i= =n)
17
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
return -1; /* Tm ht mng nhng khng thy!!! */
else
return i; /* A[i] l phn t cn tm */
}
ci tin hm ny, ta c th dng k thut lnh canh: t thm phn t x vo cui mng
F ngha l lun tm thy x trong mng. Nhng nu x v tr cui mng lnh canh F C ngha l
khng tm thy!
int TimKiem(int A[ ], int n, int x)
{
int i = 0;
A[n] = x; /* Phn t x c thm vo cui mng */
while (A[i] != x) /* C 1 iu kin */
i++;
if (i= =n)
return -1; /* Tm ht mng gp lnh canh F khng tm thy!!! */
else
return i; /* A[i] l phn t cn tm */
}
Bi tp t lm
Bi 27: Cho mng B[ ] = {-3, 5, 9, 20, 7 , 4}. Vit chng trnh main gi hm TimKiem vi phn t
x cn tm c nhp t bn phm.
Bi 28: Cho mng k t C[ ] = {S, M, O, B, Q}. Vit chng trnh main gi hm TimKiem
vi phn t x cn tm dc nhp t bn phm.
Bc 1: tri = 1; phi = n;
Bc 2:
Gia = (tri+phi)/2; // Ly mc so snh
So snh a[Gia] vi x, c 3 kh nng :
o a[Gia] = x: Tm thy. Dng
o a[Gia] > x: //tm tip x trong dy con Atri .. AGia-1 :
phi =gia - 1;
o a[Gia] < x: //tm tip x trong dy con AGia+1 .. Aphi :
tri = gia + 1;
Bc 3:
Nu tri != phi //cn phn t cha xt, tm tip.
18
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Lp li bc 2.
Ngc li: Dng; // xt ht tt c cc phn t.
V d
Cho dy s a gm 8 phn t:
1 2 4 5 6 8 12 15
19
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Bi tp t lm
Bi 29: VCT nhp vo mng 1 chiu cc s thc vi s phn t n c nhp t bn phm, vit hm
sp xp mng, hm tm kim nh phn v phn t x cn tm c nhp t bn phm.
Danh sch lin kt n: Mi phn t lin kt vi phn t ng sau n trong danh sch:
Danh sch lin kt kp: mi phn t lin kt vi cc phn t ng trc v sau n trong
danh sch:
Danh sch lin kt vng : Phn t cui danh sch lin kt vi phn t u danh sch:
20
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
@ Phn t cui cng trong danh sch c trng pNext khng cha g c gi l
NULL .
@ Khi danh sch rng, ta quy c pHead = NULL.
F K hiu:
p = new <kiu>; l th tc to vng nh cn trng cha 1 nt v nt ny c tr bi
con tr p (Ngha l p cha a ch nt ny);
dellete p; l th tc gii phng vng nh ca nt tr bi con tr p khi b nh.
K hiu -> truy cp n trng (field) trong mt nt bi p.
Ta c khai bo cu trc d liu tng qut: V d 1: Khai bo CTDL cho DSLK n cc phn s:
Bi tp t lm
Bi 30: Hy khai bo cu trc d liu cho danh sch lin kt n cc s nguyn.
Bi 31: Hy khai bo cu trc d liu cho danh sch lin kt cc s thc.
Bi 32: Hy khai bo cu trc d liu cho danh sch lin kt n cc phn s.
Bi 33: Hy khai bo cu trc d liu cho danh sch lin kt n cc ng trn.
Bi 34: Hy khai bo cu trc d liu cho danh sch lin kt n cc hc sinh. Bit rng hc sinh
gm cc thnh phn thng tin nh sau:
- H tn: Ti a 30 k t.
- im vn: Kiu s nguyn.
- im ton: Kiu s nguyn.
21
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
- im trung bnh: Kiu s thc.
Bi 35: Hy khai bo cu trc d liu cho danh sch lin kt n cc phng trong khch sn
(PHONG). Bit rng phng khch sn gm nhng thnh phn thng tin sau:
- M phng: Ti a 5 k t.
- Tn phng: Ti a 30 k t.
- n gi thu: Kiu s thc.
- S lng ging: Kiu s nguyn.
- Trnh trng phng: 0 rnh, 1 bn.
II.2 Cc thao tc c bn trn danh sch n:
1/ Khi to danh sch lin kt n:
2/ To node:
Bi tp t lm
Bi 36: Vit hm to node trong danh sch lin kt n cc s nguyn.
Bi 37: Vit hm to node trong danh sch lin kt n cc k t.
Bi 38: Vit hm to node trong danh sch lin kt n cc s thc.
Bi 39: Vit hm to node trong danh sch lin kt n cc ta im trong mt phng Oxy.
Bi 40: Vit hm to node trong danh sch lin kt n cc hc sinh vi thng tin bi 34.
3. Thm mt node/ D liu vo u danh sch:
22
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Hnh nh minh ha
3.1 Thm node vo u danh sch: 3.2 Thm d liu (Data) vo u danh sch:
void addhead (LIST &L, NODE* NewNode) NODE* insertHead(LIST L, Data x)
{ {
if (L.pHead = = NULL) NODE* NewNode = getnode(x);
{ if (NewNode==NULL)
L.pHead = NewNode; return NULL;
L.pTail = L.Head; if (L.pHead = = NULL)
} {
else L.pHead=NewNode;
{ L.pTail=L.pHead;
NewNode -> pNext = L.pHead; }
L.pHead = NewNode; else
} }
} NewNode ->L.pHead=L.pTail;
L.pHead = NewNode;
}
return NewNode;
}
Bi tp t lm
Bi 41: Vit hm m s lng node trong mt danh sch lin kt n cc s nguyn.
Bi 42: Vit hm m s lng node trong mt danh sch lin kt n cc s thc.
Bi 43: Vit hm m s lng node trong mt danh sch lin kt n cc phn s.
Bi 44: Vit hm tm s nguyn x trong danh sch lin kt n cc s nguyn.
Bi 45: Vit hm tm mu t x trong danh sch lin kt n cc mu t (a->z, A->Z).
23
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
void nhap(LIST &L) void xuat (LIST L)
{ {
int n; for (NODE* p=L. pHead; p!= NULL; p = p ->pNext)
printf(\n Nhap so luong node:); {
scanf(%d,&n); printf(%d , p->info);
init(L); /*To danh sch lin kt */ }
for (int i =1; i <=n; i++) }
{
<Kiu d liu> x;
nhap (x); /* scanf. */
NODE* p= getNode (x);
addhead(L,p);
}
}
24
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
L.pHead = NULL; printf(4%d , p->info);
L.pTail = NULL; }
} }
Bi tp t lm
25
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Stack ch cho php b sung v loi b mt u gi l nh stack, u kia l y Stack.
Nguyn tc b sung v loi b ny gi l nguyn tc Vo sau Ra trc (LIFO: Last In First Out).
nh stack
y stack
Hnh minh ha
* Khi T =n F Stack y
( Khng b sung thm c) S[n]
* Khi T = 0 F Stack rng! S(T) T
(Khng loi b c na) .
S[2]
S[1]
26
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
{ if (k!= -1)
top = -1; Push(k);
} }while (k != -1 && !kiemtraday( ));
int kiemtrarong( )
{ printf("\n \n Lay cac phan tu o stack ra: ");
return (top == -1);
} while (!kiemtrarong( ))
int kiemtraday( ) {
{ Pop(&k);
return (top ==MAX); printf("\t %d",k);
} }
getch( );
int Push(int x)// Hm b vo stack }
{ Kt qu chy chng trnh:
if (top<MAX)
stack[++top] = x;
return top;
}
27
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
typedef struct node NODE; NewNode -> pNext = L.pHead;
L.pHead = NewNode;
struct list }
{ }
NODE* pHead; void nhap(LIST &L)
NODE* pTail; {
}; int n;
typedef struct list LIST; printf("\n Nhap so phan tu cho stack: ");
scanf("%d",&n);
void init(LIST &L); // Khai bo hm (prototype) init(L); /*Tao danh sch lin kt */
NODE* getnode(int x); for (int i=1; i <=n; i++)
void addhead(LIST &L, NODE* Newnode); {
void nhap(LIST &L); int x;
void xuat(LIST L); printf("\n = ");
int kiemtrarong(LIST L); scanf("%d",&x);
NODE* p= getnode (x);
void main ( ) addhead(L,p);
{ }
}
LIST S; void xuat (LIST L)
nhap(S); {
xuat(S); printf("\n Xuat ra man hinh:\n");
getch(); for (NODE* p=L. pHead; p!= NULL; p = p ->pNext)
} {
printf("%d ", p->info); /*in ra thng tin danh sch */
void init (LIST &L)// Hm khi to danh sch }
{ }
L.pHead = NULL; Kt qu chy chng trnh:
L.pTail = NULL;
}
NODE* getnode (int x) // Hm to nt
{
NODE* p;
p = new NODE;
if ( p ==NULL)
return NULL;
p -> info = x;
p -> pNext = NULL;
return p;
}
ng dng ca stack:
Cu trc Stack thch hp lu tr cc loi d liu m trnh t truy xut ngc vi trnh t lu
tr, do vy mt s ng dng sau thng cn n stack :
- Trong trnh bin dch (thng dch), khi thc hin cc th tc, Stack c s dng lu
mi trng ca cc th tc.
- Trong mt s bi ton ca l thuyt th (nh tm ng i), Stack cng thng c s
dng lu d liu khi gii cc bi ton ny.
- Ngoi ra, Stack cng cn c s dng trong trng hp kh qui ui.
28
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
V d: Vit hm i mt s thp phn thnh s nh phn
void chuyenBinary (int S[100] )
{
printf(\n Nhap so nguyen (thap phan) = );
scanf(%d,&n);
while (n !=0)
{
int r = n%2;
push(S, T,r);
n = n/2;
}
while (T !=0)
{
pop(S,T,r);
printf(%d,r);
}
return;
}
Bi tp t lm
Bi 51: VCT hon chnh nhp vo mt s nguyn, i s thp phn ny ra s nh phn.
III.2 Hng i (Queue)
Hng i l mt vt cha (container) cc i tng lm vic theo c
ch FIFO (First In First Out) ngha l vic thm mt i tng vo hng i hoc ly mt i
tng ra khi hng i c thc hin theo c ch "Vo trc ra trc".
Ra Vo
Hnh minh ha
Khai bo hng i:
29
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
<Kiu d liu> Q[N] ;
int f, r;
IsFull(): Kim tra xem hng i c y cha.
Minh ha queue bng mng:
#include "stdafx.h" int pop(int *e)
#include "stdio.h" {
#include "conio.h" if (queuesize>0)
#define MAX 100 {
*e=queue[front++];
void khoitao( ); if (front>MAX)
int kiemtra_rong( ); front=0;
int kiemtra_day( ); queuesize--;
int push(int e); }
int pop(int *e); return front;
}
int queue[MAX+1]; void main( )
int front,rear,queuesize; {
void khoitao( ) int k,dem=-1;
{ khoitao();
front=rear=0; printf("\n Nhap cac phan tu vao queue (bam -1 de ket thuc): \n ");
queuesize=0; do
} {
30
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Phn t u DSLK (head) s l phn t u hng i, phn t cui DSLK (tail) s l phn t cui
hng i.
V d minh ha:
#include "stdafx.h" NODE* getnode (SONGUYEN x)
#include "stdio.h" {
#include "conio.h" NODE *p;
struct songuyen
{ p = new NODE;
int so;
}; if ( p ==NULL)
typedef struct songuyen SONGUYEN; return NULL;
struct node p->info=x;
{ p -> pNext = NULL;
SONGUYEN info; return p;
struct node* pNext; }
}; void nhapsonguyen(SONGUYEN &x)
typedef struct node NODE; {
int tmp;
struct list scanf("%d",&tmp);
{ x.so=tmp;
NODE* pHead; }
NODE* pTail;
31
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
}; void nhap(LIST &Q)
typedef struct list LIST; {
n tp.
Kim tra nh k ( 2 tit)
32
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Chng 4: CY (Tree)
NI DUNG CHNG:
I. CU TRC CY
II. CY NH PHN
II.1 nh ngha
II.2 Mt s tnh cht ca cy nh phn
II.3 Biu din cy nh phn T
II.4 Ci t cy nh phn
II.5 Duyt cy nh phn
II.6 Mt s bi ton ng dng cy nh phn
I. CU TRC CY
V d: S t chc ca mt cng ty
Gc
Hnh II.1
33
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
di ng i t gc n nt x: l s nhnh cn i qua k t gc n x.
II. CY NH PHN
II.1 nh ngha
Cy nh phn l cy m mi nt c ti a 2 cy con
Trong thc t thng gp cc cu trc c dng cy nh phn. Mt cy tng qut c th biu
din thng qua cy nh phn.
Nt gc
Cc
Cccy
cycon
conbn
bntri
trint
ntgc
gc
Cc cy con bn phi nt gc
Hnh II.2
Hnh II.3
Bi tp t lm
II.4 Ci t cy nh phn
II.4.1 Khi to cy:
void KhoiTao(NODE **T)
{
*T = NULL;
}
II.4.2 Chn nt vo cy:
void ThutucChen(NODE *tmp,NODE **T) void ChenNut(KDL e, NODE **T)
{ {
if (tmp->info < T ->info) NODE *tmp ;//Khai bo nt tm
if (*T)->pLeft tmp=(NODE *) malloc(sizeof(NODE)) ;
ThuTucChen(tmp, &(*T) ->pLeft); tmp ->info =e;
else tmp ->pLeft =NULL;
*T -> pLeft = tmp; tmp->pRight = NULL;
else if (*T ->pRight) if (*T == tmp)
ThucTucChen(tmp, &(*T)->pRight); *T = tmp;
else else
*T ->pRight = tmp; ThutucChen(tmp, T);
} }
35
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
II.4.3 Nhp cy :
V d:
A
B C
D E F G
H I
Hnh II.4
Th t duyt nh sau: A B D E H I C F G
II.5.2 Duyt theo th t gia (LEFT-NODE-RIGHT)
Kiu duyt ny trc tin thm cc nt ca cy con tri sau thm nt gc ri n cy con
phi. Th tc duyt c th trnh by n gin nh sau:
36
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
void LNR(TREE *root) V d: Duyt cy nh phn s nguyn LNR
{ Void LNR(TREE *root)
if (root != NULL) {
{ if (root != NULL)
LNR(root->pLeft); {
<X l root>; //X l tng ng theo nhu cu
LNR(root -> pLeft)
LNR(root->pRight);
printf(%d, root -> info);
}
LNR(root ->pRight);
}
}
}
II.5.3 Duyt theo th t sau (LEFT -RIGHT-NODE)
Kiu duyt ny trc tin thm cc nt ca cy con tri sau thm n cy con phi ri
cui cng mi thm nt gc. Th tc duyt c th trnh by n gin nh sau:
void LRN(TREE *root) V d: Duyt cy nh phn s nguyn LNR
{ void LRN(TREE *root)
if (root != NULL) {
{ if (root !=NULL)
LRN(root->pLeft); {
LRN(root->pRight); LRN(root ->pLeft);
<X l Root>; //X l tng ng theo nhu cu LRN(root ->pRight);
} printf(%d,root->info);
} }
}
37
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
NODE *root; //Khai bo NODE gc tn root do
void KhoiTaoCay(NODE **root) {
{ printf("\n Nhap phan tu cho cay (Bam -1 ket thuc): ");
*root=NULL; scanf("%d",&e);
} if (e.so != -1)
void Chen(NODE *tmp, NODE **root) ChenNut(e, root);
{ } while (e.so != -1);
if (tmp->info.so < (*root)->info.so) }
if ((*root)->pLeft) // Duyet cay theo thu tu truoc NODE-LEFT-RIGHT:
Chen(tmp, &(*root)->pLeft);
else void NLR(NODE *root)
(*root)->pLeft=tmp; {
if ((*root) ->pRight) {
Chen(tmp,&(*root)->pRight); printf("%d->",root->info);
} NLR(root->pRight);
{ void main()
if (root != NULL) {
{ KhoiTaoCay(&root);
LNR(root->pLeft); NhapCay(&root);
38
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
}
Bi tp t lm
{
int left= SoMax(t->pLeft);
int right= SoMax(t->pLeft);
int ln= t->info;
if (left>ln)
ln=left;
if (right>ln)
ln=right;
}
return ln;
}
Bi ton 2: Cho cy nh phn cc s nguyn. Vit hm m s nt trong cy.
39
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
int dem(NODE *root)
{
if (t = = NULL)
return 0;
int left = dem(t->pLeft);
int right= dem(t->pRight);
return (1+left+right);
}
Bi ton 3: Cho cy nh phn cc s nguyn. Vit hm tm phn t x l s nguyn c
nhp t bn phm.
Bi tp t lm
Bi 58: Cho cy nh phn cc s nguyn vi gi s cc gi tr trong cy khng trng nhau. Hy vit
cc hm thc hin cc yu cu sau: Nhp, xut, lit k theo th t tng dn (LNR)
Th li kt qu chy chng trnh vi cy nh phn sau:
2
0
1 3
0 5
5 1 2 4
7 2 2
1 3
5 0
40
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Chng 5: SP XP
NI DUNG CHNG:
I. PHNG PHP SP XP CHN
I.1 Gii thut
I.2 Thut ton
I.3 Ci t
II. PHNG PHP SP XP CHN
II.1 Gii thut
II.2 Thut ton
II.3 Ci t
III. PHNG PHP SP XP NI BT
III.1 Gii thut
III.2 Thut ton
III.2 Ci t
41
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
I.3 Ci t
Ci t thut ton sp xp chn trc tip thnh hm SapXepchon:
Bi tp t lm
Bi 65: Cho mng M = {15, -28, 7, 37, -50, 11}. Dng phng php sp xp chn vit hm v in ra
mn hnh mng sp xp tng dn.
Bi 66: Cho mng 1 chiu s nguyn c n phn t c nhp t bn phm. Hy vit chng trnh
in ra mn hnh mng c sp xp gim dn.
43
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Dng
II.3 Ci t
Ci t thut ton sp xp chn trc tip thnh hm SapXepChen:
void SapXepChen(int a[ ], int n )
{ int vitri, i;
int x; //lu gi tr a[i] trnh b ghi khi di ch cc phn t.
for (int i=1 ; i<n ; i++) // on a[0] sp
{
x = a[i]; vitri = i-1; // tm v tr chn x
while((vitri >= 0)&&(a[vitri] > x))
{
a[vitri+1] = a[vitri]; // kt hp di ch cc phn t s ng sau x trong dy mi
vitri --;
}
a[vitri+1] = x; // chn x vo dy
}
}
Bi tp t lm
44
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
Bi 67: Cho mng M = {15, -28, 7, 37, -50, 11}. Dng phng php sp xp chn vit hm v in ra
mn hnh mng sp xp tng dn.
Bi 68: Cho mng 1 chiu s nguyn c n phn t c nhp t bn phm. Dng phng php sp
xp chn vit hm v in ra mn hnh mng sp xp tng dn.
V d:
Cho dy s a: 12 2 8 5 1 6 4 15
45
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
III.3 Ci t:
Ci t thut ton sp xp theo kiu ni bt thnh hm SapXepNoiBot:
void SapXepNoiBot(int a[ ], int n )
46
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
{
int i, j;
for (i = 0 ; i<n-1 ; i++)
for (j =n-1; j >i ; j --)
if(a[j]< a[j-1]) // nu sai v tr th i ch
{
int tam=a[j]; //Hon v
a[j]=a[j-1];
a[j-1]=tam;
}
}
Bi tp t lm
Bi 69: Cho mng M = {15, -28, 7, 37, -50, 11}. Dng phng php sp xp ni bt vit hm v
in ra mn hnh mng sp xp tng dn.
Bi 70: Cho mng 1 chiu s nguyn c n phn t c nhp t bn phm. Dng phng php sp
xp ni bt vit hm v in ra mn hnh mng sp xp tng dn.
Kim tra nh k ln 2
Chng 6: TM KIM
47
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
NI DUNG CHNG:
I. BI TON TM KIM
II. TM KIM TUN T (Tuyn tnh)
III. CY TM KIM NH PHN
III.1 Cy tm kim nh phn
III.2 Khai bo cy tm kim nh phn
III. 3 Cc hm x l cy tm kim nh phn
I. BI TON TM KIM:
Tm kim l nhu cu rt ph bin trong i sng hng ngy cng nh trong tin hc.
V d cho dy s a1, a2, a3, , an F Tm trong dy ny c phn t no c gi tr bng x cho
trc khng? F Tm gi tr ln nht (nh nht) trong mng? F Tm v tr ca phn t no theo
mt iu kin cho sn?....
II. TM KIM TUN T (Tuyn tnh):
Thut ton tm kim tun t (tuyn tnh)c s dng mt bin (biu thc) logic xt mt
phn t c tn ti trong dy hay khng?
V d:
int TimKiemTuanTu(int A[ ],int n,int x)
{
int i = 1;
A[n+1] = x;
while (A[i]!=x)
i++;
if (i= = (n+1)
return 0; // Khng tm thy
else
return i; // Tm thy
return i;
}
V d: Cho mng 1 chiu A = {3, -5, 9, 1, -7, 15, 4} (Cc phn t khng trng lp)
a/ Cho bit phn t x=1 c trong mng khng? v tr no ca mng?
b/ Tm xem c bao nhiu s nguyn m trong mng?
Cu b: Hc sinh t lm
Bi tp t lm
Bi 69: VCT nhp vo mng 1 chiu cc s nguyn n, nhp vo s x. Vit hm tm kim nh phn
tm s x ny c trong mng khng? v tr no ca mng (Gi s cc s nguyn nhp vo l khng
trng lp)
III. Cy tm kim nh phn:
III.1 nh ngha:
Cy tm kim nh phn (Mi nt c ti a 2 cy con) l cy nh phn m ti mi nt cy
ln hn kha ca tt c cc nt thuc cy con bn tri v nh hn kha ca tt c cc nt thuc
cy con bn phi.
V d:
44
18 88
13 37 59 108
23 40 55 71
15
Chen(tmp,&(*root)->pRight);
else
(*root)->pRight = tmp;
}
Hm chn nt vo cy
35
10
5 17 22 42
15 30
- So snh 30 vi nt gc 20, v 30>20 F tm tip trn cy con bn phi, tc l cy c
nt gc c kha l 35.
- So snh 30 vi nt gc 35, v 30<35 F tm tip trn cy con bn tri, tc l cy c
nt gc c kha l 22.
52
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
- So snh 30 vi nt gc 22, v 30>22 F tm tip trn cy con bn phi, tc l cy
c nt gc c kha l 30.
- So snh 30 vi nt gc 30, v 30 = 30 F gii thut dng, ta tm c nt c cha
kha cn tm.
Minh ha hm tm kim s nguyn x
TREE TimKiem(SONGUYEN x, TREE root)
{
if (root ==NULL)
return NULL;
else if (root->khoa.so==x.so) // Tm thy x gc ca cy
return root;
else if (root->khoa.so < x.so)// Tm tip bn phi
return TimKiem(x, root->pRight);
else
return TimKiem(x,root->pLeft);// Ngc li tm tip bn tri
}
Bi tp t lm
Bi 72: Cho cy tm kim nh phn cc s nguyn, vit hm nhp v duyt theo 3 cch.
Bi 73: Cho cy tm kim nh phn cc s nguyn, vit hm tm kim s ln nht trong cy.
53
Ti liu lu hnh ni b trng Trung cp ngh Cam lm