You are on page 1of 15

Khai bo v s dng danh sch lin kt trong Pascal 1.

Danh sch lin kt n Danh sch l mt dy hu hn cc phn t thuc cng mt lp i tng no . V d : danh sch sinh vin, danh sch vt t, danh sch cc ho n, danh sch cc s thc. Trong cc bi trc ta dng mng biu th mt danh sch. Cch ny c cc nhc im: kch thc ca mng phi nh trc nn tn b nh (s phn t thc t dng nhiu khi rt t so vi khai bo), khi thm mt phn t vo mng hoc xo mt phn t ra khi mng ta phi mt nhiu thi gian dn mng. Danh sch lin kt dng ci t mt danh sch s khc phc c cc nhc im trn ca mng. Danh sch lin kt thun gm nhiu phn t nm khng lin tc trong Heap. Cu to ca danh sch lin kt thun: c mt con tr first cha a ch ca phn t u tin ca danh sch, phn t u c phn d liu v mt con tr next cha a ch ca phn t th hai, tng qut phn t th i c phn d liu v mt con tr next cha a ch ca phn t th i+1, i vi phn t cui cng gi tr ca con tr next bng NIL. thun tin khi thm phn t mi vo cui danh sch lin kt ta dng mt con tr last cha a ch ca phn t cui cng. Khi to mt danh sch rng first = NIL

Chng trnh Dslk.pas minh ho cc cch lm vic vi danh sch lin kt thun. Phn d liu ca mt phn t l cc thng tin v mt sinh vin. USES crt; TYPE SVienPtr = ^SVien; SVien = RECORD maso: STRING[6]; hoten: STRING[23]; dtb: REAL; next: SVienPtr END; VAR first, last: SVienPtr; chon: BYTE; traloi: CHAR;

PROCEDURE Bosung; VAR p: SVienPtr; ans: INTEGER; BEGIN WHILE TRUE DO BEGIN new(p); WITH p^ DO BEGIN write('Ma sinh vien : '); readln(maso); write('Ho va ten : '); readln(Hoten); write('Diem trung binh: '); readln(dtb); END; p^.next:=NIL; IF first=NIL THEN BEGIN first:= p; last:= p END ELSE BEGIN last^.next:= p; last:= p END; write('Co tiep tuc khong 1/0 ? '); readln(ans); IF ans=0 THEN break; END; END; PROCEDURE DuyetXuoi; VAR p: SVienPtr; BEGIN IF first = NIL THEN BEGIN writeln('D.sach rong'); exit END; p := first; WHILE p <> NIL DO

BEGIN WITH p^ DO writeln(maso:5,' ',Hoten:25,' ',dtb:5:2); p := p^.Next; END; END; PROCEDURE ChenSau; VAR q,p: SVienPtr; found: BOOLEAN; masv: STRING[6]; BEGIN IF first <> NIL THEN BEGIN write('Ma so SV can tim de chen : '); readln(masv); p:= first; found:= FALSE; WHILE (p<>NIL) AND (NOT found) DO IF p^.maso=masv THEN found := TRUE ELSE p:=p^.next; IF found THEN BEGIN new(q); WITH q^ DO BEGIN write(' Ma so : '); readln(maso); write(' Ho ten : '); readln(Hoten); write(' Diem trung binh : '); readln(dtb); END; q^.next:= p^.next; p^.next:= q; END ELSE BEGIN write('Khong tim thay'); readln END; END; END; PROCEDURE TimXoa;

VAR masv: STRING[6]; found: BOOLEAN; p,q: SVienPtr; BEGIN write('Ma so SV can loai khoi danh sach : '); readln(masv); p:= first; IF p<>NIL THEN BEGIN found:= FALSE; WHILE (p<>NIL) AND (NOT found) DO IF p^.maso=masv THEN found := TRUE ELSE BEGIN q:=p; p:=p^.next END; IF found THEN BEGIN IF p=first THEN first :=p^.next ELSE q^.next:=p^.next; IF p^.next=NIL THEN last:=q; dispose(p) END ELSE BEGIN write('Khong tim thay'); readln END; END; END; BEGIN clrscr; First := NIL; REPEAT writeln; writeln('1. Bo sung mot sinh vien'); writeln('2. Duyet danh sach sinh vien');

