Tải bản đầy đủ (.pdf) (27 trang)

MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT KHOA CÔNG NGHỆ THÔNG TIN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (609.65 KB, 27 trang )

Cấu Truúc Dữ Liệu LVH
Ch ng 1ươ
T NG QUAN V C U TRÚC D LI U VÀ GI I THU TỔ Ề Ấ Ữ Ệ Ả Ậ
I-GI I THI U Ớ Ệ :
• Vi c vi t m t ch ng trình đ đi u khi n máy tính th c hi n các công vi c qu n lýệ ế ộ ươ ể ề ể ự ệ ệ ả
c a ng i s d ng, đáp ng các yêu c u tính toán , tìm ki m , th ng kê , l u tr v…ủ ườ ử ụ ứ ầ ế ố ư ữ
v… là m t v n đ không ph i đ n gi n . ộ ấ ề ả ơ ả
• Vi c đ u tiên ng i s d ng ph i d a trên yêu c u th c t , thông qua các thông tinệ ầ ườ ử ụ ả ự ầ ự ế
c a đ i t ng và các nghi p v chuyên môn x lý trong h th ng c n qu n lý, đ đápủ ố ượ ệ ụ ử ệ ố ầ ả ể
ng yêu c u l u tr , tính toán và x lý tìm ki m thông kê v…v…Thông tin c a h th ngứ ầ ư ữ ữ ế ủ ệ ố
s đ c t ch c thành các c u trúc d li u phù h p, các gi i thu t t i u , sau đó v nẽ ượ ổ ứ ấ ữ ệ ợ ả ậ ố ư ậ
d ng các k thu t , k năng đ chuy n hóa các yêu c u trên thành các ch ng trìnhụ ỹ ậ ỹ ể ể ầ ươ
thông qua m t s ngôn ng l p trình, đ có th x lý đ c trên máy tính đáp ng đ cộ ố ữ ậ ể ể ử ượ ứ ượ
các yêu c u qu n lý thông tin c a ng i s d ng. ầ ả ủ ườ ử ụ
II-C U TRÚC D LI U Ấ Ữ Ệ :
1. KHÁI NI M:Ệ
• C u trúc d li u là mô hình thông tin d li u bi u di n thông tin các đ iấ ữ ệ ữ ệ ể ễ ố
t ng d liêu trong h th ng th c t . Tùy theo tính ch t x lý, thu c tính mô t c a m iượ ữ ệ ố ự ế ấ ử ộ ả ủ ỗ
đ i t ng, mà c u trúc d li u có th đ c t ch c khác nhau. ố ượ ấ ữ ệ ể ượ ổ ứ
• C u trúc d li u đ c t ch c tuân th theo các qui t c v ki u d li u , kíchấ ữ ệ ượ ổ ứ ủ ắ ề ể ữ ệ
th c và ràng bu c d li u, đ có th t ch c l u tr và x lý trên máy tính m t cáchướ ộ ữ ệ ể ể ổ ứ ư ữ ử ộ
t i u.ố ư
• Ví d : Đ qu n lý thông tin nhân viên ta t ch c c u trúc d li u nh sau:ụ ể ả ổ ứ ấ ữ ệ ư
struct sinhvien
{
char tensv[10],lop[10];
int tuoi;
float hocbong;
};
int i,siso;
sinhvien sv[20];



2. VAI TRÒ C U TRÚC D LI U :Ấ Ữ Ệ
• T ch c bi u di n các đ i t ng th c t :ổ ứ ể ễ ố ượ ự ế
Các thành ph n d li u th c t đa d ng phong phú và th ng ch a các quan h ràng bu cầ ữ ệ ự ế ạ ườ ứ ệ ộ
nào đó v i nhau, do đó trong mô hình d li u tin h c c a bài toán, c n ph i t ch c, xâyớ ữ ệ ọ ủ ầ ả ổ ứ
d ng các c u trúc d li u thích h p nh t, sao cho v a có th ph n nh đ y đ thông tin v aự ấ ữ ệ ợ ấ ừ ể ả ả ầ ủ ừ
có th d dàng x lý tính toán trên máy tính.ể ễ ử
• Xây d ng các thao tác x lý d li u (gi i thu t):ự ử ữ ệ ả ậ
T các yêu c u x lý th c t , c n tìm ra các gi i thu t t ng ng đ xác đ nh trình t cácừ ầ ử ự ế ầ ả ậ ươ ứ ể ị ự
thao tác máy tính ph i thi hành đ cho k t qu mong mu n.ả ể ế ả ố
• Vi c xây d ng c u trúc d li u và gi i thu t là 2 công vi c quan tr ng quan h và bệ ự ấ ữ ệ ả ậ ệ ọ ệ ổ
sung cho nhau. C u trúc d li u t ch c đ y đ , chính xác thì vi c xây d ng gi i thu t trấ ữ ệ ổ ứ ầ ủ ệ ự ả ậ ở
nên d dàng. ễ
• V i m t c u trúc d li u đã ch n s có nh ng gi i thu t t ng ng phù h p, khi c uớ ộ ấ ữ ệ ọ ẽ ữ ả ậ ươ ứ ợ ấ
trúc có s thay đ i th ng thì gi i thu t ph i thay đ i theo. ự ổ ườ ả ậ ả ổ
TRANG 1
Cấu Truúc Dữ Liệu LVH
• M t c u trúc d li u t t s giúp cho gi i thu t x lý trên nó có th phát huy tác d ng t tộ ấ ữ ệ ố ẽ ả ậ ử ể ụ ố
h n, có th đáp ng nhanh, gi i thu t r ràng đ n gi n và d hi u. ơ ể ứ ả ậ ỏ ơ ả ễ ể
• S thành công c a m t ch ng trình tin h c chính là s k t h p ch t ch gi a c u trúcự ủ ộ ươ ọ ự ế ợ ặ ẽ ữ ấ
d li u và gi i thu t .Th hi n qua công th c sau :ữ ệ ả ậ ể ệ ứ
C u trúc d li u + Gi i thu t = Ch ng trìnhấ ữ ệ ả ậ ươ
3. CÁC TIÊU CHU N ĐÁNH GIÁ :Ẩ
• Ph n ánh đúng th c t : Đây là tiêu chu n quan tr ng nh t, quy t đ nh tính đúng đ nả ự ế ẩ ọ ấ ế ị ắ
c a toàn b bài toán . C n xem xét k l ng cũng nh d trù các tr ng thái bi n đ i c aủ ộ ầ ỹ ưỡ ư ự ạ ế ổ ủ
d li u trong chu trình s ng đ có th ch n c u trúc d li u l u tr th hi n chính xácữ ệ ố ể ể ọ ấ ữ ệ ư ữ ể ệ
đ i t ng th c t .ố ượ ự ế
Ch ng h n c n l u ý vi c ch n ki u d li u cho các bi n : Ví d bi u di n thông tinẳ ạ ầ ư ệ ọ ể ữ ệ ế ụ ể ễ
NHAN VIEN có thành ph n TUOI nên ch n ki u unsign char thay vì ch n char ho c int ,ầ ọ ể ọ ặ
thành ph n LUONG chon ki u unsign long thay vì ch n int , long ho c float.ầ ể ọ ặ

Có nhi u bi n d li u có th phù h p trong hi n t i, nh ng khi m r ng ch ng trình đề ế ữ ệ ể ợ ệ ạ ư ở ộ ươ ễ
đáp ng cho yêu c u phát tri n c a h th ng các bi n này tr nên không phù h p.ứ ầ ể ủ ệ ố ế ở ợ
• Phù h p v i các thao tác trên đó : Tiêu chu n này giúp tăng tính hi u qu c a bài toán,ợ ớ ẩ ệ ả ủ
vi c xây d ng và phát tri n các gi i thu t đ n gi n, t nhi n h n, ch ng trình đ t hi uệ ự ể ả ậ ơ ả ự ệ ơ ươ ạ ệ
qu cao h n v t c đ x lý .ả ơ ề ố ộ ử
Ch ng h n ch ng trình qu n lý nhân viên có liên quan đ n l u tr ( ki u file) , các thao tácẳ ạ ươ ả ế ư ữ ể
c a ch ng trình là các vi c th ng xuyên là : Thêm, Xóa , S a , Tìm , Duy t danh sách …ủ ươ ệ ươ ử ệ
Do đó n u t ch c c u trúc d li u x lý tr c ti p các công vi c trên ki u FILE thì gi iế ổ ứ ấ ữ ệ ử ự ế ệ ể ả
thu t s ph c t p, t c đ x lý ch m vì luôn ph i làm vi c trên b nh ngoài . Trongậ ẽ ứ ạ ố ộ ử ậ ả ệ ộ ớ
tr ng h p này k t h p v i t ch c d li u là danh sách (dãy c u trúc , danh sách liên k t )ườ ợ ế ợ ớ ổ ứ ữ ệ ấ ế
s d ng b nh trong , vi c x lí s nhanh h n , danh sách s nh n thông tin b t đ uử ụ ộ ớ ệ ử ẽ ơ ẽ ậ ắ ầ
ch ng trình t danh sách FILE và x lý cho đ n khi k t thúc ch ng trình danh sách sươ ừ ử ế ế ươ ẽ
đ c t ch c l u l i trên file tr c khi k t thúc.ượ ổ ứ ư ạ ướ ế
• Ti t ki m tài nguyên h th ng : Khi xây d ng c u trúc d li u ch nên s d ng tàiế ệ ệ ố ự ấ ữ ệ ỉ ử ụ
nguyên h th ng v a đ đ m nhi m đ c ch c năng c a nó. Thông th ng có 2 lo i tàiệ ố ừ ủ ả ệ ượ ứ ủ ườ ạ
nguyên th ng đ c l u tâm đó là CPU và b nh . Tùy theo yêu c u x lý, n u y u tườ ượ ư ộ ớ ầ ử ế ế ố
x lý c n nhanh ti t ki m th i gian thì tài nguyên b nh c n s d ng t i u và ng cử ầ ế ệ ờ ộ ớ ầ ử ụ ố ư ượ
l i.ạ
III-KI U D LI U Ể Ữ Ệ :
1. KHÁI NI M:Ệ
• Ki u d li u là thành ph n đ c tr ng cho t ch c, hình d ng, kích th cể ữ ệ ầ ặ ư ổ ứ ạ ướ
c a các thành ph n nh p xu t tính toán trong ch ng trình . Trong các ngôn ng l pủ ầ ậ ấ ươ ữ ậ
trình m i ki u thành ph n này s đ c c p phát v i kích th c ô nh khác nhau tùyỗ ể ầ ẽ ượ ấ ớ ướ ớ
theo ki u đ ch a giá tr đáp ng vi c l u tr và x lý trên máy tính.ể ể ứ ị ứ ệ ư ữ ử
• Ki u d li u đ c xác đ nh là m t b <V,O> v i : V là t p các giá tr h pể ữ ệ ượ ị ộ ộ ớ ậ ị ợ
l mà đ i t ng có th l u tr và O là t p các thao tác x lý có th th c thi trên đ iệ ố ượ ể ư ữ ậ ử ể ự ố
t ng.ượ
Ví d : Ki u s nguyên int : Trong đó s g m m t t p các giá tr nguyên có giá tr t -32768ụ ể ố ẽ ồ ộ ậ ị ị ừ
cho đ n +32767 và t p này cho phép th c hi n đ c các phép tóan s h c + - * / %, cácế ậ ự ệ ượ ố ọ
phép tóan quan h < <= > >= != == . Trong khi đó ki u chu i không cho phép s d ng cácệ ể ỗ ử ụ

