GT CauTrucDuLieu

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 53

Gio trnh Cu trc d liu

Chng 1: THIT K & PHN TCH GII THUT

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

Trong mn hc ny, ta s dng ngn ng lp trnh C vit chng trnh.


II. THIT K GII THUT:
II.1 Modun ha thut ton:
Chia bi ton ln thnh nhiu bi ton nh (M un) F t chc gii bi ton ln s c th
hin theo mt cu trc phn cp (Thit k t nh xung [top-down])

Hnh minh ha

* Cc M un c th hin bng cc chng trnh con v d th vin trong C. Hoc hm


do lp trnh vin vit xung quanh mt cu trc d liu no .
V d: Vi chng trnh qun l sch ca mt th vin, ta c mt file (tp tin d liu): M sch,
tn sch, tc gi, ngy xut bn, m c gi, tn c gi, a ch...
Yu cu: Cp nht d liu c; Tm kim, Thng k, In n

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);
}

* Ton b chng trnh:


#include conio.h
#include stdio.h
char hoten[30]; /* Khai bo mng k t */
int van, toan; /*Khai bo bin */
float dtb;
void nhap( ) ; /* Khai bo hm */
void xuly ( ); /* Khai bo hm */
void xuat ( );/* Khai bo hm */
void main ( )
{
nhap ( );
xuly ( );
xuat ( );
} /* Cc hm c vit bn trn */

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:

III.2 Tm s ln nht S nh nht:


Bi ton: Mng A c n phn t, mi phn t c tr l s nguyn. Hy tm phn t ln
nht v in ra kt qu.
Bc 1: Gn bin Max = A[0];
Bc 2: So snh phn t a[1] vi bin Max, phn t no ln hn th gn cho bin Max;
Bc 3: em Max so snh vi phn t tip theo a[2], phn t no ln hn th gn cho bin
Max;
Bc 3: Tip tc thc hin bc 2 cho ti (n-1) ln v cui cng th Max c gi tr ca phn
t ln nht; Khi , thng bo gi tr Max v kt thc gii thut.
V d: Chng trnh tm s ln nht trong mng M={15,77,45, 98}.
#include "conio.h"
#include "stdio.h"
void main ( )
{
int M[ ]= {15,77,45,98};
int Max= M[0]; /* Gn Max = Gi tr ca phn t th 0 */
for (int i=0; i<=3; i++)
{
if (M[i]>Max) /* So snh phn t th i vi Max */
Max = M[i]; /* Nu iu kin trn ng th gn Max = gi tr M[i] */
}
printf("\n So lon nhat = %d", Max); /* In ra mn hnh */
getch( );
}
Kt qu 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:

III.4 Gii thut qui:


L chng trnh gi n chnh n.

Bi ton: Tnh tng S(100) = 1 + 2 + 3 ++ 100


Bc 1: u tin, ta gn S(1) = 1;
Bc 2: Tnh S(2) = S(1) + 2;
Bc 3: Tip tc thc hin bc 2 cho ti 100 ln v cui cng th tng S(100) = S(99) +
100.
V d 1: Hm qui tnh tng cc s nguyn.
long tong(int n)
{
if (n==0)
return 0;

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;
}

V d 2: Tnh tng s nguyn u tin, vi s phn t nhp t bn phm.


Chng trnh hon chnh:
#include "conio.h" long tong(int n)
#include "stdio.h" {
long tong(int n); if (n==0)
void main() return 0;
{ else
int m, S; return tong(n-1) + n;
printf("\n Nhap so nguyen m = "); }
scanf("%d",&m); Kt qu khi chy chng trnh:
S = tong(m); // Gi ham tong
printf("\n Tong cac so nguyen dau tien = %ld",S);
getch();
}

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.

Khng c vic g kh!!!

Ch s lng khng bn???

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

Mt s kiu d liu hc mn lp trnh C c bn:

9
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu

Tn kiu Kch thc Min gi tr Ghi ch

char 01 byte -128 n 127 C th dng nh s nguyn 1 byte c


du hoc kiu k t

unsign char 01 byte 0 n 255 S nguyn 1 byte khng du

int 02 byte -32738 n 32767

unsign int 02 byte 0 n 65335 C th gi tt l unsign

long 04 byte -232 n 231 -1

unsign long 04 byte 0 n 232-1

float 04 byte 3.4E-38 -> 3.4E38 Gii hn ch tr tuyt i.Cc gi tr


<3.4E-38 c coi = 0. Tuy nhin
kiu float ch c 7 ch s c ngha.

double 08 byte 1.7E-308 ->1.7E308

long double 10 byte 3.4E-4932->1.1E4932

II.2 Kiu con tr:

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

void* calloc(n,size);// Tr v con tr ch n mt vng nh va c cp pht gm n phn t, s byte

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

(p2+3)* = 0; // t gi tr 0 cho phn t th 4