writeln('3. Tim kiem mot phan tu va chen vao sau'); writeln('4. Tim kiem mot phan tu va xoa'); writeln('5. Ket thuc chuong trinh'); writeln; write('Chon chuc nang: '); readln(chon); writeln; CASE chon OF 1: Bosung; 2: DuyetXuoi; 3: ChenSau; 4: TimXoa; END; UNTIL chon=5; WHILE first<>NIL DO BEGIN last:= first; first:= first^.next; dispose(last) END; END. 2. Danh sch lin kt kp Danh sch lin kt kp l danh sch m mi phn t ca n gm ba thnh phn: phn d liu, con tr next cha a ch phn t tip sau, con tr prev cha a ch ca phn t lin trc, con tr next ca phn t cui cng trong danh sch bng NIL, con tr prev ca phn t u tin cng bng NIL. Danh sch lin kt kp hon ton xc nh bi hai con tr: con tr firstcha a ch phn t u tin, con tr last cha a ch phn t cui cng. Danh sch lin kt kp cho php d dng xc nh phn t ng trc mt phn t bit, do n thun tin hn danh sch lin kt thun trong cc thao tc: duyt ngc danh sch, chn mt phn t mi vo trc mt phn t, xo mt phn t.

Chng trnh DslkKep.pas minh ho cch lm vic vi danh sch lin kt kp. USES crt; TYPE svienPtr = ^svien;

svien = RECORD maso : STRING[6]; hoten: STRING[23]; dtb : REAL; prev, next : svienPtr; END; VAR first,last: svienPtr; chon: BYTE; PROCEDURE Bosung; VAR p,q: svienPtr; ans: CHAR; BEGIN WHILE TRUE DO BEGIN new(p); WITH p^ DO BEGIN write('- Ma so: '); readln(maso); write('- Ho va ten: '); readln(hoten); write('- Diem trung binh: '); readln(dtb); END; IF first=NIL THEN BEGIN p^.next:= NIL; p^.prev := NIL; first:= p; last:= p; END ELSE BEGIN q:= last; q^.next:= p; p^.next:= NIL; p^.prev:= q; last:= p; END; write('Co tiep tuc khong C/K ?'); readln(ans); IF upcase(ans) = 'K' THEN break;

END; END; PROCEDURE DuyetXuoi; VAR p: svienPtr; BEGIN IF first <> NIL THEN BEGIN p:= first; WHILE p<> NIL DO BEGIN WITH p^ DO writeln(maso,' ',hoten,' ',dtb:1:2); p:= p^.next; END; END ELSE writeln('Danh sach rong '); readln; END; PROCEDURE DuyetNguoc; VAR p: svienPtr; BEGIN IF first <> NIL THEN BEGIN p:= last; WHILE p<> NIL DO BEGIN WITH p^ DO writeln(maso,' ',hoten,' ',dtb:1:2); p:= p^.prev; END; END ELSE writeln('Danh sach rong '); readln; END; PROCEDURE ChenTruoc;

VAR p,q,r: svienPtr; found: BOOLEAN; masv: STRING[6]; BEGIN write('Ma so SV can tim : '); readln(masv); IF first<>NIL THEN BEGIN p:= first; found:= FALSE; WHILE (p<>NIL) AND (NOT found) DO IF p^.maso=masv THEN found := TRUE ELSE p:=p^.next; IF found THEN BEGIN new(q); WITH q^ DO BEGIN write('- Ma so: '); readln(maso); write('- Ho va ten: '); readln(hoten); write('- Diem trung binh: '); readln(dtb); END; IF p=first THEN BEGIN q^.next:= p; first^.prev:= q; first:= q END ELSE BEGIN r:=p^.prev; q^.next:= r^.next; r^.next:= q; q^.prev:= p^.prev; p^.prev:= q END; END ELSE BEGIN write('Khong tim thay'); readln END; END;

END; PROCEDURE TimXoa; VAR p,q,pt: svienPtr; found: BOOLEAN; masv: STRING[6]; BEGIN write('Ma so SV can loai khoi danh sach : '); readln(masv); IF first<>NIL THEN BEGIN p:= first; found:= FALSE; WHILE (p<>NIL) AND (NOT found) DO IF p^.maso=masv THEN found := TRUE ELSE p:=p^.next; IF found THEN BEGIN q:= p^.prev; pt:= p^.next; IF q<>NIL THEN q^.next:= p^.next; IF pt<>NIL THEN pt^.prev:= p^.prev; IF p=first THEN first:= pt; IF p=last THEN last:= q; dispose(p); END ELSE BEGIN write('Khong tim thay '); readln END; END; END; BEGIN first:= NIL; clrscr; REPEAT writeln('1. Bo sung phan tu'); writeln('2. Duyet danh sach theo chieu xuoi'); writeln('3. Duyet danh sach theo chieu nguoc'); writeln('4. Chen vao truoc mot phan tu'); writeln('5. Tim kiem va xoa mot phan tu');