phép tóan s h c này…. ố ọ
• Trong các ngôn ng l p trình ki u d li u đ c phân làm các lo i sau :ữ ậ ể ữ ệ ượ ạ
 Ki u d li u c b n : Là các ki u d li u mà các ngôn ng l pể ữ ệ ơ ả ể ữ ệ ữ ậ
trình đã đ nh nghĩa s n. Ch ng h n nh : Ki u s nguyên , s th c, kí t , lu n lý …ị ẵ ẳ ạ ư ể ố ố ự ự ậ
TRANG 2
Cấu Truúc Dữ Liệu LVH
 Ki u có c u trúc :Là ki u d li u do ng i s d ng đ nh nghĩaể ấ ể ữ ệ ườ ử ụ ị
ki u khi dùng, tùy theo mô t thông tin c a đ i t ng có các ki u đ nh nghĩa khácể ả ủ ố ượ ể ị
nhau. G m các ki u nh : Chu i, dãy, c u trúc , union, t p tin…ồ ể ư ỗ ấ ậ
 Ngoài ra còn có ki u qu n lí đ a ch ô nh : Ki u con tr (pointer).ể ả ị ỉ ớ ể ỏ
• Ví d : unsign int diem;ụ
Int tong,tich; float luong; char hoten[30],diachi[50]; Int day[30];
2. CÁC KI U D LI U C B N:Ể Ữ Ệ Ơ Ả
• Là các lo i d li u đ n gi n , không có c u trúc. Chúng th ng là các giá tr vôạ ữ ệ ơ ả ấ ườ ị
h ng nh s nguyên, s th c, kí t , các giá tr logic ….Do tính thông d ng và đ n gi nươ ư ố ố ự ự ị ụ ơ ả
mà các lo i d li u này trong các ngôn ng l p trình đã đ c xây d ng s n nh cácạ ữ ệ ữ ậ ượ ự ẵ ư
thành ph n c a ngôn ng đ gi m nh công vi c cho ng i l p trình.ầ ủ ữ ể ả ẹ ệ ườ ậ
• Bao g m các ki u sau :ồ ể
 Ki u có th t r i r c : S nguyên, kí t , lu n lý , li t kê, mi n con….ể ứ ự ờ ạ ố ự ậ ệ ề
 Ki u không r i r c : S th c .ể ờ ạ ố ự
• Tùy theo t ng ngôn ng l p trình vi c đ nh nghĩa s n các ki u d li u c b n cóừ ữ ậ ệ ị ẵ ể ữ ệ ơ ả
khác đôi chút . Trong C ki u c b n ch là ki u nguyên, th c, kí t , không có ki u lu nể ơ ả ỉ ể ự ự ể ậ
lý (Boolean) , ki u lu n lý ĐUNG (TRUE) và SAI (FALSE) đ c xem là ki u sể ậ ượ ể ố
nguyên khác zero và zero. Trong C ki u kí t th c ch t là ki u s nguyên khi l u tr .ể ự ự ấ ể ố ư ữ
• B ng bi u di n các ki u sau :ả ể ễ ể
TÊN KI UỂ Ý NGHĨA T M TRẦ Ị KÍCH
TH CƯỚ
(Byte)
int S nguyênố
-32768  +32767

2
unsigned int S nguyênố
không d u ấ
0  65535
2
long S nguyên dàiố
-2.147483648 
+2.147483647
4
unsigned long S nguyên dàiố
không d u ấ
04.294967295
4
char
Kí t A ự  Z ,
az ,
09 , .,’”{]+*

-128  +127
1
unsinged char Kí t khôngự
d u ấ
0  255
1
float S th cố ự
-3.4*10
-38
 +3.4*10
+38
4

double S th c l nố ự ớ
-1.7*10
-308
 +1.7*10
+308
8
3. CÁC KI U D LI U CÓ C U TRÚC:Ể Ữ Ệ Ấ
• V i các ki u c b n trong nhi u tr ng h p không th bi u di n đ y đ thông tin b nớ ể ơ ả ề ườ ợ ể ể ễ ầ ủ ả
ch t s v t c a đ i t ng th c t , do đó yêu c u ph i có ki u mà sao cho khi s d ngấ ự ậ ủ ố ượ ự ế ầ ả ể ử ụ
ng i s d ng có th t đ nh các ki u phù h p d a trên ki u c b n .Đa s các ngôn ngườ ử ụ ể ự ị ể ợ ự ể ơ ả ố ữ
l p trình đ u cài đ t s n m t s ki u có c u trúc c b n và cung c p c ch cho ng i l pậ ề ặ ẵ ộ ố ể ấ ơ ả ấ ơ ế ườ ậ
trình viên có th t đ nh nghĩa ki u d li u m i.ể ự ị ể ữ ệ ớ
• Ki u d li u do ng i s d ng đ nh nghĩa ki u khi dùng, tùy theo mô t thông tin c aể ữ ệ ườ ử ụ ị ể ả ủ
đ i t ng có các ki u đ nh nghĩa khác nhau. G m các ki u nh : Chu i, dãy, c u trúc ,ố ượ ể ị ồ ể ư ỗ ấ
union, t p tin…ậ
TRANG 3
Cấu Truúc Dữ Liệu LVH
a) Ki u chu i ký t :ể ỗ ự
b) Ki u dãy (m ng) :ể ả
c) Ki u c u trúc (b n ghi):ể ấ ả
d) Ki u union :ể
e) Ki u t p tin (FILE):ể ậ
4.
IV >GI I THU T :Ả Ậ
1. Khái ni m:ệ
• Gi i thu t là các b c đ gi i quy t v n đ bài toán . M t v n đ có th có nhi uả ậ ướ ể ả ế ấ ề ộ ấ ề ể ề
ph ng pháp gi i quy t, tuy nhiên tùy thuôc vào t ng yêu c u có th l a ch n ph ng phápươ ả ế ừ ầ ể ự ọ ươ
phù h p.ợ
• Trong các ch ng trình x lý trên máy tính, tùy thu c vào yêu c u c n t i u b nhươ ử ộ ầ ầ ố ư ộ ớ
ho c t i u v th i gian x lý mà m t v n đ có th đ c gi i quy t b ng nhi u gi i thu tặ ố ư ề ờ ử ộ ấ ề ể ượ ả ế ằ ề ả ậ

khác nhau.
• Đ vi t m t ch ng trình ng d ng hi u qu vi c xác đ nh c u trúc d li u và gi iể ế ộ ươ ứ ụ ệ ả ệ ị ấ ữ ệ ả
thu t t i u là v n đ quan tr ng . Gi i thu t có th ph thu c vào c u trúc d li u t ch c,ậ ố ư ấ ề ọ ả ậ ể ụ ộ ấ ữ ệ ổ ứ
tuy nhiên vi c l a ch n gi i thu t phù h p tùy theo yêu c u th c t .ệ ự ọ ả ậ ợ ầ ự ế
• Trong vi c phân tích và thi t k h th ng , qua vi c kh o sát phân tích các gi i thu t cóệ ế ế ệ ố ệ ả ả ậ
th đ c bi u di n b ng các l u đ đ l u l i k t qu phân tích, đ ng th i làm n n t ngể ượ ể ễ ằ ư ồ ể ư ạ ế ả ồ ờ ề ả
cho vi c xây d ng ch ng trình.ệ ự ươ
2. Các b c phân tích gi i thu t::ướ ả ậ
• Xác đ nh các đ c tr ng d li u s đ c làm d li u nh p xu t tính toán .ị ặ ư ữ ệ ẽ ượ ữ ệ ậ ấ
• Xác đ nh các thao tác c n x lý , các thao tác tr u t ng có th đ tách bi t vi cị ầ ử ừ ượ ể ể ệ ệ
phân tích v i vi c cài đ t.ớ ệ ặ
• Phân tích toán h c các gi i thu t nh m tìm ra các giá tr trung bình v th i gian vàọ ả ậ ằ ị ề ờ
tr ng h p x u nh t cho các đ i l ng c b n. Nghĩa là th i gian x u nh t và t i u nh tườ ợ ấ ấ ạ ượ ơ ả ờ ấ ấ ố ư ấ
trong các tr ng h p.ườ ợ
TRANG 4
Cấu Truúc Dữ Liệu LVH
Ch ng 2ươ
CÁC KI U D LI U CÓ C U TRÚCỂ Ữ Ệ Ấ
I. KI U M NGỂ Ả :
1. Khái ni mệ :
 M ng là m t ki u d li u bao g m nhi u ph n t có cùng ki u , khi l u tr m ngả ộ ể ữ ệ ồ ề ầ ử ể ư ữ ả