free(p1); free(p2); // Hy cp pht vng nh.
III. CC KIU D LIU C CU TRC:
Kiu d liu c bn khng phn nh thc t i sng F dn n nhu cu phi xy
dng cc kiu d liu mi c cu trc da vo cc kiu d liu c bn.
Ngn ng lp trnh C c ci t sn mt s kiu d liu c cu trc nh: Mng, chui, bn
ghi (record), tp tin (file)v cung cp thm c ch lp trnh vin c th t nh ngha kiu d
liu mi.

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.

IV. MT S KIU D LIU C CU TRC C BN:


IV.1 Kiu chui:
L mt chui lin tip cc k t v kt thc bng m ASCII bng 0 (NULL). (Min gi tr:
Cha ti a 65535 k t), k t u tin l k t th 0.
Cch khai bo:
char <Tn bin> [<S k t>] ; V d: char HoTen[30];

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.

+ Mt dy s l hnh tng ca mng 1 chiu (V d: a1, a2, a3,.,an)


+ Ma trn l hnh tng ca mng 2 chiu (Cng c th coi l mng 1 chiu, trong mi
phn t ca n l mng 1 chiu kia)
+ Mng n chiu.

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;
}
}

IV.3 Kiu mu tin (record):


L kiu d liu m mi phn t ca n l tp hp cc gi tr c th khc cu trc
Cch khai bo:
struct <Tn kiu struct> struct nguoi
{ {
<Kiu d liu> <Tn trng (field)> char HoTen[50];
<Kiu d liu> <Tn trng (field)> int NamSinh;
char NoiSinh[50];
}; char GioiTinh; /* 0: N, 1: Nam */
typedef struct <Tn kiu struct> TENKIEUSRUCT; char DiaChi[50];
char GiaDinh;
/* 0: Khng c gia nh/ 1: C gia nh */
};
typedef struct nguoi NGUOI

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>;

Kiu d liu union cn c th nm trong kiu mu tin :


