1151_tim hieu ve danh dach moc noi don

Post on 09-Nov-2015

224 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

DESCRIPTION

hay

TRANSCRIPT

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

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

top related