đ c l u trên m t dãy các ô nh k ti p nhau , do đó thông qua v trí ô nh (ch s ) ta có thượ ư ộ ớ ế ế ị ớ ỉ ố ể
truy xu t 1 ph n t c a dãy .ấ ầ ử ủ
 Cú pháp khai báo : Khai báo tr c ti p ( không có tên ki u ):ự ế ể
<Tên ki u c s > <tên bi n m ng> [ đ l n ]ể ơ ở ế ả ộ ớ ;
Khai báo gián ti p : ế typedef <tên ki u c s > <tên bi n m ng> [ đ l n ] ;ể ơ ở ế ả ộ ớ
 Truy xu t giá tr bi n m ng s d ng cú pháp ấ ị ế ả ử ụ <Tên bi n>(ch s )ế ỉ ố
 Ví d ụ : typedef int day[50] ;
int a[5] ;
day h ;

Float b[10] ;
Char s[20] ;
a[5]

M ng có 5 ph n t nguyên : a[1],a[2],a[3],a[4],a[5]ả ầ ử
b[10]

M ng có 10 ph n t s th c : b[1],b[1],……,b[10]ả ầ ử ố ự
Bi n h ế

M ng có 50 ph n t nguyên h[1] , h[2], … , h[50]ả ầ ử
s[20]

M ng có 20 ph n t kí t s[1],s[2],……. ả ầ ử ự
a[1]=29;
b[5]=2.34;
s[2]=’a’;
2. Xu t và nh p m ngấ ậ ả :
 Đ xu t nh p m ng ta th ng s d ng vòng l p for ể ấ ậ ả ườ ử ụ ặ
 Ví d : Vi t ch ng trình nh p vào m t dãy các s nguyên , in ra dãy đã nh p , dãyụ ế ươ ậ ộ ố ậ
s ch n ,t ng các s ch n , dãy s l , t ng các s l đã nh p .ố ẵ ổ ố ẳ ố ẽ ổ ố ẽ ậ
#include <stdio.h>
#include <conio.h>
main()
{
int i,n, tongchan,tongle ;
int a[20];
printf("Nhap day \n");
printf("Nhap vao so phan tu day :");
scanf("%d",&n);

for (i=1;i<=n;i++)
{
printf("Nhap phan tu thu a[%d]= ",i);
scanf("%d",&a[i]);
}
printf("Day phan tu da nhap : ");
for (i=1;i<=n;i++) printf("%4d",a[i]);
printf("\n");
tongchan=0;
printf("Day phan tu chan da nhap : ");
for (i=1;i<=n;i++)
if (a[i] % 2==0 )
{ printf("%4d",a[i]);
tongchan=tongchan + a[i];
}
printf("\n");
printf("Tong cac so chan: %d
\n",tongchan);
tongle=0;
printf("Day phan tu le da nhap : ");
for (i=1;i<=n;i++)
if (a[i] % 2!=0 )
{ printf("%4d",a[i]);
tongle=tongle + a[i];
}
printf("\n");
printf("Tong cac so le: %d \n",tongle);
getch();
}
Ch ng 3ươ

TRANG 5
Cấu Truúc Dữ Liệu LVH
II. KI U C U TRÚC (RECORD)Ể Ấ
1. Khái ni m ệ :
 Trong th c t thông tin qu n lý không ch là m t giá tr , m t thành ph n (bi n ki u cự ế ả ỉ ộ ị ộ ầ ế ể ơ
b n) ho c nhi u giá tr nh ng m t ki u (bi n dãy), mà đây đ i t ng có th bao g m nhi uả ặ ề ị ư ộ ể ế ở ố ượ ể ồ ề
thông tin thành ph n và m i thành ph n có th thu c các ki u khác nhau. Ch ng h n c u trúcầ ỗ ầ ể ộ ể ẳ ạ ấ
l u tr thông tin sinh viên g m các thành ph n : masv , tên sinh viên , tu i , phái , đ a ch , h cư ữ ồ ầ ổ ị ỉ ọ
b ng .Trong tr ng h p này C cho phép khai báo s d ng ki u c u trúc.ổ ườ ợ ử ụ ể ấ
 Ki u d li u c u trúc là ki u d li u mà d li u bao g m nhi u thành ph n , m iể ữ ệ ấ ể ữ ệ ữ ệ ồ ề ầ ỗ
thành ph n có th thu c các ki u d li u khác nhau . ầ ể ộ ể ữ ệ
 Khai báo : struct <Tên ki u c u trúc>ể ấ
{
<Tên ki u1 > <bi n 1,bi n 2 > ;ể ế ế
<Tên ki u2> <bi n 1,bi n2 >ể ế ế ;
…………
};
Ví d : ụ struct sinhvien
{
Char tensv[30];
Int tuoi;
Char diachi[50];
Float hocbong;
};
Sinhvien a;
 Đ truy xu t bi n c u trúc s d ng cú pháp :ể ấ ế ấ ử ụ
<bi n c u trúc>.<tên bi n thành ph n>ế ấ ế ầ
Ví d : ụ printf (“Nhap tên sinh vien : “) ;
gets(“%s”,a.tensv);
Printf(“nhap tuoi :”);

scanf(“%d”,&a.tuoi);
2. Dãy d li u c u trúcữ ệ ấ :
• Ki u dãy là ki u d li u mà m t bi n bao g m nhi u ph n t cùng ki u , ki u c u trúc làể ể ữ ệ ộ ế ồ ề ầ ử ể ể ấ
ki u mà bi n là m t ph n t g m nhi u thành ph n thu c các ki u khác nhau . Trong th c t m tể ế ộ ầ ử ồ ề ầ ộ ể ự ế ộ
danh sách bao g m nhi u đ i t ng , thông tin m i đ i t ng g m nhi u thành ph n là công vi cồ ề ố ượ ỗ ố ượ ồ ề ầ ệ
qu n lý c a ng i s d ng .ả ủ ườ ử ụ
Ch ng h n qu n lý danh sách thông tin v nhân viên ( tennv , tuoi , luong …) ,qu n lý thôngẳ ạ ả ề ả
tin v sinh viên (tensv , tuoi , lop, hocbong , diem ….)ề
• Đ t ch c qu n lý lo i thông tin danh sách trên ta t ch c ki u d li u là dãy c u trúc,ể ổ ứ ả ạ ổ ứ ể ữ ệ ấ
nghĩa là ki u k t qu c a dãy thu c ki u c u trúc.ể ế ả ủ ộ ể ấ
• Chú ý : Khi nh p d li u cho dãy c u trúc , đ i v i các thành ph n thu c ki u nguyên vàậ ữ ệ ấ ố ớ ầ ộ ể
th c, ta không th nh p tr c ti p thông qua &<tên bi n c u trúc>.<tên bi n tp> , mà ph iự ể ậ ự ế ế ấ ế ả
nh p thông qua bi n trung gian trung gian, sau đó gán l i .ậ ế ạ
• Ví d :ụ
Struct nhanvien /* khai báo c u trúc nhanvien */ấ
{ char tennv[30];
Int tuoi;
Float luongcb;
};
nhanvien nv[20]; /* khai báo bi n nv là dãy nhan vien *ế
TRANG 6
Cấu Truúc Dữ Liệu LVH
III. KI U H P (UNION)Ể Ợ
1. Khái ni m ệ :
 Ki u h p là ki u d li u đ c bi t c a ngôn ng C, ki u h p có ý nghĩa s d ng gi ngể ợ ể ữ ệ ặ ệ ủ ữ ể ợ ử ụ ố
nh ki u c u trúc , nghĩa là ki u d li u bao g m nhi u thành ph n , m i thành ph n có thư ể ấ ể ữ ệ ồ ề ầ ỗ ầ ể
thu c các ki u khác nhau . Ch ng h n mô t v đ i t ng sinh viên : h tên , tu i , đ a ch ,ộ ể ẳ ạ ả ề ố ượ ọ ổ ị ỉ
h c b ng ….ọ ổ
 Ki u h p đ c khai báo và s d ng hoàn toàn gi ng nh ki u c u trúc . Tuy nhiênể ợ ượ ử ụ ố ư ể ấ
khác nhau c b n gi a 2 ki u này là : Ki u c u trúc có kích th c là t ng kích th c c a cácơ ả ữ ể ể ấ ướ ổ ướ ủ

thành ph n khai báo trong c u trúc , còn ki u h p là ki u có kích th c là b ng kích th cầ ấ ể ợ ể ướ ằ ướ
c a thành ph n mà có kích th c l n nh t . Chính v y trong h p các thành ph n dùng chungủ ầ ướ ớ ấ ậ ợ ầ
m t vùng nh c a thành ph n có kích th c l n nh t hay nói cách khác cùng m t vùng nhộ ớ ủ ầ ướ ớ ấ ộ ớ
có th truy xu t d i các d ng khác nhau .ể ấ ướ ạ
 Khai báo : union <Tên ki u c u trúc>ể ấ
{
<Tên ki u1 > <bi n 1,bi n 2 > ;ể ế ế
<Tên ki u2> <bi n 1,bi n2 >ể ế ế ;
…………
};
Ví d : ụ union kieuso
{
Int so_nn;
Long so_nl;
Float so_t;
};
Kieuso a;
 Đ truy xu t bi n h p s d ng gi ng nh c u trúc v i cú pháp :ể ấ ế ợ ử ụ ố ư ấ ớ
<bi n c u trúc>.<tên bi n thành ph n>ế ấ ế ầ
Ví d : ụ printf (“Nhap so nguyen nho : “) ;
scanf(“%d”,&a.so_nn);
printf(“nhap so nguyen lon :”);
scanf(“%d”,&a.so_nl);
printf(“nhap so thuc :”);
scanf(“%f”,&a.so_t);
 Vi c dùng ki u union r t thu n l i khi c n s d ng các c u trúc d li u mà n i dung c aệ ể ấ ậ ợ ầ ử ụ ấ ữ ệ ộ ủ
nó thay đ i tùy theo tr ng thái. Ví d đ khai thông tin v m t con ng i ta có th khai báoổ ạ ụ ể ề ộ ườ ể
m t ki u d li u nh sau:ộ ể ữ ệ ư
Struct hoso
{

Char hoten[30]; Int namsinh; Char noisinh[50];
Char gioitinh; //0 :N , 1 :Namữ
Char ttgd; //0 :Không có gia đình, 1 :Có gia đình
Union {
Char tenvo[30]; Char tenchong[30];
}
};
Hoso nguoi;
Nh v y tùy theo ng i mà ta xét là nam hay n mà ta s truy xu t thông tin qua thành ph nư ậ ườ ữ ẽ ấ ầ
có tên là tenvo hay tenchong
TRANG 7
Cấu Truúc Dữ Liệu LVH
TRANG 8
Cấu Truúc Dữ Liệu LVH
IV. KI U T P TINỂ Ậ
1. KHÁI NI M:Ệ
• Ki u t p tin là ki u d li u mà d li u là m t t p các ph n t cùng ki u , đ c t ch cể ậ ể ữ ệ ữ ệ ộ ậ ầ ử ể ượ ổ ứ
l u tr b nh ngoài (thi t b l u tr : Đĩa t , quang … ) .ư ữ ở ộ ớ ế ị ư ữ ừ
• Khai báo : Có th khai báo tr c ti p ho c gián ti p ể ự ế ặ ế
- Tr c ti p : ự ế FILE *<Bi n t p tin> ;ế ậ
- Gián ti p : ế typedef FILE *<ki u t p tin> ;ể ậ
<ki u t p tin> <bi n t p tin> ; ể ậ ế ậ
Ví d : FILE *f1,*f2 ; /* Khai báo 2 bi n file f1,f2 */ụ ế
typedef FILE *taptin ; /* Khai báo ki u file taptin */ể
taptin f1,f2; /* Khai báo 2 bi n file f1,f2 */ế
• Ki u t p tin g m 2 lo i : file văn b n và file nh phân (c u trúc)ể ậ ồ ạ ả ị ấ
• Ki u file văn b n là lo i ki u file mà d li u là m t văn b n g m nhi u dòng m i dòngể ả ạ ể ữ ệ ộ ả ồ ề ỗ
là m t chu i kí t . Đ c l u tr d i d ng mã Ascii do đó có th truy xu t đ c b ng b t kìộ ỗ ự ượ ư ữ ướ ạ ể ấ ượ ằ ấ
ph n m m văn b n nào.ầ ề ả
• Ki u file nh phân (còn g i là file có c u trúc ) là ki u file mà d li u bao g m nhi uể ị ọ ấ ể ữ ệ ồ ề

ph n t cùng ki u , đ c l u tr d i d ng mã nh phân .Do đó ch có th truy xu t b ng cácầ ử ể ượ ư ữ ướ ạ ị ỉ ể ấ ằ
hàm file .
2. CÁC B C X LÍ KI U FILE ƯỚ Ử Ể :
Đ x lý file b t bu c ph i tuân th các thao tác nh sau :ể ử ắ ộ ả ủ ư
• M file (ở fopen)
• X lí file g m các thao tác nh đ c (ử ồ ư ọ fread , fgetc), ghi (fwrite , fputc) ,ki m tra (ể feof , ferror
) , di chuy n con tr file (ể ỏ rewind , fseek , ftell) , làm s ch vùng đ m ( ạ ệ fflush ,fflushall) , xóa file
(unlink ).
• Đóng file (fclose , fcloseall) .
3. CÁC HÀM X LÍ FILEỬ :
a) Hàm m fileở :
<bi n file > =fopen ( <tên file> , <h ng ki u file > ) .ế ằ ể
M file và gán tên file cho bi n file , thông qua bi n file đáp ng các ch c năng truy xu t trênở ế ế ứ ứ ấ
file .
<tên file > : G m đ ng d n đĩa th m c và tên t p tin x lí .ồ ườ ẫ ổ ư ụ ậ ủ
<h ng ki u file >ằ ể : G m các giá tr sau :ồ ị
 “rt” : M t p tin ki u văn b n đ đ c , n u t p tin ch a có s có l i .ở ậ ể ả ể ọ ế ậ ư ẽ ỗ
 “wt” : M t p tin ki u văn b n m i đ ghi , n u t p tin đã t n t i s xóa cũ đở ậ ể ả ớ ể ế ậ ồ ạ ẽ ể