V d :
struct nguoi
{
char HoTen[50];
int NamSinh;
char NoiSinh[50];
char GioiTinh; /* 0: N, 1: Nam */

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.

Bi 25: m t cu trc d liu ng trn, ta cn kt hp cu trc im trong mt phng Oxy


. Hy vit ra cu trc ny.
( Gi : Cn xc nh tm v bn knh ng trn )

Chng 3: MNG (ARRAY), DANH SCH (LIST)


NI DUNG CHNG:
I. Mng
I. 1 Tm kim tuyn tnh
I.2 Tm kim nh phn
II. Danh sch lin kt (linked list)
II.1 Danh sch lin kt n
II.2 Cc thao tc c bn trn danh sch n
III. Cc kiu d liu tru tng:
III.1 Ngn xp (Stack)
III.1.1 Biu din Stack bng mng
III.1.2 Biu din Stack bng danh sch
III.2 Hng i (Queue)
III.2.1 Biu din Queue bng mng
III.2.2 Biu din Queue bng danh sch lin kt n

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.

I.2 Tm kim nh phn:


Gii thut
i vi nhng dy s c th t ( gi s th t tng ), tng ca gii thut l ti mi
bc tin hnh so snh x vi phn t nm v tr gia ca dy tm kim hin hnh, da vo kt qu
so snh ny quyt nh gii hn dy tm kim bc k tip l na trn hay na di ca dy
tm kim hin hnh.

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

Nu gi tr cn tm l 8, gii thut c tin hnh nh sau:


tri = 1, phi = 8, Gia = 4

tri = 5, phi = 8, gia = 6


Dng.
Ci t
Thut ton tm nh phn c th c ci t thnh hm TimKiemNhiPhan
int TimKiemNhiPhan(int A[ ], int n, int x )
{
int trai =0; phai = n-1;
int giua;
do
{
giua = (trai + phai)/2;
if (x = A[giua]) return giua;//Thy x ti v tr gia
else
if (x < A[giua])
phai = giua -1;
else trai = giua +1;
}while (trai <= phai);
return -1; // Tm ht dy m khng c x
}

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.

II. DANH SCH LIN KT (linked list)


II.1 Danh sch lin kt n:
@ Mi phn t ca danh sch c gi l nt (node) l 1 bn ghi gm 2 phn:
+ Phn thng tin d liu (Info): Cha thng tin v bn thn phn t (C th c nhiu
trng (field).
+ Phn lin kt (Next): y l trng (field) cha a ch ca phn t ngay sau n
(con tr), trng ny c kiu con tr.
@ Mi phn t ngoi cc thng tin v bn thn cn cha mt lin kt (a ch) n phn t k trong
danh sch nn cn c gi l danh sch mc ni.

Danh sch lin kt n: Mi phn t lin kt vi phn t ng sau n trong danh sch:

Gii thiu thm mt s loi danh sch lin kt:

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:

@ Cc nt (node) ny nm ri rc trong b nh.


@ truy cp n mi phn t ca danh sch, ta phi truy nhp vo nt u tin, do
cn phi c con tr pHead tr vo phn t u tin ca danh sch v con tr pTail
cha a ch phn t cui ca danh sch.

@ T nt u tin, thng qua trng pNext i n nt th 2 v c nh th ta


c th duyt qua ht cc phn t ca 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.

Hnh v minh ha:

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:

struct node struct phanso


{ {
<Kiu d liu> info; /* int tu;
struct node *pNext; int mau;
}; };
typedef struct node NODE; typedef struct phanso PHANSO ;
struct node
typedef struct list {
{ PHANSO info ;
NODE* pHead; struct node* pNext ;
NODE* pTail; };
}; typedef struct node NODE;
typedef struct list LIST;
struct list
{
NODE* pHead;
NODE* pTail;
};
typedef struct list LIST;

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:

void init (LIST &L)


{
L.pHead = NULL;
L.pTail = NULL;
}

2/ To node:

NODE* getnode (<Kiu CTDL> x) V d: Vit hm to node trong danh sch


{ lin kt n s nguyn:
NODE* p; NODE* getnode(SONGUYEN x)
p = new NODE; {
if ( p= =NULL) NODE* p;
return NULL; p = new NODE;
p -> info = x; if (p = = NULL)
p -> pNext = NULL; return NULL;
return p; p -> info=x;
} p -> pNext = NULL;
return p;
}

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;
}

4. Duyt danh sch lin kt:


Duyt danh sch l thao tc thng c thc hin khi c nhu cu x l cc phn t ca
danh sch theo cng mt cch thc hoc khi cn ly thng tin tng hp t cc phn t ca danh
sch nh:
- m cc phn t ca danh sch.
- Tm tt c cc phn t tho iu kin no .
- Hu ton b danh sch (v gii phng b nh).
void DuyetList (LIST L)
{
NODE* p;
p = L . Head;
while (p!= NULL)
{
DuyetNode (p); //Ty ng dng c th
p = p -> pNext;
}
}

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).

5. Nhp xut danh sch lin kt n:

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);
}
}

6. Chng trnh minh ha:


To danh sch lin kt m mi node l 1 s nguyn. Tnh tng cc node ny?
#include stdio.h void addhead (LIST &L, NODE* NewNode)
#include conio.h {
struct node if (L.pHead = = NULL)
{ {
int info; L.pHead = NewNode;
struct node* pNext; L.pTail = L.Head;
}; }
typedef struct node NODE; else
{
struct list NewNode -> pNext = L.pHead;
{ L.pHead = NewNode;
NODE* pHead; }
NODE* pTail; }
};
typedef struct list LIST; void nhap(LIST &L)
{
/* Cc khai bo hm (prototype) */ int n;
printf(\n Nhap so luong node:);
void init(LIST &L); NODE* getnode(int x); scanf(%d,&n);
void addhead(LIST &L, NODE* Newnode); init(L); /*To danh sch lin kt */
void nhap(LIST &L); for (int i=1; i <=n; i++)
void xuat(LIST L); {
long Tong(LIST L); int x;
void main ( ) printf(\n Nhap so nguyen thu %d =, i);
{ scanf(%d,&x);
LIST lst; NODE* p= getnode (x);
nhap(lst); addhead(L,p);
xuat(lst); }
long kq = Tong(lst); }
printf(\n Tong cac node = %ld , s);
getch ( ); void xuat (LIST L)
} {
void init (LIST &L) for (NODE* p=L. pHead; p!= NULL; p = p ->pNext)
{ {

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; }
} }

NODE* getnode (int x) long Tong(LIST L)


{ {
NODE* p; long s = 0;
p = new NODE; for (NODE* p=L.pHead; !p=NULL; p=p->pNext)
if ( p= =NULL) {
return NULL; s = s + p ->info;
p -> info = x; }
p -> pNext = NULL; }
return p; Kt qu chy chng trnh:
}

Bi tp t lm

Bi 46: Vit hm nhp dslk n cc phn s.


Bi 47: Vit hm xut dslk n cc phn s.
Bi 48: Vit hm nhp dslk n cc ng trn.
Bi 49: Vit hm xut dslk n cc ng trn.
Bi 50: Vit hm tnh tng cc s nguyn l trong danh sch lin kt n cc s nguyn.
5. Tm phn t trong danh sch lin kt n:
Thut ton:
Bc 1: p = Head; //Cho p tr n phn t u danh sch
Bc 2: Trong khi (p != NULL) v (p->pNext != k ) thc hin:
B2.1 : p:=p->Next;// Cho p tr ti phn t k
Bc 3:
Nu p != NULL th p tr ti phn t cn tm
Ngc li: khng c phn t cn tm.
Ci t:
NODE *Search(LIST L, Data k)
{ NODE *p;
p = l.pHead;
while((p!= NULL)&&(p->Info != x))
p = p-> pNext;
return p;;
}

III. CC KIU D LIU TRU TNG:


III.1 Ngn xp (Stack)
Stack l kiu danh sch tuyn tnh (kch thc khng c nh v php b sung v php loi b
thng xuyn tc ng ln danh sch).

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

Ta c th dng mng 1 chiu lu tr Stack: S[1], S[2],.,S[n]. Vi n l s phn t cc


i ca mng S.
Gi T l ch s phn t nh ca Stack F T c s dng theo di v tr nh ca Stack.
T+1: Khi b sung 1 phn t vo danh sch v ngc li T-1 khi gim bt 1 phn t trong danh sch.

* 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]

III.1.1 Biu din Stack bng mng:


To stack S v qun l nh stack bng bin t:
Data S [n];
int t;

Gi tr ca n c th qu nh so vi nhu cu thc t hoc qu ln s lm lng ph b nh.


V d minh ha:
#include "stdafx.h"
#include "stdio.h" int Pop(int *x)// Hm ly t stack ra
#include "conio.h" {
// Cc khai bo hm prototype *x=stack[top--];
void khoitaostack(); return top;
int kiemtrarong(); }
int kiemtraday();
int Push(int x); void main ( )
int Pop(int *x); {
// Khai bo hng int k;
#define MAX 100 khoitaostack();
// Mng stack
int stack [MAX+1]; do
int top;// Bin chung nh {
printf("\n Nhap cac phan tu vao stack (Bam -1 de ket thuc) : ");
void khoitaostack( ) scanf("%d",&k);

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;
}

III.1.2 Biu din Stack bng danh sch:

* To Stack S rng * Loi b phn t nh stack S


LIST * S; Data Pop(LIST &S)
Lnh S.pHead=S.pTail= NULL s to ra mt Stack {
S rng. Data x;
if(isEmpty(S)) return NULLDATA;
* Kim tra stack rng x = RemoveFirst(S);
Int IsEmpty(LIST &S) return x;
{ }
if (S.pHead == NULL) // stack rng Xem thng tin ca phn t nh stack S
return 1; Data Top(LIST &S)
else return 0; {
} if(isEmpty(S)) return NULLDATA;
* Thm mt phn t p vo stack S return L.Head->Info;
void Push(LIST &S, Data x) }
{
InsertHead(S, x);
}

Chng trnh minh ha:


#include "stdafx.h" void addhead (LIST &L, NODE* NewNode)
#include "stdio.h" {
#include "conio.h" if (L.pHead == NULL)
{
struct node L.pHead = NewNode;
{ L.pTail = L.pHead;
int info; }
struct node* pNext; else
}; {

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".

Cc i tng c th c thm vo hng i bt k lc no nhng ch c i tng thm


vo u tin mi c php ly ra khi hng i.
Thao tc thm mt i tng vo hng i v ly mt i tng ra khi hng i ln lt
c gi l "enqueue" v "dequeue".
Vic thm mt i tng vo hng i lun din ra cui hng i v mt phn t lun
c ly ra t u hng i.

Ra Vo

Hnh minh ha

CTDL hng i c nhiu ng dng: kh qui, t chc lu vt cc qu trnh tm kim theo


chiu rng v quay lui, vt cn, t chc qun l v phn phi tin trnh trong cc h iu hnh, t
chc b m bn phm.
III.2.1 Biu din Queue bng mng:

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
} {

int kiemtra_rong( ) scanf("%d",&k);


{ if (k != -1)
return (queuesize=0); push(k);
} ++dem;
int kiemtra_day( ) }
{ while (k!=-1 && !kiemtra_day());
return (queuesize==MAX); printf("\n so phan tu trong queue= %d \n",dem);
} printf("\n Lay cac phan tu trong queue: \n");
int push(int e) for (int i=1; i<dem;i++)
{
if (queuesize <MAX) {
{ pop(&k);
queuesize++; printf(" %d ",k);
queue[rear++] = e; }
if (rear ==MAX)
rear =0; getch( );
} }
return rear;
}