writeln('6. Ket thuc chuong trinh'); write(' Chon chuc nang : '); readln(chon); CASE chon OF 1: Bosung; 2: DuyetXuoi; 3: DuyetNguoc; 4: ChenTruoc; 5: TimXoa; END; UNTIL chon=6; WHILE first<> NIL DO BEGIN last:=first; first:=first^.next; dispose(last); END; END. 3. Ngn xp dng danh sch lin kt Stack l mt danh sch theo tt c cc cng vic chn v hu u c thc hin mt u ca danh sch (gi l nh ca ngn xp). Stack ging nh mt chng a, a no t cui cng ln nh chng th a s c ly ra u tin. Do Stack cn c tn gi l LIFO (last in first out vo sau ra trc). Vic thm mt phn t vo stack c tn gi l y (Push) vo stack, cn vic hu mt phn t khi stack gi l ly (Pop) khi stack. Stack dng danh sch lin kt hon ton ging danh sch lin kt thun, nhng ch c iu khc l khi thm phn t mi hay hu mt phn t ta lun lun lm u danh sch. Do ta phi duy tr mt con tr Top tr vo phn t u tin ca danh sch (nh ca stack) Chng trnh StDslk.pas minh ho cch lm vic vi stack dng danh sch lin kt, cc phn t ca stack l cc s nguyn dng. USES crt; TYPE StackPtr= ^node; node = RECORD data: INTEGER; next: StackPtr;

END; VAR top: StackPtr; chon,n: INTEGER; PROCEDURE Push(n: INTEGER); VAR p: StackPtr; BEGIN new(p); p^.data:= n; p^.next:= top; top:= p; END; FUNCTION Pop: INTEGER; VAR p: StackPtr; BEGIN IF top=NIL THEN pop:=0 ELSE BEGIN pop:= top^.data; p:= top; top:= top^.next; dispose(p) END; END; PROCEDURE Duyet; VAR p: StackPtr; BEGIN IF top<>NIL THEN BEGIN p:=top; WHILE p<>NIL DO BEGIN writeln(p^.data,' '); p:=p^.next END; END ELSE

writeln('Stack rong'); readln; END; BEGIN clrscr; top:=NIL; REPEAT write('1. Push 2. Pop 3. Duyet 4. Thoat. Chon: '); read(chon); CASE chon OF 1: BEGIN write('Vao n : '); readln(n); Push(n) END; 2: BEGIN n:= Pop; IF n<>0 THEN writeln('Phan tu lay ra = ',n) ELSE writeln('Stack rong'); END; 3: Duyet; END; UNTIL chon=4; END. 4. Hng i dng danh sch lin kt Queue l mt danh sch m vic thm mt phn t mi c thc hin ui queue, vic hu mt phn t c thc hin u queue. Queue ging nh mt dy khch hng xp hng tr tin trong siu th, ngi xp hng trc s c phc v trc v ra khi hng, ngi mi tham gia xp hng th xp vo cui hng. Do queue cn c tn gi FIFO (first in first out vo trc th ra trc). Queue dng danh sch lin kt hon ton ging danh sch lin kt thun , nhng ch c iu khc l khi thm phn t mi ta lun lun ni vo cui danh sch, khi hu mt phn t ta lun hu phn t u tin trong danh sch. Do ta phi duy tr hai con tr: front tr vo phn t u, back tr vo phn t cui

Chng trnh QueDslk.pas to mt hng i gm cc s nguyn dng dng danh sch lin kt thun. USES crt; TYPE queuePtr= ^node; node = RECORD data: INTEGER; next: queuePtr; END; VAR front,back: queuePtr; chon,n: INTEGER; PROCEDURE ThemVao(n: INTEGER); VAR p: queuePtr; BEGIN new(p); p^.data:= n; p^.next:= NIL; IF front=NIL THEN BEGIN front:=p; back:=p END ELSE BEGIN back^.next:=p; back:=p END; END; FUNCTION LayRa: INTEGER; VAR p: queuePtr; BEGIN IF front=NIL THEN LayRa:=0 ELSE BEGIN LayRa:= front^.data; p:= front;

front:= front^.next; dispose(p) END; END; PROCEDURE Duyet; VAR p: queuePtr; BEGIN IF front<>NIL THEN BEGIN p:=front; WHILE p<>NIL DO BEGIN write(p^.data,' '); p:=p^.next END; writeln; END ELSE writeln('Queue rong'); readln; END; BEGIN clrscr; front:=NIL; back:=NIL; REPEAT write('1.Push 2.Pop 3.Duyet 4.Thoat. Chon: '); read(chon); CASE chon OF 1: BEGIN write('Vao n : '); readln(n); ThemVao(n) END; 2: BEGIN n:= LayRa; IF n<>0 THEN writeln('Phan tu lay ra = ',n) ELSE

writeln('Queue rong'); END; 3: Duyet; END; UNTIL chon=4; END.

You might also like