ghi n i dung m i .ộ ớ
 “at” : M t p tin ki u văn b n đã có đ ghi thêm n i dung vào , n u t p tinở ậ ể ả ể ộ ế ậ
ch a t n t i s t o t p tin m i đ ghi n i dung .ư ồ ạ ẽ ạ ậ ớ ể ộ
 “rb” : M t p tin ki u nh phân đ đ c , n u t p tin ch a t n t i s báo l i .ở ậ ể ị ể ọ ế ậ ư ồ ạ ẽ ỗ
 “wb” : M t p tin ki u nh phân m i đ ghi , n u t p tin đã t n t i s xóa cũở ậ ể ị ớ ể ế ậ ồ ạ ẽ
đ ghi n i dung m i .ể ộ ớ
 “ab” : M t p tin ki u nh phân đã có đ ghi thêm n i dung vào , n u t p tinở ậ ể ị ể ộ ế ậ
ch a t n t i s t o t p tin m i đ ghi n i dung .ư ồ ạ ẽ ạ ậ ớ ể ộ
 “r+t” : M t p tin ki u văn b n đ đ c/ghi n i dung , n u t p tin ch a t n t iở ậ ể ả ể ọ ộ ế ậ ư ồ ạ
s có l i .ẽ ỗ
TRANG 34
Cấu Truúc Dữ Liệu LVH

 “w+t” : M t p tin ki u văn b n đ đ c/ghi n i dung , n u t p tin đã t n t i sở ậ ể ả ể ọ ộ ế ậ ồ ạ ẽ
b xóa đ ghi m i .ị ể ớ
 “a+t” : M t p tin ki u văn b n đ đ c/ghi n i dung b sung , n u t p tin ch aở ậ ể ả ể ọ ộ ổ ế ậ ư
t n t i s đ c t o m i .ồ ạ ẽ ượ ạ ớ
 “r+b” : M t p tin ki u nh phân đ đ c/ghi n i dung , n u t p tin ch a t n t iở ậ ể ị ể ọ ộ ế ậ ư ồ ạ
s có l i .ẽ ỗ
 “w+b” : M t p tin ki u nh phân đ đ c/ghi n i dung , n u t p tin đã t n t iở ậ ể ị ể ọ ộ ế ậ ồ ạ
s b xóa đ ghi m i .ẽ ị ể ớ
 “a+b” : M t p tin ki u nh phân đ đ c/ghi n i dung b sung , n u t p tinở ậ ể ị ể ọ ộ ổ ế ậ
ch a t n t i s đ c t o m i .ư ồ ạ ẽ ượ ạ ớ
Ví d : FILE *f1,*f2 ; char tenfile1[30],tenfile2[30];ụ
Printf(“nhap ten file van ban : “); gets(tenfile1) ;
f1=fopen(tenfile1,”rt”) ;
Printf(“nhap ten file sinh vien : “); gets(tenfile2) ;
f1=fopen(tenfile2,”rb”) ;
b) Hàm ghi n i dung lên fileộ :
• Ghi n i dung lên file văn b n : ộ ả
fputc( <bi n kí t > , <bi n file>)ế ự ế
Ví d : FILE *f ; char c; ụ
f=fopen(“c:\vanban.txt”,”wt”) ; c=getchar(); fput(c,f );
• Ghi n i dung lên file nh phân :ộ ị
fwrite(&<bi n>, <kich thuoc bien> , <n> , <bi n file>)ế ế
&<bi n> : Là bi n tr ch đ n vùng nh ch a n i dung ghi vào file .ế ế ỏ ỉ ế ớ ứ ộ
<kich thuoc bien> : Là kích th c bi n ghi file .ướ ế
<n> : S c u trúc c n ghi .ố ấ ầ
 Hàm s tr v giá tr b ng s c u trúc th c s ghi đ c .ẽ ả ề ị ằ ố ấ ự ự ượ
Ví d : fwrite(&nv,sizeof(nv),1,f ) ; ụ
c) Hàm đ c n i dung vào fileọ ộ :
• Đ c n i dung t file văn b n ra bi n kí t : ọ ộ ừ ả ế ự
<bi n kí t > = fgetc( <bi n file>)ế ự ế

Ví d : FILE *f ; char c; ụ
f=fopen(“c:\vanban.txt”,”rt”) ; c=fgetc(f );
• Đ c n i dung t file nh phân ra bi n :ọ ộ ừ ị ế
fread(&<bi n>, <kich thuoc bien> , <n> , <bi n file>)ế ế
&<bi n> : Là bi n tr ch đ n vùng nh ch a n i dung đ c t file ế ế ỏ ỉ ế ớ ứ ộ ọ ừ
<kich thuoc bien> : Là kích th c bi n .ướ ế
<n> : S c u trúc c n đ c .ố ấ ầ ọ
 Hàm s tr v giá tr b ng s c u trúc th c s đ c đ c .ẽ ả ề ị ằ ố ấ ự ự ọ ượ