III.2.2 Biu din Queue bng danh sch lin kt n:

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.

III.2.2.1 To hng i rng- Kim tra hng i rng


void init (LIST &Q)// Khi to hng i rng int KiemTraRong(LIST Q)
{ {
Q.pHead = NULL; if (Q.pHead = = NULL) // stack rng
Q.pTail = NULL; return 1;
} else return 0;
}

III.2.2.2 Thm mt phn t x vo cui hng i


void AddTail(LIST &Q, NODE* x )
{
if (Q.pHead==NULL)
{
Q.pHead = x;
Q.pTail = Q.pHead;
}
else
{
Q.pTail->pNext = x;
Q.pTail = x;
}
}

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; {

void init(LIST &Q); /* Khai bo hm int n;


(prototype) */ SONGUYEN x;
NODE* getnode(SONGUYEN x); printf("\n Nhap so phan tu cho stack: ");
void AddTail(LIST &Q, NODE* x); scanf("%d",&n);
void nhap(LIST &Q); init(Q); /*Tao danh sch lin kt */
void xuat(LIST Q); for (int i=1; i <=n; i++)
{

void main ( ) printf("\n Nhap phan tu thu %d: ",i);


{ nhapsonguyen(x);
LIST lst;
nhap(lst); NODE* p =getnode(x);
xuat(lst); AddTail(Q,p);
getch();
} }
}
void init (LIST &Q)//Tao hang doi rong void xuatsonguyen(SONGUYEN x)
{ {
Q.pHead = NULL; printf("\t %d ", x.so);
Q.pTail = NULL; }
}
void xuat(LIST Q)
void AddTail(LIST &Q, NODE* x) {
{ printf("\n Xuat ra man hinh : \n");
if (Q.pHead==NULL) for (NODE* p=Q.pHead; p; p = p ->pNext)
{ {
Q.pHead = x; xuatsonguyen(p->info);
Q.pTail = Q.pHead;
} }
else
{ }
Q.pTail->pNext = x;
Q.pTail = x;
}
}

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

