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 ấ
04.294967295
4
char
Kí t A ự Z ,
az ,
09 , .,’”{]+*
…
-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