Ví d : fread(&nv,sizeof(nv),1,f ) ; ụ
d) Hàm làm s ch vùng đ mạ ệ : fflush(<bi n file>) ;ế
Làm s ch các vùng đ m c a t p tin ng v i biên file .Tr v giá tr 0 n u thành công .ạ ệ ủ ậ ứ ớ ả ề ị ế
e) Hàm làm s ch vùng đ m c a các t p tinạ ệ ủ ậ : fflushall() ;
Làm s ch các vùng đ m c a các t p tin đang m .Tr v giá tr b ng s t p tin đang m n u thànhạ ệ ủ ậ ở ả ề ị ằ ố ậ ở ế
công .
f) Hàm ki m tra l i fileể ỗ : ferror(<bi n file>) ;ế
Hàm ki m tra l i khi thao tác trên t p tin .Tr v giá tr 0 n u không có l i , ng c l i hàm tr giáể ỗ ậ ả ề ị ế ỗ ượ ạ ả
tr khác 0 .ị
g) Hàm ki m tra cu i fileể ố : feof(<bi n file>) ;ế
TRANG 35
Cấu Truúc Dữ Liệu LVH
Hàm ki m tra con tr file cu i file ch a .Tr v giá tr khác 0 n u cu i file , ng c l i hàm trể ỏ ở ố ư ả ề ị ế ố ượ ạ ả
giá tr b ng 0 .ị ằ
h) Hàm chuy n v trí tr fileể ị ỏ :
• Chuy n con tr v đ u fileể ỏ ề ầ : rewind (<bi n file>) ;ế
• Tr v v trí hi n t i c a con tr file :ả ề ị ệ ạ ủ ỏ ftell (<bi n file>) ;ế
• Chuy n con tr file đ n v trí c n thi t :ể ỏ ế ị ầ ế
fseek(<bi n file>,<so byte>,<vi tri xuat phat>)ế
- <so byte> : Ch đ nh s byte c n di chuy n .ỉ ị ố ầ ể
- <vi tri xuat phat> : Xác đ nh v trí mà vi c d ch chuy n b t đ u . Có các giá trị ị ệ ị ể ắ ầ ị
sau : SEEK_SET ( ho c 0) :Xu t phát di chy n xu ng t đ u file –ặ ấ ể ố ừ ầ

SEEK_CUR (ho c 1) :Xu t phát t v trí hi n t i c a con tr , đi xu ng cu iặ ấ ừ ị ệ ạ ủ ỏ ố ố
file n u <so byte> d ng , ng c l i đ u file n u <so byte> âm - SEEK_ENDế ươ ượ ạ ầ ế
(ho c 2) :Xu t phát t cu i file .ặ ấ ừ ố
i) Hàm đóng t p tinậ :
1. Hàm đóng t p tin đang m :ậ ở fclose (<bi n file>) ;ế
2. Hàm đóng t t c các t p tin đang m :ấ ả ậ ở fcloseall () ;
j) Hàm xóa t p tinậ : unlink(<tên file>) ;
Bài t p ậ :
Vi t ch ng trình qu n lí h s và l ng c a nhân viên . ế ươ ả ồ ơ ươ ủ
Thông tin yêu c u g m : ầ ồ
 Lý l ch nhân viên : ị
Mã nhân viên (8 ký t ) – Tên nhân viên (30 kí t ) – Tình tr ng gia đình ( 1 kí t D:đãự ự ạ ự
có gia đình, C:ch a có gia đình ) – S con ( nguyên <=20) – Trình đ văn hóa ( 2 kí t :ư ố ộ ự
C1:c p 1, C2:c p 2, C3:c p 3, DH:đ i h c, CH:cao h c) – L ng c b n (nguyênấ ấ ấ ạ ọ ọ ư ơ ơ ả
<=1000000)
 B ng ch m công_l ng: ả ấ ươ
Tháng (nguyên <20) – Năm ( nguyên <10000) – S ngày nghĩ có phép ( nguyênố
<28) – S ngày nghĩ không phép (nguyên <28) – S ngày làm thêm (nguyên <28) –ố ố
K t qu công vi c (2 kí t : T:T t, TB:Đ t , K:Kém) – L ng th c lãnh trong thángế ả ệ ự ố ạ ươ ự
(th c ).ự
Quy t c tính l ng nh sau:ắ ươ ư
L ng th c lãnh=L ng căn b n + Ph tr iươ ự ươ ả ụ ộ
Trong đó n u:ế
- S con >2 Ph tr i=+5% l ng c b nố ụ ộ ươ ơ ả
- Trình đ văn hóa =DH (CH) Ph tr i=+5%(10%) l ng c b nộ ụ ộ ươ ơ ả
- Làm thêm Ph tr i=+4% l ng c b n / ngàyụ ộ ươ ơ ả
- Nghĩ không phép Ph tr i=-5% l ng c b n / ngàyụ ộ ươ ơ ả
- S con >2 Ph tr i=5% l ng c b nố ụ ộ ươ ơ ả
Công vi c yêu c u :ệ ầ
- C p nh t lý l ch , b ng ch m công ( thêm, xóa , s a, tìm, in danh sách)ậ ậ ị ả ấ ữ

- Xem b ng l ng hàng tháng .ả ươ
T ch c c u trúc d li u phù h p – cài đ t ch ng trình theo yêu c u công vi c nh trên.ổ ứ ấ ữ ệ ợ ặ ươ ầ ệ ư
TRANG 36
Cấu Truúc Dữ Liệu LVH
Ch ng ươ 3
KI U CON TR (POINTER)Ể Ỏ
I. KHÁI NI M:Ệ
• Trong ch ng trình, khi khai báo m t bi n thu c m t ki u nào thì khi ch ng trình th cươ ộ ế ộ ộ ể ươ ự
thi, bi n đó s đ c c p phát m t vùng nh đ ch a giá tr cho bi n. Đ a ch và kích th c vùngế ẽ ượ ấ ộ ớ ể ứ ị ế ị ỉ ướ
nh tùy thu c vào ki u khai báo c a bi n. Đ a ch các ô nh này là duy nh t.ớ ộ ể ủ ế ị ỉ ớ ấ
• Các đ a ch c a ô nh là nh t đ nh, do đó chúng ta có th truy c p các d li u c a cácị ỉ ủ ớ ấ ị ể ậ ữ ệ ủ
bi n này thông qua vi c xác đ nh đ a ch các ô nh này. Ngôn ng l p trình cung c p chúng taế ệ ị ị ỉ ớ ữ ậ ấ
m t ki u d li u g i là ki u con tr , đó là ki u d li u ch a giá tr đ a ch ô nh c a bi n mà nóộ ể ữ ệ ọ ể ỏ ể ữ ệ ứ ị ị ỉ ớ ủ ế
ch đ n. ỉ ế
• Thông qua bi n con tr có th ti p c n đ c các giá tr c a bi n. ế ỏ ể ế ậ ượ ị ủ ế
• Khai báo : <Ki u t p tin> * <Tên bi n con tr >ể ậ ế ỏ ;
Ví d : int *xcontro ; /* Khai báo bi n xcontro đ tr đ n m t bi n nguyên */ụ ế ể ỏ ế ộ ế
float *ycontro ; /* Khai báo bi n ycontro đ tr đ n m t bi n th c */ế ể ỏ ế ộ ế ự
char *ccontro ; /* Khai báo bi n ccontro đ tr đ n kí t */ế ể ỏ ế ự
II. TRUY XU T V I BI N CON TR Ấ Ớ Ế Ỏ :
• Đ truy xu t giá tr c a m t bi n con tr ta s d ng phép toán m t ngôi * : ể ấ ị ủ ộ ế ỏ ử ụ ộ *<tên
bi n tr > ế ỏ .
Ví d : *xcontro , *ycontro …ụ
• Đ xác đ nh đ a ch c a m t bi n ta s d ng phép toán m t ngôi & : ể ị ị ỉ ủ ộ ế ử ụ ộ &<tên bi n>ế
Ví d : int x,y ; &x , &y , &xcontro , &ycontro …ụ
Ví d : int x, y ; int *px ;ụ
Phép gán : px=&x ; y=*px k t qu s gán giá tr c a bi n x cho bi n y ế ả ẽ ị ủ ế ế
T ng đ ng v i phép gán : y=x ;ươ ươ ớ
L nh px=&x ; y=*px +1 t ng đ ng v i y=x+1;ệ ươ ươ ớ
L nh px=&x ; *px=0 t ng đ ng l nh gán x=0 ;ệ ươ ươ ệ