Cy l mt tp hp T cc phn t (gi l nt ca cy) trong c 1 nt c bit c gi l


gc, cc nt cn li c chia thnh nhng tp ri nhau T 1, T2, ... , Tn theo quan h phn cp trong
Ti cng l mt cy. Mi nt cp i s qun l mt s nt cp i+1. Quan h ny ngi ta cn
gi l quan h cha-con.

Mt s khi nim c bn:


Bc ca mt nt: l s cy con ca nt .
Bc ca mt cy: l bc ln nht ca cc nt trong cy (s cy con ti a ca mt nt thuc cy).
Cy c bc n th gi l cy n-phn.
Nt gc: l nt khng c nt cha.
Nt l: l nt c bc bng 0.
Nt nhnh: l nt c bc khc 0 v khng phi l gc .
Mc ca mt nt:
Mc (gc (T) ) = 0.
Gi T1, T2, T3, ... , Tn l cc cy con ca T0
Mc (T1) = Mc (T2) = ... = Mc (Tn) = Mc (T0) + 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

Cy nh phn c th ng dng trong nhiu bi ton thng dng. V d di y cho ta hnh


nh ca mt biu thc ton hc:

Hnh II.3

((((3 x (1 + (4 + 6))) + (2 + 8)) x 5) + (4 x (7 + 2)))

II.2 Mt s tnh cht ca cy nh phn:


* S nt nm mc i <= 2i.
* S nt l <= 2h-1, vi h l chiu cao ca cy.
* Chiu cao ca cy h <= log2(s nt trong cy).
* S nt trong cy <= 2h-1.
II.3 Biu din cy nh phn T

Cy nh phn l mt cu trc bao gm cc phn t (nt) c kt ni vi nhau theo quan h


cha-con vi mi cha c ti a 2 con.
biu din cy nh phn ta chn phng php
T
cp pht lin kt. ng vi mt nt, ta dng mt bin ng
T lu tr cc thng tin:
pLeft info pRight A Biu din -> A
Thng tin lu tr ti nt.(info)
C B C
a ch nt gc ca cy con tri trong b nh.(pLeft) B

a ch nt gc ca cy con phi trong b nh.(pRight) D E


D E

Khai bo tng ng trong ngn ng C c th nh sau:


Tng qut V d
34
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu

struct <tenkdl> Struct phanso


{
{
int tu;
<Kiu d liu> <bin>; int mau;
}; };
typedef struct phanso PHANSO;
typedef struct tenkdl TENKDL;
struct node struct node
{
{ PHANSO info;//Thng tin lu tr ti nt
<Kiu d liu> info; struct node *pLeft;
struct node *pLeft; struct node *pRight;
struct node *pRight; };
}; typedef struct node NODE;
typedef struct node NODE; typedef NODE* TREE;
typedef NODE* TREE;

Bi tp t lm

Bi 52: Khai bo cu trc d liu cy nh phn cc s nguyn.

Bi 53: Khai bo cu trc d liu cy nh phn cc s thc.

Bi 54: Khai bo cu trc d liu cy nh phn cc k t.

Bi 55: Khai bo cu trc d liu cy nh phn cc ng trn.

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 :

void nhap(NODE **T)


{
KCTDL e ;
do
{
printf(\n Nhap nut/-1 : ) ;
scanf(%MaDinhdang ,&e) ;
ChenNut(e,T) ;
}while (e != -1) ;
}

II.5 Duyt cy nh phn


II.5.1 Duyt theo th t trc: (NODE LEFT RIGHT)
Kiu duyt ny trc tin thm nt gc sau thm cc nt ca cy con tri ri n cy con
phi. Th tc duyt nh sau:
void NLR(TREE * root) V d: Duyt cy nh phn s nguyn NLR
{ void NLR(TREE *root)
if (root != NULL) {
{ if (root != NULL)
<X l root>; //X l tng ng theo nhu cu {
NLR(root->pLeft); printf(%d, root->info);
NLR(root->pRight); NLR(root->pLeft);
} NLR(root->pRight);
} }
}

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);
} }
}

