1151_Tim Hieu Ve Danh Dach Moc Noi Don

12
1 1. Danh sách móc nối đơn là gì? 1.1. Khái niệm Danh sách móc nối đơn (Singly-linked list) gồm các nút được nối với nhau theo một chiều. Mỗi nút là một bản ghi (record) gồm hai trường: - Trường info chứa giá trị lưu trong nút đó. - Trường link chứa liên kết (con trỏ) tới nút kế tiếp, tức là chứa một thông tin đủ để biết nút kế tiếp nút đó trong danh sách là nút nào. Với nút cuối cùng (không có nút kế tiếp), trường liên kết này được gắn với một giá trị đặc biệt, chẳng hạn con trỏ nil. Cấu trúc nút của danh sách móc nối đơn Code Type PNode=^Node; {Kiểu con trỏ tới một nút} Node=Record {Kiểu biến động chứa thông tin trong một nút} info: <Kiểu dữ liệu>; link: PNode; End; Nút đầu tiên (head) đóng vai trò quan trọng trong danh sách nối đơn. Để duyệt danh sách nối đơn. Để duyệt danh sách nối đơn, ta bắt đầu từ nút đầu tiên, dựa vào trường liên kết để đi sang nút kế tiếp, đến khi gặp giá trị đặc biệt (duyệt qua nút cuối) thì dừng lại. Danh sách nối đơn 1.2. Truy cập các phần tử trong danh sách móc nối đơn Bản thân danh sách móc nối đơn đã là một kiểu dữ liệu trừu tượng. Để cài đặt kiểu dữ liệu trừu tượng này, có thể dùng mảng các nút (trường link chứa chỉ số của nút kế tiếp) hoặc biến cấp phát động (trường link chứa con trỏ trỏ tới nút kế tiếp). Tuy

description

hay

Transcript of 1151_Tim Hieu Ve Danh Dach Moc Noi Don

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

    ------------------------------