Lênh *px+=1 ho c *px++ t ng đ ng x=x+1 ho c x++ặ ươ ươ ặ
• Ví d : ụ
#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
{
int a,b;
float c;
int *pa,*pb;
float *pc;
printf("chuong trinh minh hoa truy cap gia tri kieu con tro\n");
printf("nhap so nguyen a :"); scanf("%d",&a);
printf("nhap so nguyen b :"); scanf("%d",&b);
printf("nhap so thuc c :"); scanf("%f",&c);
printf("gia tri bien a=%d , dia chi bien a=%d \n",a,&a);
pa=&a;
printf("gia tri bien a=%d , dia chi bien a=%d \n",*pa,pa);
pb=&b;
TRANG 37
Cấu Truúc Dữ Liệu LVH
printf("gia tri bien b=%d , dia chi bien b=%d \n",*pb,pb);
pc=&c;
printf("gia tri bien c=%f , dia chi bien c=%d \n",*pc,pc);
*pc=*pa+*pb;
printf("gia tri bien c= a+b %f , dia chi bien c=%d \n",*pc,pc);
c=*pc;
printf("gia tri moi bien c=%f , dia chi bien c=%d \n",*pc,&c);
printf("gia tri moi bien c=%f \n",c);
getch();

}
III. BI N CON TR VÀ M NGẾ Ỏ Ả :
• Trong C các ph n t c a m ng có th đ c xác đ nh thông qua ch s m ng ho c conầ ử ủ ả ể ượ ị ỉ ố ả ặ
tr .ỏ
• Đ l y đ a ch m t ph n t c a m ng ta s d ng cú pháp : ể ấ ị ỉ ộ ầ ử ủ ả ử ụ &<bi n m ng>[ch s ]ế ả ỉ ố
Ví d :ụ float a[20] ;  phép toán &a[12] s cho đ a ch c a ph n t a[12] trong m ng.ẽ ị ỉ ủ ầ ử ả
• Khi khai báo m ng , trong ch ng trình tên m ng đ c xem là m t h ng đ a ch .ả ươ ả ượ ộ ằ ị ỉ
Ví d : khi khai báo float a[10] ; thì a s là h ng đ a ch ụ ẽ ằ ị ỉ
Trong C cú pháp : a t ng đ ng v i &a[0]ươ ươ ớ
a + i t ng đ ng v i &a[i]ươ ươ ớ
*(a + i) t ng đ ng v i a[i]ươ ươ ớ
• Khai báo : float a[20] , *tro ;
- Phép gán : tro=&a[k] ; thì tro +i s tr đ n ph n t th a[k+i]ẽ ỏ ế ầ ử ứ
- khi gán : tro=a thì các cách vi t sau có giá tr nh nhau : ế ị ư
a[i] <-> *(a +i) <-> p[i] <-> *(p+i)
• Ví d : S d ng ki u con tr nh p vào m t dãy – in dãy và tính t ng các ph n t .ụ ử ụ ể ỏ ậ ộ ổ ầ ử
#include <stdio.h>
#include <conio.h>
main()
{
float a[20],tong,*tro;
int i,n;
tro=a;
printf("nhap so phan tu day :");scanf("%d",&n);
for (i=1 ;i<=n;i++)
{printf("nhap phan tu a[%d]=",i);
scanf("%f",&tro[i]); } /* co the viet scanf(“%f”,tro + i ) ; */
printf("Day da nhap :");
for (i=1 ;i<=n;i++)
printf("%6.2f",tro[i]); /* co the viet printf(“%6.2f”,*(tro + i )); */

printf("\n");
tong=0;
for (i=1 ;i<=n;i++)
tong=tong+tro[i]; /* co the viet tong=tong + *(tro + i ) ; */
printf("tong cac phan tu Day da nhap :%6.2f",tong);
getch();
}
TRANG 38
Cấu Truúc Dữ Liệu LVH
IV. BI N CON TR VÀ M U TINẾ Ỏ Ẫ :
• Tr ng h p s d ng bi n con tr là c u trúc thì vi c truy xu t m t thành ph n trongườ ợ ử ụ ế ỏ ấ ệ ấ ộ ầ
c u trúc không s d ng cú pháp : <tên bi n>. <tên thành ph n> nh tr c mà ph i s d ng d uấ ử ụ ế ầ ư ướ ả ử ụ ấ
mũi tên (k t h p d u –(tr ) và >(l n)) thay th d u ch m (.) , v i cú pháp truy xu t nh sau : ế ợ ấ ừ ớ ế ấ ấ ớ ấ ư
<tên bi n tr > -> <tên thành ph n>ế ỏ ầ .
• Ví d : struct sinhvienụ
{ char hoten[30];
int tuoi ;
float hocbong; } ;
sinhvien a;
sinhvien *tro;
Trong tr ng h p này mu n truy xu t các thành ph n c a bi n a ta s d ng cú pháp :ườ ợ ố ấ ầ ủ ế ử ụ
a.hoten ; a.tuoi ; a.hocbong .
Đ truy xu t các thành ph n c a bi n tr ta s d ng cú pháp :ể ấ ầ ủ ế ỏ ử ụ
tro->hoten ; tro->tuoi ; tro->hocbong .
V. KH I T O VÀ GI I PHÓNG BI N CON TRỞ Ạ Ả Ế Ỏ :
1. KH I T OỞ Ạ : <Bi n tr > = new <Tên ki u bi n tr ch đ n >ế ỏ ể ế ỏ ỉ ế
Cho phép kh i t o m t vùng nh cho <bi n tr > có kích th c theo kích th c c a ki u d li uở ạ ộ ớ ế ỏ ướ ướ ủ ể ữ ệ
mà con tr ch đ n. ỏ ỉ ế
2. GIAI PHÓNG VÙNG NHỚ : delete <Bi n tr > ế ỏ
Cho phép xóa b vùng nh c a <bi n tr > đã đ c kh i t o tr c đó b ng new . ỏ ớ ủ ế ỏ ượ ở ạ ướ ằ

VI. VÍ D : Ụ
TRANG 39
Cấu Truúc Dữ Liệu LVH
Ch ng 4 ươ
DANH SÁCH- DANH SÁCH Đ CẶ
I. DANH SÁCH :
1. KHÁI NI MỆ :
 Danh sách là m t t p h p g m nhi u ph n t a1, a2, a3, …., an có quan h v iộ ậ ợ ồ ề ầ ử ệ ớ
nhau, nghĩa là n u bi t ph n t ai thì có th xác đ nh đ c ph n t a i+1 ế ế ầ ử ể ị ượ ầ ử
 M t danh sách th ng đ c bi u di n : a1, a2 , a3 ,……., an V i n là sộ ườ ượ ể ễ ớ ố
nguyên >=1 . n g i là chi u dài c a danh sách . n=0 thì g i là danh sách r ng.ọ ề ủ ọ ỗ
 Trong th c t danh sách là thông tin đáp ng yêu c u qu n lí bao g m nh ngự ế ứ ầ ả ồ ữ
công vi c liên quan đ n danh sách nh : thêm – xóa – tìm – duy t ….Ch ng h n :ệ ế ư ệ ẳ ạ
Danh sách ch a thông tin h s sinh viên , danh sách nhân viên , danh sách thông tinứ ồ ơ
các đ u sách trong th vi n , Danh sách các hóa đ n ch ng t …v…v….ầ ư ệ ơ ứ ừ
 Danh sách đ c t ch c l u tr và x lý trên máy tính thông qua vi c t ch cượ ổ ứ ư ữ ử ệ ổ ứ
các c u trúc d li u trên c s các ki u có c u trúc (dãy – c u trúc – con tr …) . Khiấ ữ ệ ơ ở ể ấ ấ ỏ
l u tr trong b nh , m i ph n t c a danh sách s đ c l u tr t i m i v trí ( đ aư ữ ộ ớ ỗ ầ ử ủ ẽ ượ ư ữ ạ ỗ ị ị
ch ) khác nhau.ỉ
2. PHÂN LO I DANH SÁCHẠ :
 Danh sách t ch c l u tr và x lý trên máy đ c phân làm 2 lo i : Danh sách đ c vàổ ứ ư ữ ử ượ ạ ặ
danh sách liên k t.ế
 Danh sách đ c đ c t ch c d a trên c s ki u dãy , các ph n t đ c s p x p trongặ ượ ổ ứ ự ơ ở ể ầ ử ượ ắ ế
các ô nh liên t c k ti p nhau . Đ truy c p m t ph n t ta d a vào v trí th t .ớ ụ ế ế ể ậ ộ ầ ử ự ị ứ ự
 Danh sách liên k t đ c t ch c d a trên c s ki u con tr , các ph n t liên k t v iế ượ ổ ứ ự ơ ở ể ỏ ầ ử ế ớ
nhau thông qua vi c l u gi đ a ch c a nhau , nghĩa là ph n t sau s l u tr đ a chệ ư ữ ị ỉ ủ ầ ử ẽ ư ữ ị ỉ
ph n t tr c , thông qua đ a ch này có th truy c p b t kỳ ph n t nào trên danhầ ử ướ ị ỉ ể ậ ấ ầ ử
sách.
3. CÁC PHÉP TOÁN TRÊN DANH SÁCH :
Bao g m các phép toán đáp ng yêu c u l u tr và x lý thông tin trên danh sách t ng ngồ ứ ầ ư ữ ử ươ ứ

v i ch c năng qu n lí th c t . Bao g m các phép toán nh : Tìm ki m – thêm – xóa – hi uớ ứ ả ự ế ồ ư ế ệ
ch nh – tách – ghép – sao chép – duy t in danh sách , s p th t ….ỉ ệ ắ ứ ự
II. DANH SÁCH Đ CẶ :
1. KHÁI NI MỆ :
 Danh sách đ c là danh sách mà các ph n t đ c s p x p liên t c k ti p nhauặ ầ ử ượ ắ ế ụ ế ế
trong b nh . ộ ớ
 Danh sách đ c đ c t ch c d a trên ki u d li u c s là ki u dãy c u trúc .ặ ượ ổ ứ ự ể ữ ệ ơ ở ể ấ
 C u trúc d li u đ c khai báo nh sau :ấ ữ ệ ượ ư
struct data
{
int key; ( khóa)
<Ki u> info… ; (các thành ph n thông tin)ể ầ
}
typedef data list[n] ;
TRANG 40
Cấu Truúc Dữ Liệu LVH
list a;
int i,n ;
Khai báo bi n danh sách a có n ph n t , m i ph n t a[i] có các thành ph n thôngế ầ ử ỗ ầ ử ầ
tin a[i].key th hi n khóa chính , a[i].info các thông tin mô t .ể ệ ả
 Ví d : struct sinhvienụ
{ char hoten[30];
int tuoi;
float hocbong;
}
typedef sinhvien danhsach_sv [50];
danhsach_sv a;
int i,n ;
Khai báo danh sách sinh viên v i bi n a có n ph n t sinh viên , trong đó m i ph n t a[i]ớ ế ầ ử ỗ ầ ử
có các thành ph n thông tin a[i].hoten , a[i].tuoi, a[i].hocbong th hi n các thông tin môầ ể ệ

t .ả
2. CÁC PHÉP TOÁN TRÊN DANH SÁCH Đ CẶ :
a) Thêm vào m t ph n tộ ầ ử :
Tùy theo yêu c u có th thêm ph n t vào đ u, cu i ho c vào m t v trí b t kì trên danhầ ể ầ ử ầ ố ặ ộ ị ấ
sách . Khi thêm vào s ph n t danh sách tăng thêm 1, có th làm thay đ i v trí các ph nố ầ ử ể ổ ị ầ
t khác trong danh sách .ử
 Thêm vào đ uầ :
Void them_dau(list a, int* n, data pt_them)
{
int i;
for (i=*n; i>=1; i ) a[i+1]=a[i] ;
a[1]=pt_them;
*n=*n+1;
}
 Thêm vào cu iố :