Minh ha chng trnh duyt cy:


#include "stdafx.h" void ChenNut(SONGUYEN e, NODE **root)
#include "stdio.h" {
#include "conio.h" NODE *tmp; // Khai bo bin tmp

#include "malloc.h" //Khai bo th vin cp pht b nh tmp = (NODE *) malloc(sizeof(NODE));


// Cp pht b nh cho bin tmp
struct songuyen
tmp ->info=e; // Gn bin tmp = e
{
tmp ->pLeft = NULL;
int so;
tmp ->pRight = NULL;
};
if (*root==NULL) //Nu nt gc cha c
struct node
*root = tmp; //Th gn gi tr cho gc = tmp
{
else
SONGUYEN info;
Chen(tmp, root); //Ngc li, chn tmp vo nt khc
struct node *pLeft;
}
struct node *pRight;
void NhapCay(NODE **root)
};
{
typedef struct node NODE;
SONGUYEN e;

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; {

else if (root !=NULL)

if ((*root) ->pRight) {

Chen(tmp,&(*root)->pRight); printf("%d->",root->info);

else (*root)->pRight = tmp; NLR(root->pLeft);

} NLR(root->pRight);

//Duyet cay theo thu tu giua LEFT-NODE-RIGHT: }

void LNR(NODE *root) }

{ void main()

if (root != NULL) {

{ KhoiTaoCay(&root);

LNR(root->pLeft); NhapCay(&root);

printf("%d->",root->info); printf("\n Duyet cay theo thu tu truoc


(NODE-LEFT-RIGHT):");
LNR(root->pRight);
NLR(root);
}
printf("\n Duyet cay theo thu tu giua
} (LEFT-NODE- RIGHT):");
//Duyet cay theo thu tu sau LEFT-RIGHT-NODE LNR(root);
void LRN(NODE *root) printf("\n Duyet cay theo thu tu sau
{ (LEFT-RIGHT-NODE):");
if (root != NULL) LRN(root);
{ getch();
LRN(root->pLeft); }
LRN(root->pRight);
printf("%d->",root ->info);
}

38
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 56: Vit li chng trnh trn vi cc nt ca cy nh phn l phn s.


Bi 57 : HS hy v li cy ny vi cc nt l s nguyn nh trn?
Bi 57a: Chy chng trnh trn vi cc nt ln lt l 20, 35, 10, 5, 17, 15, 22, 42, 30. Nhn xt
cch duyt th t gia?
II.6 Mt s bi ton ng dng cy nh phn
Bi ton 1: Cho cy nh phn khc rng. Hy vit hm tm gi tr ln nht trong cy nh
phn cc s nguyn.
int SoMax(NODE *root)
{
if (t->pLeft = = NULL && t->pRight = = NULL)
return t->info;
int ln= t->pt;

if (t->pLeft !=NULL && t ->pRight !=NULL)

{
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

Bi 59: Nh bi trn, vit thm hm m s lng nt c ng mt con (nt l)


Bi 60: Nh bi trn, vit thm hm m s lng nt c ng hai con.
Bi 61: Nh bi trn, vit hm thm m s lng nt s nguyn chn.
Bi 62: Nh bi trn, vit thm hm tnh tng cc s nguyn c trong cy.
Bi 63: Nh bi trn, vit hm thm tnh tng s nt (s nguyn) c ng mt con.
Bi 64: Nh bi trn, vit hm thm tnh tng s nt (s nguyn) c ng hai con.

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

I. PHNG PHP SP XP CHN:


I.1 Gii thut:
Gi s, cho dy s ai, ai+1,....an-1. Ta chn phn t nh nht trong n phn t v a v u dy s
(Sau khng quan tm n na); tip tc chn phn t nh nht trong (n-1) phn t cn li v a
v ngay bn cnh phn t nh nht trc chn...C tip tc nh th cho n ht dy s.

I.2 Thut ton:


Bc 1: i = 1;
Bc 2: Tm phn t a[min] nh nht trong dy hin hnh t a[i] n a[n]
Bc 3 : Hon v a[min] v a[i]
Bc 4 : Nu i < n -1 th i = i+1; Lp li Bc 2
Ngc li: Dng. // phn t th n-1 nm ng v tr.
V d
Cho dy s a: 12 2 8 5 1 6 4 15

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:

void SapXepChon(int a [ ], int n )


{
int min; // ch s phn t nh nht trong dy hin hnh
for (int i=0; i< n -1 ; i++)
{
min = i;
for(int j = i+1; j <n ; j++)
if (a[j ] < a[min])
min = j; // ghi nhn v tr phn t hin nh nht
{
int tam=a[j]; //Hoanvi(a[min], a[j])
a[j]=a[min];
a[min]=tam;
}
}
42
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
}

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.

II. PHNG PHP SP XP CHN:


II.1 Gii thut:
Cho dy ban u a1 , a2 ,... ,an, ta c th xem nh c on gm mt phn t a1 c
sp, sau thm a2 vo on a1 s c on a1 a2 c sp; tip tc thm a3 vo on a1 a2 c
on a1 a2 a3 c sp; tip tc cho n khi thm xong aN vo on a1 a2 ...aN-1 s c
dy a1 a2....aN c sp.

II.2 Thut ton:


Bc 1: i = 2; // gi s c on a[1] c sp
Bc 2: x = a[i]; //Tm v tr thch hp trong on a[1] n a[i-1] chn a[i] vo
Bc 3: Di ch cc phn t t a[vitri] n a[i-1] sang phi 1 v tr dnh ch cho a[i]
Bc 4: a[vitri] = x; // c on a[1]..a[i] c sp
Bc 5: i = i +1;
Nu i < n : Lp li Bc 2.
Ngc li : Dng.
V d:
Cho dy s a: 12 2 8 5 1 6 4 15

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.

III. PHNG PHP SP XP NI BT:


III.1 Gii thut:
tng chnh ca gii thut l xut pht t cui (u) dy, i ch cc cp phn t k cn
a phn t nh (ln) hn trong cp phn t v v tr ng u (cui) dy hin hnh, sau
s khng xt n n bc tip theo, do vy ln x l th i s c v tr u dy l i . Lp li x l
trn cho n khi khng cn cp phn t no xt.

III.2 Thut ton:


Bc 1 : i = 1; // ln x l u tin
Bc 2 : j = n; //Duyt t cui dy ngc v v tr i
Trong khi (j < i) thc hin:
Nu a[j]<a[j-1]: a[j]<a[j-1]; //xt cp phn t k cn
j = j-1;
Bc 3 : i = i+1; // ln x l k tip
Nu i >N-1: Ht dy. Dng
Ngc li : Lp li Bc 2.

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

IV. DUYT 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 a: int TimKiemTuanTu(int A[ ], int n, int x)


48
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
#include "stdafx.h" {
#include "conio.h" int i=0;
#include "stdio.h" A[(n+1)]=x;
int TimKiemTuanTu(int A[ ], int n, int x); while (A[i]!=x)
void main( ) i++;
{ if (i == (n+1))
int M[ ]={3, -5, 9, 1, -7, 15, 4}; return 0;
int kq=TimKiemTuanTu(M,6,-5); else
printf("\n Ket qua tim so -5 -> "); return i;
if (kq!=0) return i;
printf(" Da tim thay o vi tri M[%d]",kq); }
else Kt qu chy chng trnh:
printf(" Khong tim thay!!!");
getch( );
}

Hc sinh g li chng trnh trn v thay vo main s cn tm c nhp t bn phm.

Cu b: Hc sinh t lm

III. TM KIM NH PHN:


Bi ton: Gi s ban u dy a1, a2, a3,..,an c sp xp.
Thut ton: Tm kim bng s trung bnh vi s x cn tm
int TimKiemNhiPhan(int A[],int n,int x)
{
int SoBe=1;
int SoLon=n; // Gn gi tr ban u
while (SoBe<=SoLon)
{
int SoGiua= (SoBe+SoLon)/2; //Tnh s trung bnh (phn nguyn)
if (A[SoGiua] = = x) //Nu bng x
return SoGiua; // Th tr v gi tr s gia, dng
if (A[SoGiua]< x) // Nu cn nh hn x
SoBe= SoGiua+1; // Th tng s b ln 1
else
SoLon= SoGiua 1; // Ngc li, gim s ln i 1
}
return 0;
}

Minh ha bi ton trn:


#include "stdafx.h" int TimKiemNhiPhan(int A[], int n, int x)
#include "conio.h" {
#include "stdio.h" int SoBe=1,SoLon=n;

int TimKiemNhiPhan(int A[ ], int n, int x); while (SoBe<=SoLon)


{
void main( ) int SoGiua=(SoBe+SoLon)/2;
{ if (SoGiua == x)
int M[]={3, -5, 9, 1, -7, 15, 4}; return SoGiua;
if (SoGiua <x)
49
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
int kq=TimKiemNhiPhan(M, 6, 15); SoBe=SoGiua + 1;
else
printf(\n Ket qua tim so 15 ->: ); SoLon = SoGiua 1;
if (kq==0) }
printf( Da tim thay!!!,kq); return 0;
else }
printf( Khong tim thay!!!); Kt qu chy chng trnh:
getch( );

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

Hnh trn minh ha cy tm kim nh phn c kha l s nguyn.


- Xt nt 44 F 18, 13, 37, 15, 23, 40 < 44
(Vi 18, 13,37, 15, 23, 40 l tt c cc nt thuc cy con bn tri ca 44)
Tng t: Xt nt 18 F 13, 15 < 18 (Vi 13, 15 l 2 nt thuc cy con bn tri ca nt 18)
- Xt nt 44 F 44 < 88, 59, 108, 55, 71
(Vi 88, 59, 108, 55, 71 l tt c cc nt thuc cy con bn phi ca 44)
Tng t: Xt nt 88 F 88>59 v 88 < 108 (Vi 59 l nt thuc cy con bn tri ca nt 88
v 108 l nt thuc cy con bn phi ca nt 88)
..
Lu :
* Khi duyt cy tm kim nh phn theo th t gia (Left Node Right), ta s c dy c
th t tng: 13, 15,18, 23,37, 40, 44, 55, 59, 71, 88, 108.
* Trn cy TKNP khng c 2 nt cng kha.
50
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
III.2 Khai bo cy tm kim nh phn: (Ging nh khai bo cy nh phn)
typedef <Kiu d liu ca kha> Loi kha; V d: Khai bo cy tm kim nh phn cc s nguyn
struct loaikhoa struct songuyen
{ {
<Kiu d liu> info; int so ;
}; };
typedef struct loaikhoa LOAIKHOA; typedef struct songuyen SONGUYEN ;
struct node struct node
{ {
<Loi kha> key;// SONGUYEN khoa;
struct node *pLeft; struct node *pLeft;
struct node *pRight; struct node *pRight;
}; };
typedef struct node NODE; typedef struct node NODE;
typedef NODE* TREE; typedef NODE* TREE;
III. 3 Cc hm x l cy tm kim nh phn:
Hm to cy TKNP Hm chen
void TaoCayTKNP(TREE *root) void Chen(NODE *tmp,NODE **root)
{ {
*root = NULL; if (tmp->khoa < (*root)->khoa)
if ((*root)->pLeft)
} Chen(tmp,&(*root)->pLeft);
else
(*root)->pLeft=tmp;
else
if ((*root)->pRight)

Chen(tmp,&(*root)->pRight);
else
(*root)->pRight = tmp;
}

Hm chn nt vo cy

void ChenNut(SONGUYEN a, NODE **root)


{
NODE *tmp;
tmp = (NODE *) malloc(sizeof(NODE));
tmp->khoa.so=a;
tmp->pLeft=NULL;
tmp->pRight=NULL;
if (*root==NULL)
*root =tmp;
else
Chen(tmp,root);
}

Hm nhp cy tm kim nh phn

void NhapCayTKNP(TREE *root)


{
51
Ti liu lu hnh ni b trng Trung cp ngh Cam lm
Gio trnh Cu trc d liu
SONGUYEN e;
do
{
printf("\n Nhap nut (bam -1 ket thuc): ");
scanf("%d",&e);
if (e.so !=-1)
ChenNut(e,root);
}while (e.so != -1);
}
III.4 Duyt cy tm kim nh phn:
C 3 cch duyt cy ( hc chng 4)
Nhc li:
Duyt theo th t trc: Duyt theo th t gia: Duyt theo th t cui:
(NODE LEFT RIGHT) (LEFT NODE RIGHT) (LEFT RIGHT NODE)
Thm nt gc sau thm cc nt Thm cc nt ca cy con tri sau Thm cc nt ca cy con tri sau
ca cy con tri ri n cy con phi. thm nt gc ri n cy con phi. thm n cy con phi ri cui cng
mi thm nt gc.
void NLR(TREE root) void LNR(TREE root) void LRN(TREE root)
{ { {
if (root != NULL) if (root != NULL) if (Root != NULL)
{ { {
<X l root>; LNR(root->pLeft); LRN(root->pLeft);
NLR(root->pLeft); <X l root>; LRN(root->pRight);
NLR(root->pRight); LNR(root->pRight); <X l root>;
} } }
} } }

III.5 Tm kim mt nt c kha cho trc trn cy tm kim nh phn


Thut ton: tm kim 1 nt c kha x trn cy TKNP, ta bt u bng cch so snh nt
gc vi kha x.
* Nu nt gc bng NULL F khng c kha x trn cy.
* Nu kha x = kha ca nt gc F tm thy kha x trn cy, dng.
* Nu kha x < kha ca nt gc F tm trn cy con bn tri ( qui).
* Nu kha x > kha ca nt gc F tm trn cy con bn phi ( qui).
V d: Tm nt c kha l 30 trn cy TKNP sau:
20

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.

Bi 73: Cho cy tm kim nh phn cc s nguyn, vit hm m s lng nt, s nt l, s nt 2


con trong cy.

Bi 74: Cho cy tm kim nh phn cc s nguyn, vit hm tm kim phn t x c nhp t bn


phm.

Kim tra kt thc mn

53
Ti liu lu hnh ni b trng Trung cp ngh Cam lm

You might also like