1151_tim hieu ve danh dach moc noi don
DESCRIPTION
hayTRANSCRIPT
-
1
1. Danh sch mc ni n l g?
1.1. Khi nim
Danh sch mc ni n (Singly-linked list) gm cc nt c ni vi nhau theo
mt chiu. Mi nt l mt bn ghi (record) gm hai trng:
- Trng info cha gi tr lu trong nt .
- Trng link cha lin kt (con tr) ti nt k tip, tc l cha mt thng tin
bit nt k tip nt trong danh sch l nt no. Vi nt cui cng (khng c nt
k tip), trng lin kt ny c gn vi mt gi tr c bit, chng hn con tr
nil.
Cu trc nt ca danh sch mc ni n
Code
Type
PNode=^Node; {Kiu con tr ti mt nt}
Node=Record {Kiu bin ng cha thng tin
trong mt nt}
info: ;
link: PNode;
End;
Nt u tin (head) ng vai tr quan trng trong danh sch ni n. duyt
danh sch ni n. duyt danh sch ni n, ta bt u t nt u tin, da vo
trng lin kt i sang nt k tip, n khi gp gi tr c bit (duyt qua nt cui)
th dng li.
Danh sch ni n
1.2. Truy cp cc phn t trong danh sch mc ni n
Bn thn danh sch mc ni n l mt kiu d liu tru tng. ci t
kiu d liu tru tng ny, c th dng mng cc nt (trng link cha ch s ca nt
k tip) hoc bin cp pht ng (trng link cha con tr tr ti nt k tip). Tuy
-
2
nhin, vic xc nh phn t ng th p trong danh sch bt buc phi duyt t u
danh sch qua p nt, vic ny mt thi gian trung bnh O(n) v t ra khng hiu qu
nh thao tc trn mng. Ni cch khc, danh sch ni n tin cho vic truy cp tun
t nhng khng hiu qu nu chng ta thc hin nhiu php truy cp ngu nhin.
2. To danh sch mc ni n
2.1. tng
Chng ta c th bt u to dn danh sch t tri hoc phi qua u c, cch
c cp ti y l t tri qua phi:
- u tin ta to mt nt u tin, nt ny ng vai tr va l nt Head.
- Sau t nt th 2 tr i, mi ln to thm 1 nt ta gn nt trung gian bng nt
va to. Gn trng Link hp l theo nh ngha danh sch ni n.
2.2. Code
{Th tc to mi danh sch}
Procedure Readf;
Var P:PNode;
Begin
Assign(f,fi);Reset(f);
Readln(f,N,K);
New(P);
Read(f,P^.info);
Head:=P;
Q:=P;
For i:=2 to n do Begin
New(P);
P^.Next:=Nil;
Read(f,P^.Info);
Q^.Next:=P;
Q:=P;
End;
Close(f);
End;
-
3
3. Chn phn t vo danh sch ni n
3.1. tng
chn thm mt nt cha gi tr v vo v tr ca nt p trong danh sch ni n,
trc ht ta to ra mt nt mi Newnode cha gi tr v v cho nt ny lin kt ti p.
Nu p ang l nt u tin ca danh sch (head) th cp nht head bng NewNode,
cn nu p khng phi l nt u tin ca danh sch, ta tm nt q l nt ng lin trc
nt p v chnh li lin kt: q lin kt ti NewNode thay v lin kt thng ti p.
Chn phn t vo danh sch ni n
3.2. Code
{Th tc chn phn t V vo v tr nt P}
Procedure Insert(p: Pnode; const v: );
Var NewNode, q, head: Pnode;
Begin
New(NewNode);
NewNode^.info := v;
NewNode^.link := p;
If head = p then head := NewNode
Else
Begin
q := head;
while q^.link q do q:=q^.link;
q^.link := NewNode;
End;
End;
-
4
Vic chnh li lin kt trong th tc chn phn t vo danh sch ni n mt
thi gian O(1). Tuy nhin, vic tm ra nt ng lin trc nt p yu cu phi duyt t
u danh sch, vic ny mt thi gian trung bnh O(n). Vy th tc chn mt phn t
vo danh sch ni n mt thi gian thc hin trung bnh O(n).
4. Xa phn t khi danh sch mc ni n
4.1. tng
xa nt p khi danh sch ni n, gi next l nt ng lin sau p trong danh
sch. Xt hai trng hp:
- Nu p l nt u tin trong danh sch head = p th ta t li head = next.
- Nu p khng phi nt u tin trong danh sch, tm q l nt ng lin trc nt p
v chnh li lin kt: q lin kt ti next thay v lin kt ti p.
Vic cui cng l hy nt p.
4.2. Code
{Th tc xa nt P}
Procedure Delete(p:PNode);
Var next, q, head: PNode
Begin
Next := p^.link;
If p = head then head := next
Else
Begin
Q:= head;
While q^.link p do q := q^.link;
Q^.link:= next;
End;
Dispose(P);
End;
-
5
Xa phn t khi danh sch ni n
Cng ging nh th tc chn, th tc xa mt phn t khi danh sch ni n
cng mt thi gian thc hin trung bnh l O(n).
5. Biu din ngn xp (Stack) bng danh sch ni n kiu LIFO
5.1. Khi nim:
Ngn xp l mt dng c bit ca danh sch m vic b sung hay loi b mt
phn t u c thc hin 1 u ca danh sch gi l nh. Ni cch khc, ngn
xp l 1 cu trc d liu c 2 thao tc c bn: b sung (push) v loi b phn t (pop),
trong vic loi b s tin hnh loi phn t mi nht c a vo danh sch.
Chnh v tnh cht ny m ngn xp cn c gi l kiu d liu c nguyn tc LIFO
(Last In First Out - Vo sau ra trc).
Ta s trnh by cch ci t ngn xp bng danh sch ni n bng bin ng v
con tr.
- Li vo v li ra u l nh ca Stack c qun l bi nt Top.
- Khng xt trng hp trn Stack bi n cn ph thuc vo nhiu th khc.
- Stack rng khi nt Top trng (nil).
5.2. Code
Type
PNode=^Node;
Node=Record
Info: ;
Link: PNode;
End;
Var Top:PNode;
Procedure StackInit;
Begin
Top:=Nil;
End;
{Np phn t vo Stack nh danh sch}
Procedure SPUSH(V: );
-
6
Var P:PNode;
Begin
New(P);
P^.Info:= V;
P^.Link:= top;
Top := p;
End;
{Ly phn t ra khi stack nh danh sch}
Procedure SPOP: ;
Var P:PNode;
Begin
If Top=Nil then Writeln(Stack is empty)
Else
Begin
SPOP:=Top^.Info;
P:=Top^.Next;
Dispose(Top);
Top:=P;
End;
End;
BEGIN
StackInit;
;
END.
6. Biu din hng i (Queue) bng danh sch ni n kiu FIFO:
6.1. Khi nim:
Hng i l mt cu trc d liu gn ging vi ngn xp, nhng khc vi ngn
xp nguyn tc chn phn t cn ly ra khi tp phn t. Tri ngc vi ngn xp,
phn t c ly ra khi hng i khng phi l phn t mi nht c a vo m l
phn t c lu trong hng i lu nht.
iu ny nghe c v hp vi quy lut thc t hn l ngn xp ! Quy lut ny
ca hng i cn c gi l Vo trc ra trc (FIFO - First In First Out). V d v
hng i c rt nhiu trong thc t. Mt dng ngi xp hng ch ct tc 1 tim ht
-
7
tc, ch vo rp chiu phim, hay siu th l nhng v d v hng i. Trong lnh vc
my tnh cng c rt nhiu v d v hng i. Mt tp cc tc v ch phc v bi h
iu hnh my tnh cng tun theo nguyn tc hng i.
Hng i cn khc vi ngn xp ch: phn t mi c a vo hng i s
nm pha cui hng, trong khi phn t mi a vo ngn xp li nm nh ngn
xp.
Nh vy, ta c th nh ngha hng i l mt dng c bit ca danh sch m
vic ly ra mt phn t, get, c thc hin 1 u (gi l u hng), cn vic b
sung 1 phn t, put, c thc hin u cn li (gi l cui hng).
- Li vo l pha bn phi Queue c qun l bi nt L.
- Li ra l pha bn tri Queue c qun l bi nt R.
- Khng xt trng hp trn Queue bi n cn ph thuc vo nhiu th khc.
- Queue rng khi nt L v R u trng.
6.2. Code
Type
Pnode = ^Node;
Node = Record
Info: ;
Link: PNode;
End;
Var L,R: PNode;
Procedure QueueInit;
Begin
L := Nil;
End;
{Ly gi tr ca phn t v tr u danh sch}
Function Get: ;
Begin
If (L=R) and (R=Nil) then Writeln(Queue is empty)
Else Get := L^.info;
End;
{Np phn t vo Queue v tr cui cng}
Procedure QPUSH(V: );
Var P:PNode;
Begin
-
8
New(P);
P^.Info := V;
P^.Link := Nil;
If L=Nil then L := P
Else R^.link := P;
R := P;
End;
{Ly phn t ra khi Queue u danh sch}
Procedure QPOP: ;
Var P:PNode;
Begin
If (L=R) and (R=Nil) then Writeln(Queue is empty)
Else Begin
QPOP:=L^.Info;
P:=L^.Link;
L^.Link:=Nil;
Dispose(L);
L:=P;
End;
End;
BEGIN
QueueInit;
;
END.
7. Bi tp ng dng
7.1. Bi tp minh ha
Vit chng trnh Dslk.pas minh ho cc cch lm vic vi danh sch lin kt
thun. Phn d liu ca mt phn t sl cc thng tin v mt sinh vin.
Type SVienPtr = ^SVien;
SVien = record
maso: string[6];
hoten: string[23];
next : SvienPtr;
end;
-
9
var L, R: 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 L=NIL then begin L:= p; R:= p end
else begin
R^.next:= p; R:= 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 L = NIL then begin
writeln('D.sach rong'); exit;
end;
p := L;
while p NIL do
begin
with p^ do writeln(maso:5,' ',Hoten:25,'
',dtb:5:2);
p := p^.Next;
-
10
end;
End;
procedure ChenSau;
var q,p: SVienPtr; found: boolean; masv: string[6];
begin
if L NIL then begin
write('Ma so SV can tim de chen :
');
readln(masv);
p:= L; found:= false;
while (pNIL) 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 TB :');
readln(dtb);
end;
q^.next:= p^.next;
p^.next:= q;
end
else begin
write('Khong tim thay...');
readln;
end;
end;
end;
Procedure TimXoa;
-
11
var masv: string[6]; found: boolean; p,q: SVienPtr;
begin
write('Ma so SV can loai khoi danh sach : ');
readln(masv);
p:= L;
if pNIL then begin
found:= false;
while (pNIL) 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=L then L :=p^.next
else q^.next:=p^.next;
if p^.next=NIL then R:=q;
dispose(p)
end
else begin
write('Khong tim thay...');
readln;
end;
end;
End;
BEGIN
L := 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
-
12
1: Bosung;
2: DuyetXuoi;
3: ChenSau;
4: TimXoa;
End;
Until chon=5;
while LNIL do Begin
R:= L; L:= L^.next;
Dispose(R);
End;
End.
7.2. Bi tp t gii
Bi tp 1: Vit mt hm xc nh xem mt danh sch lin kt cho c th t tng
dn hay khng theo 2 cch: Khng qui v qui.
Bi tp 2: Cho 2 danh sch lin kt n i din cho 2 tp hp c tr bi L1 v L2.
Vit chng trnh hin th:
1. Phn giao ca 2 danh sch trn.
2. Phn hp ca 2 danh sch trn.
3. Phn hiu ca 2 danh sch trn.
Bi tp 3: Cho 2 danh sch lin kt L1 v L2.
1. Sp xp li 2 danh sch theo th t tng dn.
Trn 2 danh sch li thnh danh sch L3 sao cho L3 vn c th t tng dn.
------------------------------