Void them_cuoi(list a,int *n, data pt_them)
{
a[*n+1]=pt_them;
* n=*n+1;
}
b) Tìm ki m m t ph n tế ộ ầ ử :
D a vào m t thông tin nào đó (th ng là mã khóa) đ tìm ki m . B ng cách l n l tự ộ ườ ể ế ằ ầ ượ
duy t qua các ph n t và so sánh giá tr tìm cho đ n khi tìm th y , Hàm tìm ki m s trệ ầ ử ị ế ấ ế ẽ ả
v v trí ph n t c n tìm n u tìm th y và d ng vi c tìm ki m ề ị ầ ử ầ ế ấ ừ ệ ế
int tim_pt(list a, int n, data pt_tim)
{
int i ;
i=1;
while (i<=n && a[i].key !=pt_tim.key )
i=i+1 ;

if (i>n) return(0);
TRANG 41
Cấu Truúc Dữ Liệu LVH
else return(i) ;
}
c) Lo i b m t ph n tạ ỏ ộ ầ ử :
Th c hi n tìm ph n t c n xóa , n u tìm th y xóa b ng cách lùi các ph n t đ ng sauự ệ ầ ử ầ ế ấ ằ ầ ử ứ
nó v tr c m t v trí và gi m s ph n t dãy xu ng 1.ề ướ ộ ị ả ố ầ ử ố
void xoa_pt(list a, int *n, data pt_xoa)
{
int i,j ;
i=tim_pt(a,*n, pt_xoa);
if (i!=0)
{ for (j=i;j<=*n;j++) a[j]=a[j+1];
*n=*n-1 ; printf("Da xoa xong\n");
} else printf ("khong tim thay phan tu can xoa \n");
}
d) Hi u ch nh m t ph n tệ ỉ ộ ầ ử :
Th c hi n tìm ph n t c n hi u ch nh , n u tìm th y d ng l i hi u ch nh t ng thànhự ệ ầ ử ầ ệ ỉ ế ấ ừ ạ ệ ỉ ừ
ph n theo yêu c u.ầ ầ
void hieuchinh_pt(list a, int *n, data pt_hieuchinh)
{
int i,j ;
i=tim_pt(a,*n, pt_hieuchinh);
if (i=0) printf(“khong co phan tu can hieu chinh \n”);
else { printf (“da tim thay phan tu can hieu chinh-lan luot hieu chinh\n”);
printf(“Nhap khoa moi :”);
scanf(“%d”,a[i].key);
printf(“Nhap thong tin moi :”);
scanf(“% ”,a[i].info);

}
}
e) S p x p danh sáchắ ế :
 Vi c s p th t đ c th c hi n theo 3 nhóm ph ng pháp nh sauệ ắ ứ ự ượ ự ệ ươ ư
: Xen vào , ch n l a , đ i ch . M i nhóm có nhi u gi i thu t khác nhau . đây taọ ự ổ ổ ỗ ề ả ậ Ở
ch xét tiêu bi u 2 gi i thu t BUBBLE SORT và QUICK SORT trong ph ng phápỉ ể ả ậ ươ
đ i ch . ổ ổ
 S d ng nguyên t c đ i ch gi a các ph n t , nghĩa là l n l t soử ụ ắ ổ ổ ữ ầ ử ầ ượ
sánh theo khóa c n s p x p gi a 2 ph n t k ti p nhau và đ i ch gi a chúng v iầ ắ ế ữ ầ ử ế ế ổ ỗ ữ ớ
nhau khi ch a th a đi u ki n s p x p . Quá trình đ c th c hi n nhi u l n cho đ nư ỏ ề ệ ắ ế ượ ự ệ ề ầ ế
khi dãy đ c s p x p hoàn toàn .ượ ắ ế
 Gi i thu t Bubble Sort th c hi n theo qui t c l n l t đ i chả ậ ự ệ ắ ầ ượ ổ ổ
gi a 2 ph n t k ti p nhau a[i] và a[i+1] khi ch a th a đi u ki n s p x p, quá trìnhữ ầ ử ế ế ư ỏ ề ệ ắ ế
này s đ c th c hi n nhi u l n cho đ n khi danh sách đ c s p x p hoàn toàn,ẽ ượ ự ệ ề ầ ế ượ ắ ế
gi i thu t nh sau:ả ậ ư
void bubble_sort(list a, int n )
{
TRANG 42
Cấu Truúc Dữ Liệu LVH
int i,j; data tam ;
for (i=1;i<=n-1;i++)
for (j=1;j<=n-i;j++)
if (a[j]>a[j+1])
{ tam=a[j];
a[j]=a[j+1];
a[j+1]=tam ;}
printf("Da sap xep xong\n");
}
f) Duy t (in) danh sáchệ :
L n l t duy t qua các ph n t và xu t thông tin k t qu .ầ ượ ệ ầ ử ấ ế ả

void xuat_ds(list a ,int n)
{
int i ;
for (i=1; i<=n ;i++) printf("%d",a[i]);
printf("\n");
}
g) Chuy n t danh sách sang t p tin:ể ừ ậ
L n l t duy t qua danh sách và chuy n t ng ph n t t danh sách vào fileầ ượ ệ ể ừ ầ ử ừ
void list_file(list a ,int n)
{
Char tenfile[30];
File *f ;
int i ;
printf(“nhap tên tap tin can luu :”);
gets(tenfile);
f=fopen(tenfile,”wb”);
for (i=1; i<=n ;i++) fwrire(&a[i],sizeof(a[i]),1,f);
fclose(f);
}
h) Chuy n t t p tin vào danh sách:ể ừ ậ
L n l t duy t qua các ph n t trong file và chuy n t ng ph n t vào danh sách thôngầ ượ ệ ầ ử ể ừ ầ ử
qua vi c s d ng hàm thêm ph n t .ệ ử ụ ầ ử
void file_list(list a ,int* n)
{
Char tenfile[30];
File *f ;
Data p_tu;
int i ;
printf(“nhap tên tap tin can doc :”);
gets(tenfile);

f=fopen(tenfile,”rb”);
while ( fread(p_tu,sizeof(p_tu),1,f)==1)
them_cuoi(a,n,p_tu) ;
fclose(f);
}
TRANG 43
Cấu Truúc Dữ Liệu LVH
3. VÍ D :Ụ
TRANG 44
Cấu Truúc Dữ Liệu LVH
Ch ng ươ 5
DANH SÁCH LIÊN K TẾ
1. KHÁI NI MỆ :
 Danh sách liên k t là danh sách mà các ph n t đ c n i k t v i nhau nh vàoế ầ ử ượ ố ế ớ ờ
vùng liên k t c a chúng , vùng liên k t đ c t ch c là m t ki u con tr đ ch a đ aế ủ ế ượ ổ ứ ộ ể ỏ ể ư ị
ch c a ph n t .ỉ ủ ầ ử
 V i danh sách đ c s ph n t đ c c p phát vùng nh c đ nh theo khai báo,ớ ặ ố ầ ử ượ ấ ớ ố ị
do đó có th d n đ n vi c thi u ho c th a. Danh sách liên k t gi i quy t đ c v n để ẫ ế ệ ế ặ ừ ế ả ế ượ ấ ề
h n ch này c a danh sách đ c, nghĩa là s ph n t khi c n s đ c c p phát vùngạ ế ủ ặ ố ầ ử ầ ẽ ượ ấ
nh và khi không còn s d ng có th xóa b đ vùng nh này có th đáp ng cho yêuớ ử ụ ể ỏ ể ớ ể ứ
c u khác.ầ
 Có nhi u ki u t ch c liên k t gi a các ph n t trong danh sách nh :ề ể ổ ứ ế ữ ầ ử ư
• Danh sách liên k t đ n: M i ph n t liên k t v i ph nế ơ ỗ ầ ử ế ớ ầ
t đ ng sau nó trong danh sách .ử ứ
• Danh sách liên k t kép : ế M i ph n t liên k t v i ph nỗ ầ ử ế ớ ầ
t đ ng tr c và sau nó trong danh sách .ử ứ ướ
• Danh sách liên k t vòng : ế Ph n t cu i c a danh sách sầ ử ố ủ ẽ
liên k t v i ph n t đ u trong danh sách .ế ớ ầ ử ầ
 Danh sách liên k t đ c t ch c là danh sách các c u trúc, các c u trúc đ cế ượ ổ ứ ấ ấ ượ
liên k t v i nhau qua vùng liên k t bên trong c u trúc, c th vùng liên k t c a ph nế ớ ế ấ ụ ể ế ủ ầ

t th nh t s ch a đ a ch c a ph n t th hai, vùng liên k t c a ph n t th hai sử ứ ấ ẽ ứ ị ỉ ủ ầ ử ứ ế ủ ầ ử ứ ẽ
ch a đ a ch ph n t th ba và ti p t c nh v y ….và vùng liên k t c a ph n t cu iứ ị ỉ ầ ử ứ ế ụ ư ậ ế ủ ầ ử ố
cùng s ch a giá tr null.ẽ ứ ị
 Danh sách phù h p v i các phép thêm vào lo i b , ghép danh sách .ợ ớ ạ ỏ
 C u trúc d li u đ c khai báo nh sau :ấ ữ ệ ượ ư
M t ph n t c a danh sách liên k t bao g m 2 thành ph n :ộ ầ ử ủ ế ồ ầ
+ Thành ph n d li u :L u tr thông tin ph n t .ầ ữ ệ ư ữ ầ ử
+ thành ph n liên k t :L u tr đ a ch c a ph n t k ti p trong danh sách . ầ ế ư ữ ị ỉ ủ ầ ử ế ế
+ Bi n ch đi m đ u ế ỉ ể ầ first thu c ki u con tr ch a đ a ch ph n t đ u c a danh sách. ộ ể ỏ ứ ị ỉ ầ ử ầ ủ
typedef struct data
{
<CácKi u> nameinfo… ; (các thành ph n thông tin)ể ầ
};
typedef struct list
{
data info;
struct list *link; //Con tr ch đ n c u trúc elementỏ ỉ ế ấ
};
typedef list *pointer;
pointer first;
Khai báo bi n con tr first tr đ n danh sách liên k t ch a đ a ch là đ a ch c aế ỏ ỏ ế ế ứ ị ỉ ị ỉ ủ
ph n t đ u tiên c a danh sách. Đ u tiên danh sách r ng giá tr c a first là r ngầ ử ầ ủ ầ ỗ ị ủ ỗ
(NULL) .
TRANG 45
Cấu Truúc Dữ Liệu LVH
 Ví d : struct sinhvienụ
{ char hoten[30];
int tuoi;
float hocbong;
}

typedef struct dssv
{
Sinhvien ttin;
Struct dssv *list;
}
Dssv *sv;

2. CÁC PHÉP TOÁN TRÊN DANH SÁCH LIÊN K T :Ế
a) Kh i t o danh sáchở ạ :
Đ u tiên danh sách r ng , gán đ a ch ph n t first=NULL . Gi i thu t nh sau:ầ ỗ ị ỉ ầ ử ả ậ ư
Void khoitao_ds(pointer *first) ;
{
*First=NULL ;
}
b) Thêm vào m t ph n tộ ầ ử :
 Thêm vào đ u danh sách:ầ
Ph n t p đ c thêm vào đ u danh sách , ta cho vùng liên k t c a p ch vào first ( p-ầ ử ượ ầ ế ủ ỉ
>link=first ) . Sau đó thay first b ng p ( first=p) . Gi i thu t nh sau:ằ ả ậ ư
void insert_first(pointer *first, data ptu_them )
{ pointer p; p
p=new list ;
p->info=ptu_them; first
p->link=*first;
*first=p;
}

 Thêm vào cu i danh sách: ố NULL
Ph n t p đ c thêm vào cu i danh sách , ta cho vùng liên k t c a ph n t cu i trongầ ử ượ ố ế ủ ầ ử ố
danh sách ch vào p . Sau đó gán p->link=NULL . Gi i thu t nh sau:ỉ ả ậ ư
void insert_last(pointer *first, data ptu_them)

{
point p,n;
n=new dssv;
n->info=ptu_them;
p=*first; first
if (p==NULL)
{ n->link=*first;
*first=n;
}
Else p
TRANG 46
Cấu Truúc Dữ Liệu LVH
{
while (p->link !=NULL) NULL
p=p->link;
n->link=p->link;
p->link=n;
}
}
c) Tìm ki m ph n t trên danh sáchế ầ ử :
Gi s c n tìm ph n t theo m t khóa (key) nào đó, vi c tìm ki m s l n l t duy tả ử ầ ầ ử ộ ệ ế ẽ ầ ượ ệ
qua các ph n t trên danh sách và so sánh v i giá tr tìm. Hàm tìm ki m s tr v đ a chầ ử ớ ị ế ẽ ả ề ị ỉ
c a ph n t c n tìm n u tìm th y , ho c tr v tr NULL n u không tìm th y.ủ ầ ử ầ ế ấ ặ ả ề ị ế ấ
Gi i thu t hàm tìm ki m nh sau :ả ậ ế ư
point search(point first, data ptu_tim)
{
point p;
p=first;
while (p!=NULL && strcmp(p->info.key,ptu_tim.key)!=0)
p=p->link;

return p;
}
d) Lo i b ph n t kh i danh sáchạ ỏ ầ ử ỏ :
Có th có nhi u cách lo i b m t ph n t , đây ta xét 2 tr ng h p : lo i b ph n tể ề ạ ỏ ộ ầ ử ở ườ ợ ạ ỏ ầ ử
đ u và lo i b ph n t b t kỳ .ầ ạ ỏ ầ ử ấ
 Lo i b ph n t đ u trong danh sáchạ ỏ ầ ử ầ :
Đ lo i b ph n t đ u ta gán ph n t đ u cho bi n p nào đó (p=first), gán first b ngể ạ ỏ ầ ử ầ ầ ử ầ ế ằ
ph n t k sau ( first= p->link), sau đó xóa ph n t p đi.ầ ử ế ầ ử
Gi i thu t nh sau :ả ậ ư
void delete_first(point *first)
{
point p;
if (*first!=NULL)
{
p=*first;
*first=p->link;
delete p;
}
}
 Lo i b ph n t b t kỳ trong danh sách ạ ỏ ầ ử ấ :
Ta th c hi n vi c tìm ki m ph n t c n xóa, n u tìm th y xóa ph n t đó b ng cáchự ệ ệ ế ầ ử ầ ế ấ ầ ử ằ
cho vùng liên k t c a ph n t đ ng tr c ch đ ph n t đ ng sau ph n t c n xóa,ế ủ ầ ử ứ ướ ỉ ế ầ ử ứ ầ ử ầ
sau đó xóa ph n t .ầ ử
Gi i thu t nh sau :ả ậ ư
void delete_element(point *first,data ptu_xoa)
{
point p,q;
p=*first;
if (p->link==NULL) /* Tr ng h p ph n t c n xóa là ph n t đ u */ườ ợ ầ ử ầ ầ ử ầ
{ delete p;

TRANG 47
Cấu Truúc Dữ Liệu LVH
*first=NULL;
}
else
{ /* Tr ng h p ph n t c n xóa v trí khác ph n t đ u */ườ ợ ầ ử ầ ở ị ầ ử ầ
while (p!=NULL)
{ q=p;
p=p->link;
if (strcmp(p->info.hoten,x.hoten)==0) break;
}
if (p!=NULL)
{
q->link=p->link;
delete p;
}
}
}
e) S p x p danh sáchắ ế :
D a trên m t khóa nào đó đ s p x p, ta s d ng ph ng pháp đ i ch gi a các ph nự ộ ể ắ ế ử ụ ươ ổ ổ ữ ầ
t . Dùng 2 con tr p và q đ u tiên cho p tr vào ph n t đ u , q tr vào ph n t k sau,ử ỏ ầ ỏ ầ ử ầ ỏ ầ ử ế
so sánh p và q theo khóa và đ i ch gi a chúng cho nhau khi ch a th a đi u ki n s pổ ổ ữ ư ỏ ề ệ ắ
x p, sau đó tăng bi n tr q đ n ph n t k ti p, ti p t c so sánh v i p và đ i ch khiế ế ỏ ế ầ ử ế ế ế ụ ớ ổ ổ
ch a th a, quá trình này ti p t c cho đ n khi q duy t đ n ph n t cu i cùng, ti p t cư ỏ ế ụ ế ệ ế ầ ử ố ế ụ
tăng con tr p lên ph n t k sau, quá trình ti p t c t ng t v i q, cho đ n khi danhỏ ầ ử ế ế ụ ươ ự ớ ế
sách đ c s p x p hoàn toàn.ượ ắ ế
Gi i thu t nh sau :ả ậ ư
void sort_list(point *first)
{
point p,q;

data tam;
p=*first;
while (p->link!=NULL)
{
q=p->link;
while (q!=NULL)
{
if (q->info.key>p->info.key)
{
tam=p->info;
p->info=q->info;
q->info=tam;
}
q=q->link;
}
p=p->link;
}
}
f) Duy t (in) danh sáchệ :
TRANG 48
Cấu Truúc Dữ Liệu LVH
L n l t duy t qua các ph n t trong danh sách và xu t thông tin theo yêu c u cho đ nầ ượ ệ ầ ử ấ ầ ế
khi k t thúc danh sách.ế
Gi i thu t nh sau :ả ậ ư
void print_list(point first)
{ point p;
p=first;
printf(" KEY1 KEY 2 KEY3 …………………. \n");
if (p==NULL) printf("DANH SACH RONG");
else { while (p!=NULL)

{ printf(……………………………………………………………);
p=p->link;
}
}
}
g) Chuy n t danh sách vào fileể ừ :
Ch c năng này đáp ng vi c l u tr d li u trên đĩa sau khi x lý xong .ứ ứ ệ ư ữ ữ ệ ử
Gi i thu t nh sau :ả ậ ư
void list_file(point first,char tenf[30])
{
FILE *f ; data x; point p;
f=fopen(tenf,"wb");
p=first;
while (p!=NULL)
{
x=p->info;
fwrite(&x,sizeof(x),1,f);
p=p->link;
}
fclose(f);
}
h) Chuy n t file vào danh sáchể ừ :
Ch c năng này đáp ng vi c đ a d li u l u tr t file trên đĩa ra danh sách đ x lý .ứ ứ ệ ư ữ ệ ư ữ ừ ể ử
Gi i thu t nh sau :ả ậ ư
void file_list(point *first,char tenf[30])
{
FILE *f ; data x;
f=fopen(tenf,"rb");
while (fread(&x,sizeof(x),1,f)==1)
{

them_cuoi(&*first,x);
}
fclose(f);
}
3. VÍ D : Ụ Ch ng trình qu n lý sinh viên b ng danh sách liên k t .ươ ả ằ ế
#include <stdio.h>
#include <conio.h>
#include <string.h>
typedef struct sinhvien
TRANG 49
Cấu Truúc Dữ Liệu LVH
{ char hoten[40];
int tuoi;
float hocbong;
};
typedef struct dssv
{ sinhvien info;
struct dssv *link;
} ;
typedef dssv *point;
typedef FILE *taptin;
point first;
char tenf[30];
void them_dau(point *first ,sinhvien
x);
void them_cuoi(point *first, sinhvien
x);
point search(point first, sinhvien x);
void xoa_ptu(point *first,sinhvien x);
void xoa_ptu_dau(point *first);

void in_dssv(point first);
void sapxep_dssv(point *first);
void dssv_file(point first, char
tenf[30]);
void file_dssv(point *first,char
tenf[30]);
void them_dau(point *first ,sinhvien x)
{ point p;
p=new dssv;
p->info=x;
p->link=*first;
*first=p;
}
void them_cuoi(point *first,sinhvien x)
{
point p,n;
n=new dssv;
n->info=x;
p=*first;
if (p==NULL)
{ n->link=*first;
*first=n;
}
else
{
while (p->link !=NULL)
p=p->link;
n->link=p->link;
p->link=n;
}

}
point search(point first, sinhvien x)
{
point p;
p=first;
while (p!=NULL &&
strcmp(p->info.hoten,x.hoten)!=0)
p=p->link;
return p;
}
void xoa_ptu(point *first,sinhvien x)
{
point p,q;
p=*first;
if (p->link==NULL)
{ delete p;
*first=NULL;
}
else
{
while (p!=NULL)
{ q=p;
p=p->link;
if (strcmp(p-
>info.hoten,x.hoten)==0)break;
}
if (p!=NULL)
{
q->link=p->link;
delete p;

}
}
}
void xoa_ptu_dau(point *first)
{
point p;
if (first!=NULL)
{
p=*first;
*first=p->link;
delete p;
}
}
void in_dssv(point first)
{ point p;
p=first;
printf(" HO TEN TUOI
HOC BONG \n");
TRANG 50

×