Вы находитесь на странице: 1из 62

BI CU TRC D LIU 2 DANH SCH

Phan nh Th Hun Thng 3 - 2010

Ni dung
1. 2. 3. 4.

nh ngha v cc php ton trn danh sch Danh sch c Danh sch lin kt Cc danh sch hn ch
Hng i Ngn xp

5.

ng dng ca danh sch

Cu trc d liu - Bi 2

Phan Dinh The Huan

1. nh ngha v cc php ton trn danh sch


1. 2.
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

nh ngha:
Danh sch l mt dy hu hn (c th rng) cc phn t

Cc php ton thng gp trn danh sch


To mt danh sch rng Xc nh danh sch c rng hay khng Duyt danh sch Thm mt phn t mi vo danh sch Xa mt phn t khi danh sch Thay th mt phn t bi mt phn t khc Tch mt danh sch thnh nhiu danh sch Ghp nhiu danh sch thnh mt danh sch mi Trn nhiu danh sch thnh mt danh sch mi Sao chp mt danh sch sang mt danh sch mi Sp th t mt danh sch
Phan Dinh The Huan 3

Cu trc d liu - Bi 2

DANH SCH C CONDENSED LIST

2. Danh sch c
1. 2. 3. 4.

nh ngha Cch biu din Cc php ton trn danh sch c c im ca danh sch c
u im Nhc im

5.

ng dng ca danh sch c

Cu trc d liu - Bi 2

Phan Dinh The Huan

2.1 nh ngha danh sch c


Danh sch c l mt danh sch m cc phn t c sp xp k tip nhau trong b nh, ng ngay sau v tr ca phn t ai l v tr ca phn t ai+1 2. Cng thc tnh a ch nh sau: Gi: add[1] - a ch ca phn t u tin add[i] - a ch ca phn t th i d - chiu di ca mt phn t Th: add[i] = add[1] + (i-1) * d
1.
Cu trc d liu - Bi 2 Phan Dinh The Huan 6

2.2 Biu din mt danh sch c


Danh sch c c biu din di dng l mt dy cc phn t

a[1] a[2] a[n]


V d, ta khai bo mt danh sch c l mt dy s nguyn trong ngn ng C nh sau: const int MAX = 100; int a[MAX], n;
Cu trc d liu - Bi 2 Phan Dinh The Huan 7

Biu din danh sch c (tt)


Mt cch nh ngha mt danh sch c dng kiu struct, v d:
#define MAX 100 ... typedef struct tagCList { int n; //s lng phn t int a[MAX]; //mng cc phn t kiu int }CList;
Cu trc d liu - Bi 2 Phan Dinh The Huan 8

2.3 Cc php ton trn DS c


1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

Khi to danh sch Kim tra danh sch c rng khng Kim tra danh sch c y khng Thm mt phn t vo danh sch Loi b mt phn t khi danh sch Tm kim mt phn t ca danh sch Thay th phn t v tr pos bng mt gi tr khc Sp xp danh sch Sao chp danh sch Xa ton b danh sch
Phan Dinh The Huan 9

Cu trc d liu - Bi 2

Cc php ton trn danh sch c


1.

Khi to danh sch Khi khi to, danh sch rng


[0] [1] [2] [3] [4]

s phn t bng 0
[5] [MAX-1]

a n=0

void initialize(CList &list)


/* Postcondition: khi to danh sch rng */

{ list.n = 0; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 10

Cc php ton trn danh sch c


2.

Kim tra danh sch c rng khng


[0] [1] [2] [3] [4] [5] [MAX-1]

a n=0?

int isEmpty(const CList &list)


/* Postcondition: tr v 1 nu n =0, ngc li tr v 0 */

{ if(list.n == 0) return 1; return 0; }


Cu trc d liu - Bi 2 Phan Dinh The Huan 11

Cc php ton trn danh sch c


3.

Kim tra danh sch c y khng


[0] [1] [2] [3] [n-1] [MAX-1]

32

10

n = MAX ?

int isFull(const CList &list)


/* Postcondition: tr v 1 nu n=MAX, ngc li tr v 0 */

{ if(list.n == MAX) return 1; return 0; }


Cu trc d liu - Bi 2 Phan Dinh The Huan 12

Cc php ton trn danh sch c


4.

Thm mt phn t vo danh sch:


[0] [1] [2] [3] [4] [5] [MAX-1]

Thm phn t vo danh sch ti v tr k


a
3 7
[0]

5 k=1
[1]

32

10

n=5

[2]

[3]

[4]

[5]

[MAX-1]

32

10

n=6

Cu trc d liu - Bi 2

Phan Dinh The Huan

13

Cc php ton trn danh sch c


4. Thm mt phn t vo danh sch int insertElement(CList &list,int k, int newinfo) /* Precondition: chn newinfo vo v tr k Postcondition: nu DS cha y v 0kn th chn vo, tng n v tr v 1, ngc li, chn khng thnh cng, tr v 0*/

{ if(!isFull(list) && k>=0 && k<=list.n) { for(int i=list.n;i>k;i--) list.a[i]=list.a[i-1]; list.a[k]=newinfo; list.n++; return 1; } return 0; Phan Dinh The Huan }Cu trc d liu - Bi 2

14

Cc php ton trn danh sch c


5.

Loi b mt phn t khi danh sch:


[0] [1] [2] [3] [4] [5] [MAX-1]

Loi b phn t ti v tr k
a
3 7 k=2
[0] [1] [2] [3] [4] [5] [MAX-1]

32

10

n=6

3 5

32

10

n=5

Cu trc d liu - Bi 2

Phan Dinh The Huan

15

Cc php ton trn danh sch c


5.

Loi b mt phn t khi danh sch

int deleteElement(CList &list, int k) /* Precondition: loi b phn t ti v tr k Postcondition: nu DS cha rng v 0k<n th xa phn t, gim n v tr v 1, ngc li, xa khng thnh cng, tr v 0*/ { if(!isEmpty(list) && k>=0 && k<list.n) { for(int i=k;i<list.n-1;i++) list.a[i]=list.a[i+1]; list.n--; return 1; } return 0; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 16

Cc php ton trn danh sch c


6.

Tm kim mt phn t ca danh sch:


[0] [1] [MAX-1]

Tm gi tr x c trong danh sch khng


[2] [3] [4] [5]

32

10

n=5

Cu trc d liu - Bi 2

Phan Dinh The Huan

17

Cc php ton trn danh sch c


6. Tm kim mt phn t ca danh sch int searchElement(const CList &list,int x)

/* Precondition: tm gi tr x trong DS Postcondition: tr v v tr tm thy u tin, ngc li, tr v -1*/ { for(int i=0;i<list.n;i++) if(list.a[i]==x) return i; return -1; }

Cu trc d liu - Bi 2

Phan Dinh The Huan

18

c im ca danh sch c
1.

u im
Mt s dng b nh ca DS c l 100% D dng truy xut phn t a[i] bng cng thc tnh a ch Trong trng hp danh sch c th t, vic tm kim d dng nh phng php tm kim nh phn.

2.

Nhc im
Php thm vo v loi b mt phn t c chi ph cao O(n)

Cu trc d liu - Bi 2

Phan Dinh The Huan

19

ng dng ca danh sch c


1. 2. 3.

Mng mt chiu: a[b..s] Mng hai chiu: a[b1..s1, b2..s2] Mng nhiu chiu: a[b1..s1, , bn..sn]

Cu trc d liu - Bi 2

Phan Dinh The Huan

20

Bi tp
1. 2.

Ci t cc thao tc 7-10 Ci t thm mt s thao tc m rng trn DS c:


Thm mt gi tr x vo DS m bo th t tng dn. Tm v loi b tt c phn t c gi tr x. o ngc v tr tt c cc phn t.

3.

Xy dng chng trnh qun l thng tin sinh vin bng danh sch c.
Phan Dinh The Huan 21

Cu trc d liu - Bi 2

DANH SCH LIN KT LINKED LIST

3. Danh sch lin kt (DSLK)


1.

Cc khi nim
nh ngha Biu din mt DSLK Cc php ton trn DSLK

2. 3. 4. 5.

DSLK n Danh sch lin kt kp Danh sch lin kt vng nh gi DSLK


Phan Dinh The Huan 23

Cu trc d liu - Bi 2

3.1 Cc khi nim


nh ngha DSLK Cc cch biu din DSLK Cc php ton trn DSLK

Cu trc d liu - Bi 2

Phan Dinh The Huan

24

nh ngha danh sch lin kt


1.

2.

Danh sch lin kt (DSLK) l mt danh sch m cc phn t c ni kt vi nhau nh vo vng lin kt ca chng DSLK l mt loi cu trc n gin v thch hp vi cc php thm vo, php loi b, php ghp nhiu DS m cc php ny li khng thch hp cho danh sch c

Cu trc d liu - Bi 2

Phan Dinh The Huan

25

Biu din ca mt DSLK


Mt phn t ca DSLK bao gm 2 vng chnh:
Vng cha thng tin Vng cha a ch, cn gi l vng lin kt

C nhiu kiu t chc lin kt gia cc phn t trong danh sch lin kt: lin kt n, lin kt kp, lin kt vng, a lin kt.

Cu trc d liu - Bi 2

Phan Dinh The Huan

26

Mt s kiu t chc DSLK


A
pHead

danh sch lin kt n


A B C D

pHead A

danh sch lin kt kp


B X Z Y

danh sch lin kt n vng


pHead

danh sch lin kt kp vng


Cu trc d liu - Bi 2 Phan Dinh The Huan 27

Cc php ton c bn trn DSLK


1. 2. 3. 4. 5. 6. 7.

Khi to danh sch Kim tra danh sch rng Tm kim 1 phn t trong danh sch Thm 1 phn t vo danh sch Hy 1 phn t khi danh sch Duyt danh sch Hy ton b danh sch

Cu trc d liu - Bi 2

Phan Dinh The Huan

28

3.2 DANH SCH LIN KT N


1. 2. 3. 4.

nh ngha Biu din DSLK n Cc php ton trn DSLK n nh gi DSLK n

Cu trc d liu - Bi 2

Phan Dinh The Huan

29

nh ngha DSLK n
DSLK n l loi DSLK m vng a ch ca mi phn t ch cha duy nht mt a ch ca phn t tip theo. Phn t cui cng ca DSLK n s tr n NULL

pHead

danh sch lin kt n


NULL
Cu trc d liu - Bi 2 Phan Dinh The Huan 30

Biu din ca mt DSLK n


typedef struct tagNode { Data info; struct tagNode* pNext; pHead }Node; typedef struct tagList { Node *pHead; }List;
Cu trc d liu - Bi 2 Phan Dinh The Huan 31

info pNext

Biu din ca mt DSLK n V d


typedef struct SinhVien { char mssv[7]; char hoTen[30]; float dtb; }SV; typedef struct tagSVNode { SV info; struct tagSVNode* pNext; }SVNode; typedef struct tagSVList { SVNode *pHead; }SVList;
Cu trc d liu - Bi 2 Phan Dinh The Huan

pHead

info

mssv hoTen dtb

060123 Le Van Gioi 8.5

32

Cc php ton trn DSLK n


1. 2. 3. 4. 5. 6. 7.

Khi to danh sch Kim tra danh sch rng Tm kim 1 phn t trong danh sch Thm 1 phn t vo danh sch Hy 1 phn t khi danh sch Duyt danh sch Hy ton b danh sch

Cu trc d liu - Bi 2

Phan Dinh The Huan

33

(1) Khi to danh sch


Khi khi to, DSLK rng, ta t pHead = NULL
pHead

void initialize(List &list)


{ list.pHead = NULL; }

Cu trc d liu - Bi 2

Phan Dinh The Huan

34

Kim tra danh sch rng


Kim tra pHead c bng NULL hay khng
int isEmpty(const List &list)
{ return (list.pHead == NULL); }

Cu trc d liu - Bi 2

Phan Dinh The Huan

35

Tm kim 1 phn t trong DSLK


Node* search(const List &list, Data x);

Tm kim gi tr x c trong danh sch hay khng. - Trng hp 1: DSLK khng c th t - Trng hp 2: DSLK c th t

Cu trc d liu - Bi 2

Phan Dinh The Huan

36

Tm kim 1 phn t trong DSLK


Trng hp 1: DSLK khng c th t
p
A U F x Z Y

pHead

Node* search(const List &list, Data x) { Node *p = list.pHead; int found = 0; while(p!=NULL && !found) { if(p->info == x) found = 1; else p = p->pNext; } return p; }
Cu trc d liu - Bi 2 Phan Dinh The Huan

37

Tm kim 1 phn t trong DSLK


Trng hp 2: DSLK c th t tng dn
p
A B C x F Y

pHead

Node* search(const List &list, Data x) { Node *p = list.pHead; int found = 0; while(p!=NULL && p->info < x) p = p->pNext; if(p!=NULL && p->info > x) p = NULL; return p; }
Cu trc d liu - Bi 2 Phan Dinh The Huan

38

Thm 1 phn t vo danh sch


- Trng hp 1: thm vo u DSLK
Node* insertHead(List &list, Data x);

- Trng hp 2: thm vo ngay sau phn t q


Node* insertAfter(List &list, Node*q, Data x);

Ngoi ra, cn c thao tc thm vo sao cho DSLK lun c cc phn t tng dn
Node* insertAscending(List &list, Data x);

Cu trc d liu - Bi 2

Phan Dinh The Huan

39

Hm b tr: to Node
p x

Node* createNode(Data x) { Node *p = new Node; if(p!=NULL) { p->info = x; p->pNext = NULL; } return p; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 40

TH1: Thm vo u DSLK


pHead A X B C D E p

Node* insertHead(List &list, Data x)


{ Node *p = createNode(x); if(p!=NULL) { p->pNext = list.pHead; list.pHead = p; } return p; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 41

TH2: Thm vo ngay sau phn t q


pHead q A p B X C D E

Node* insertAfter(List &list,Node *q,Data x) { Node *p = createNode(x); if(p!=NULL) { p->pNext = q->pNext; q->pNext = p; } return p; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 42

Thm vo DSLK tng dn


before A p B D q F G T

pHead

Cu trc d liu - Bi 2

Phan Dinh The Huan

43

Thm vo DSLK tng dn


Node* insertAscending(List &list,Data x) { Node *p = createNode(x); Node *q, *before; q = before = list.pHead; if(p!=NULL) { while(q!=NULL && q->info < x) { before = q; q = q->pNext; } if(q==list.pHead) list.pHead = p; else before->pNext = p; p->pNext = q; } return p; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 44

Hy 1 phn t khi danh sch


- TH1: Hy phn t u danh sch int deleteHead(List &list);
-

TH2: Hy phn t ng sau phn t q int deleteAfter(List &list,Node *q);

- TH3: Hy phn t c gi tr x int deleteNode(List &list,Data x); Lu : khi cp pht b nh, chng ta dng ton t new, khi hy b nh phi dng ton t delete.

Cu trc d liu - Bi 2

Phan Dinh The Huan

45

TH1: Hy phn t u danh sch


p pHead A B X Z Y

Nu pHead!=NULL th B1: p=pHead B2: // hy p B21: pHead=pHead->pNext; B22: delete p;

Cu trc d liu - Bi 2

Phan Dinh The Huan

46

TH1: Hy phn t u danh sch


p pHead A B X Z Y

int deleteHead(List &list) { Node *p; if(list.pHead!=NULL) { p = list.pHead; list.pHead = list.pHead->pNext; delete p; return 1; } return 0; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 47

TH2: Hy phn t ng sau q


pHead q A B p C D E

Nu q!=NULL th B1: p=q->pNext B2: Nu p!=NULL th B21: q->pNext = p->pNext; B22: delete p;

Cu trc d liu - Bi 2

Phan Dinh The Huan

48

TH2: Hy phn t ng sau q


pHead q A B p C D E

int deleteAfter(List &list,Node *q) { Node *p; if(q!=NULL) { p = q->pNext; if(p!=NULL) { q->pNext = p->pNext; delete p; return 1; } } return 0; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 49

TH3: Hy phn t c gi tr x
q pHead A B p X Z Y

B1: Tm phn t p c gi tr x v phn t q ng trc n B2: Nu p!=NULL th //tm thy x Hy p ra khi DSLK tng t hy phn t sau q Ngc li Khng tm thy x

Cu trc d liu - Bi 2

Phan Dinh The Huan

50

TH3: Hy phn t c gi tr x
pHead q A B p X Z Y

int deleteNode(List &list, Data x) { Node *p = list.pHead; Node *q = NULL; tm phn t c while(p!=NULL && p->info!=x) gi tr x { q=p; p=p->pNext;} if(p==NULL) return 0; khng tm thy hoc DS rng if(q!=NULL) q->pNext=p->pNext; p pHead else p pHead list.pHead = p->pNext; delete p; return 1; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 51

Php duyt danh sch lin kt


p pHead
A B C F Y

B1: p=pHead B2: Trong khi (danh sch cha ht) thc hin B21: X l phn t p B22: p=p->pNext void processList(List &list) { Node *p; p=list.pHead; while(p!=NULL) { processNode(p);//x l c th p=p->pNext; } }
Cu trc d liu - Bi 2 Phan Dinh The Huan 52

Hy ton b danh sch lin kt


p pHead
A B C F Y

Trong khi (danh sch cha ht) thc hin B1: p = pHead pHead=pHead->pNext B1: hy p void deleteList(List &list) { Node *p; while(list.pHead!=NULL) { p=list.pHead; list.pHead=list.pHead->pNext; delete p; } }
Cu trc d liu - Bi 2 Phan Dinh The Huan 53

nh gi danh sch lin kt n


1.

u im:
D thc hin cc thao tc thm, hy mt phn t Tn dng c cc vng nh ri rc

2.

Khuyt im:
Khng thun tin cho thao tc truy xut phn t v phi duyt t u danh sch

Cu trc d liu - Bi 2

Phan Dinh The Huan

54

3.3 Danh sch lin kt kp


1. 2. 3.

nh ngha v biu din ca DSLK kp Cc php ton trn DSLK kp nh gi DSLK kp

Cu trc d liu - Bi 2

Phan Dinh The Huan

55

nh ngha v biu din ca DSLK kp


1.

nh ngha:
DSLK kp (double linked list) l DSLK c m mi phn t c 2 vng lin kt: mt vng lin kt n phn t ng trc n (previous) v mt vng lin kt n phn t ng sau n (next)

2.

Biu din ca DSLK kp


pHead

Cu trc d liu - Bi 2

Phan Dinh The Huan

56

nh ngha v biu din ca DSLK kp


2.

Biu din ca DSLK kp (tt)

typedef struct tagDNode { Data info; struct tagDNode *pNext; struct tagDNode *pPrev; }DNode; typedef struct tagDList { DNode *pHead; }DList;
Cu trc d liu - Bi 2 Phan Dinh The Huan

pPrev info pNext

57

Cc php ton trn DSLK kp


1. 2. 3.

4. 5. 6.

Khi to danh sch (tng t DSLK n) Thm 1 phn t vo danh sch Tm kim 1 phn t trong danh sch (tng t DSLK n) Hy mt phn t khi danh sch Duyt danh sch (tng t DSLK n) Hy ton b danh sch (tng t DSLK n)
Phan Dinh The Huan 58

Cu trc d liu - Bi 2

Thm 1 phn t vo DSLK kp


1. 2.

Thm vo u danh sch


DNode* insertHead(DList &list,Data x);

Thm vo sau phn t q


DNode* insertAfter(DList &list,DNode *q, Data x);

3.

Thm vo trc phn t q


DNode* insertBefore(DList &list,DNode *q, Data x);

4.

Thm vo m bo th t tng dn
DNode* insertAsc(DList &lust,Data x);

Cu trc d liu - Bi 2

Phan Dinh The Huan

59

Hm b tr: to mt Node mi
p
x

DNode* createNode(Data x) { DNode *p = new DNode; if(p!=NULL) { p->info = x; p->pNext = NULL; p->pPrev = NULL; } return p; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 60

TH1: Thm vo u danh sch


pHead

A 3 1 x 2

p
pHead

A 3 1 x 2
pHead

Kt qu
x A B C D

p
Cu trc d liu - Bi 2 Phan Dinh The Huan 61

TH1: Thm vo u danh sch


pHead

A 3 1 x 2

DNode* insertHead(DList &list, Data x)

{ DNode *p = createNode(x); if(p!=NULL) { if(list.pHead!=NULL) { p->pNext = list.pHead; list.pHead->pPrev = p; } list.pHead=p; } return p; }


Phan Dinh The Huan 62

Cu trc d liu - Bi 2

TH2: Thm vo sau phn t q


pHead

q
A B x F Y

p
pHead

q
A 4 B 2 x 1 F

tam
Y

p
Cu trc d liu - Bi 2 Phan Dinh The Huan 63

TH2: Thm vo sau phn t q


pHead

q
4

B 2 x 1

tam

p DNode* insertAfter(DList &list,DNode *q, Data x)

DNode *p = createNode(x); DNode *tam=q->pNext; if(p!=NULL) { p->pNext=tam; q->pNext=p; if(tam!=NULL) tam->pPrev=p; p->pPrev=q; } return p;
Phan Dinh The Huan 64

Cu trc d liu - Bi 2

TH3: Thm vo trc phn t q


pHead

q
A B x F Y

p
pHead

tam
A 4 B 2 x 1 F

q
Y

p
Cu trc d liu - Bi 2 Phan Dinh The Huan 65

TH3: Thm vo trc phn t q


pHead

tam
4

B 2 x 1

p DNode* insertBefore(DList &list,DNode *q, Data x)

DNode *p = createNode(x); DNode *tam=q->pPrev; if(p!=NULL) { p->pNext=q; if(tam!=NULL) tam->pNext=p; q->pPrev=p; p->pPrev=tam; } return p;
Phan Dinh The Huan 66

Cu trc d liu - Bi 2

TH4: Thm vo m bo th t tng dn


pHead

q
A B E F Y

q=pHead; B1: To Node mi p cha x; B2: Tm v tr cn thit (q) chn p vo DS B3: Nu tm thy, thm p vo ngay trc q Lu cc trng hp: DS rng, phn t cn chn vo v tr u/ cui DS
Cu trc d liu - Bi 2 Phan Dinh The Huan 67

Hy mt phn t khi DSLK kp


1.

Hy phn t u danh sch


int deleteHead(DList &list);

2.

Hy phn t ng sau phn t q


int deleteAfter(DList &list,DNode* q);

3.

Hy phn t ng trc phn t q


int deleteBefore(DList &list,DNode* q);

4.

Hy phn t c gi tr x
int deleteNode(DList &list,Data x);

Cu trc d liu - Bi 2

Phan Dinh The Huan

69

TH1: Hy phn t u danh sch


pHead

p A B F Y

int deleteHead(DList &list)

DNode *p; if(list.pHead!=NULL) { p=list.pHead; list.pHead=p->pNext; if(list.pHead!=NULL) Loi tr trng hp list.pHead->pPrev=NULL; DS ch c 1 phn t delete p; return 1; } return 0;
Phan Dinh The Huan 70

Cu trc d liu - Bi 2

TH2: Hy phn t ng sau phn t q


pHead

q A B

p F

tam Y

int deleteAfter(DList &list,DNode *q) { DNode *p, *tam; if(q!=NULL) { p=q->pNext; if(p!=NULL) { tam=p->pNext; q->pNext = tam; if(tam!=NULL) Loi tr trng tam->pPrev = q; hp tam=NULL delete p; return 1; } } return 0; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 71

TH3: Hy phn t ng trc phn t q


pHead

tam A

p B

q F Y

int deleteBefore(DList &list,DNode *q) { DNode *p, *tam; if(q!=NULL) { p=q->pPrev; if(p!=NULL) { tam=p->pPrev; q->pPrev = tam; if(tam!=NULL) tam->pNext = q; delete p; return 1; } } return 0; }
Cu trc d liu - Bi 2 Phan Dinh The Huan 72

TH4: Hy phn t c gi tr x
pHead

B x

B1: Tm v tr ca phn t cha gi tr x trong DS (q) B2: Hy phn t tm thy (nu c)


Lu cc trng hp: DS rng, phn t tm thy v tr u, cui DS, hoc khng tm thy x trong DS
Cu trc d liu - Bi 2 Phan Dinh The Huan 73

TH4: Hy phn t c gi tr x
int deleteNode(DList &list,Data x)

DNode *p, *q; p=list.pHead; 1 while(p!=NULL) { if(p->info==x) break; p=p->pNext; } if(p==NULL) return 0; 2 q=p->pPrev; 3 if(q!=NULL) { q->pNext=p->pNext; if(p->pNext!=NULL) p->pNext->pPrev=q; }

else //ppHead 4 { list.pHead=p->pNext; if(list.pHead!=NULL) list.pHead->pPrev=NULL; } delete p; return 1; }

(1): tm p l phn t cha gi tr x (2): DS rng/khng tm thy (3): p gia/cui DS, c th gi deleteAfter(q); (4): p u DS, c th gi deleteHead();
74

Cu trc d liu - Bi 2

Phan Dinh The Huan

Hy ton b DSLK kp
pHead

p
A B C D

Trong khi (danh sch cha ht) thc hin B1: p = pHead pHead=pHead->pNext pHead->pPrev = NULL B1: hy p void deleteList(DList &list) { DNode *p; while(list.pHead!=NULL) { p=list.pHead; list.pHead=list.pHead->pNext; list.pHead->pPrev = NULL; delete p; } Cu trc d liu - Bi 2 Phan Dinh The Huan }

75

nh gi DSLK kp

Cu trc d liu - Bi 2

Phan Dinh The Huan

76

3.4 Danh sch lin kt vng


pHead A B X Z Y

DSLK n vng
pHead

DSLK kp vng
Cu trc d liu - Bi 2 Phan Dinh The Huan 77

CC DANH SCH HN CH STACK - QUEUE

4. Cc danh sch hn ch
1.

Stack
nh ngha T chc lu tr Cc php ton trn stack

2.

Queue
nh ngha T chc lu tr Cc php ton trn queue

Cu trc d liu - Bi 2

Phan Dinh The Huan

79

Stack Ngn xp
1. 2. 3.

nh ngha T chc lu tr ca stack Cc php ton trn stack


in out

Cu trc d liu - Bi 2

Phan Dinh The Huan

80

Stack - nh ngha
1.

2.

3.

Stack (ngn xp) l mt danh sch hot ng theo c ch LIFO (Last In First Out Vo sau ra trc) Thao tc thm v hy c thc hin cng mt pha ca stack c ch LIFO: phn t no vo sau s c ly ra trc ng dng: kh quy, t chc lu vt cc qu trnh tm kim theo chiu su v quay lui, vt cn, ng dng trong tnh ton cc biu thc,
Phan Dinh The Huan 81

Cu trc d liu - Bi 2

Stack - T chc lu tr
Stack c th c biu din di dng danh sch c (mng1 chiu) hoc danh sch lin kt Stack c mt ch im vo phn t trn nh gi l stackpointer: l gi tr top i vi dng DS c, l con tr pHead i vi dng DS lin kt. pHead
N

top 4 3 2 1

typedef struct tagStack { Data a[N]; int top; }Stack;


Cu trc d liu - Bi 2 Phan Dinh The Huan

List s;
82

Stack - Cc php ton trn stack


1. 2. 3. 4. 5.

6.

Khi to Kim tra rng Kim tra y (biu din dng DS c) Thm 1 phn t vo stack Ly thng tin v loi b phn t nh stack Xem thng tin ca phn t nh stack

Cu trc d liu - Bi 2

Phan Dinh The Huan

83

Cc php ton trn stack 1.Khi to


N-1 pHead

3 2 1 0

top

void init(Stack &s) { s.top=0; }

void init(List &s) { s.pHead=NULL; }

Cu trc d liu - Bi 2

Phan Dinh The Huan

84

Cc php ton trn stack 2.Kim tra rng


pHead N-1 top

3 2 1 0

int isEmpty(const Stack &s) { return(s.top==0); }

int isEmpty(const List &s) { return (s.pHead==NULL); }

Cu trc d liu - Bi 2

Phan Dinh The Huan

85

Cc php ton trn stack 3.Kim tra y


N-1 top

3 2 1 0

int isFull(const Stack &s) { return(s.top==N); }

Cu trc d liu - Bi 2

Phan Dinh The Huan

86

Cc php ton trn stack 4.Thm 1 phn t


pHead N-1 N-1 pHead

C
x=C

top 3 2 1 0

top

3 2 1 0

D L

T D L

T D L

x=C

C T D L

int push(Stack &s, Data x) { if(s.top < N) //cha y { s.a[s.top]=x; s.top++; return 1; } return 0; }
Cu trc d liu - Bi 2

int push(List &s, Data x) { return (insertHead(s,x)!=NULL); }

Phan Dinh The Huan

87

Cc php ton trn stack 5.Ly thng tin v loi b phn t


pHead N-1 top N-1

pHead

3 2 1 0

pop

3 2 1 0

T
pop

T D L

C T D L

top

C T D L

D L

Data pop(Stack &s) { Data x; if(s.top>0) { s.top--; x = s.a[s.top]; return x; } return NULLDATA; }
Cu trc d liu - Bi 2

Data pop(List &s) { Data x; if(!isEmpty(s)) { x = s.pHead->info; deleteHead(s); return x; } return NULLDATA; }
Phan Dinh The Huan 88

Cc php ton trn stack 6.Xem thng tin phn t nh


pHead N-1 top

3 2 1 0

getTop

C T D L

T D L

getTop

Data getTop(const Stack &s) { Data x; if(s.top>0) { x = s.a[s.top-1]; return x; } return NULLDATA; }
Cu trc d liu - Bi 2

Data getTop(const List &s) { if(!isEmpty(s)) return s.pHead->info; return NULLDATA; }

Phan Dinh The Huan

89

Queue Hng i
1. 2. 3.

nh ngha T chc lu tr Cc php ton trn queue

out

in

Cu trc d liu - Bi 2

Phan Dinh The Huan

90

Queue nh ngha
1.

2.

3.

Queue (hng i) l mt danh sch hot ng theo c ch FIFO (First In First Out Vo trc ra trc) Thao tc thm v hy c thc hin 2 pha ca queue c ch FIFO: phn t no vo trc s c ly ra trc ng dng: kh quy, t chc lu vt cc qu trnh tm kim theo chiu rng v quay lui, vt cn, ng dng trong qun l v phn phi tin trnh ca h iu hnh, t chc b m bn phm,
Phan Dinh The Huan 91

Cu trc d liu - Bi 2

Queue T chc lu tr
Queue c th c biu din di dng danh sch c (mng1 chiu) hoc danh sch lin kt Queue c 2 ch im vo phn t u v cui ca queue: l cp gi tr front, rear i vi dng DS c, l cp con tr pHead, pTail i vi dng DS lin kt.
out
0 1 2 front rear

in
N-1

typedef struct tagCQueue { Data a[N]; int front, rear; }CQueue;

typedef struct tagLQueue { Node *pHead; Node *pTail; }LQueue; C


Phan Dinh The Huan

pTail Y
92

pHead

Cu trc d liu - Bi 2

Queue Cc php ton trn queue


1. 2. 3. 4. 5. 6.

Khi to Kim tra rng Kim tra y (trng hp DS c) Thm 1 phn t (vo cui) Loi b 1 phn t ( u) Xem thng tin phn t u

Cu trc d liu - Bi 2

Phan Dinh The Huan

93

Cc cch hin thc Queue trn c s danh sch c


Cch 1:
0 1 1 front front

rear

...
N-1

Cch 2:
0

rear

...
N-1

Cch 1: rear ch chnh xc vo v tr Cch 2: rear ch vo v tr sau phn t phn t cui. cui. Khi to: front=0; rear=N-1; count=0; Khi to: front=0; rear=0; Khi rng: front=(rear+1)%N; i [0,N-1], a[i]=NULLDATA count=0; Khi rng: front=rear; Khi y: front=(rear+1)%N; a[front]=NULLDATA; count=N; Khi y: front=rear; Thm vo: a[++rear] = x; a[front]!=NULLDATA Ly ra: x=a[front++]; Thm vo: a[rear++] = x; Kim tra rng: ? count==0; Ly ra: x=a[front++]; Kim tra y: ? count==N; Kim tra rng: ? a[front]==NULLDATA; Kim tra y: ? front==rear && ch c ch xoay Cu trc Phan Dinh The Huan 94 a[front]!=NULLDATA; vngd liu - Bi 2 queue trong

Ch v cch hin thc Queue trn c s danh sch lin kt


pTail

pHead

typedef struct tagLQueue { Node *pHead; Node *pTail; }LQueue;

Cc thao tc trn DSLK n c s dng pTail cng tng t nh DSLK n khng c pTail. Tuy nhin cc thao tc insert, delete phc tp hn do phi xt n pTail

Cu trc d liu - Bi 2

Phan Dinh The Huan

95

Cc php ton trn queue 1. Khi to


pTail
[0] front [1] [2] [N-1] rear

pHead

void initQueue(CQueue &q) { q.front=0; q.rear=N-1; q.count=0; }

void initQueue(LQueue &q) { q.pHead=q.pTail= NULL; }

Cu trc d liu - Bi 2

Phan Dinh The Huan

96

Cc php ton trn queue 2. Kim tra rng


pTail
[0] front [1] [2] [N-1] rear

pHead

int isEmpty(const CQueue &q) { return (q.count==0); }

int isEmpty(const LQueue &q) { return (q.pHead==NULL); }

Cu trc d liu - Bi 2

Phan Dinh The Huan

97

Cc php ton trn queue 3. Kim tra y


[0] [1] [2] [3] [N-1]

rear front

int isFull(const CQueue &q) { return (q.count==N); }

Cu trc d liu - Bi 2

Phan Dinh The Huan

98

Cc php ton trn queue 4. Thm 1 phn t (vo cui)


[0] [1] [2] [3] [4] [N-1] pTail pHead

1
x=8 [0] [1] [2] [3] front [4]

3
rear [N-1]

A
pHead

B B

C C

F F Y

pTail

8
rear

1
front

int enQueue(CQueue &q, Data x) { if(!isFull(q)) { q.rear=(q.rear+1)%N; q.a[q.rear]=x; return 1; } return 0; }


Cu trc d liu - Bi 2

int enQueue(LQueue &q, Data x) { return (insertTail(q,x)!=NULL); }

Phan Dinh The Huan

99

Cc php ton trn queue


5. Ly v loi b phn t ( u)
[0] [1] [2] [3] [4] [5] [N-1]

8
rear deQueue [0] [1] [2] [3]

1
front

pHead

A A B C F Y
pTail

pTail

1
[4] [5] [N-1]

pHead

8
rear

3
front

Data deQueue(CQueue &q) { if(isEmpty(q)) return NULLDATA; Data x; x = q.a[q.front]; q.front=(q.front+1)%N; return x; }
Cu trc d liu - Bi 2

Data deQueue(LQueue &q) { if(isEmpty(q)) return NULLDATA; Data x; x=q.pHead->info; deleteHead(q); return x; }
Phan Dinh The Huan 100

Cc php ton trn queue 6. Ly thng tin phn t u


[0] [1] [2] [3] [4] [5] [N-1] pTail pHead

8
rear

1
front

3 1 8

A getFront getRear

C A Y

getFront getRear

Data getFront(const CQueue &q) { if(isEmpty(q)) return NULLDATA; return q.a[q.front]; } Data getRear(const CQueue &q) { if(isEmpty(q)) return NULLDATA; return q.a[q.rear]; }
Cu trc d liu - Bi 2

Data getFront(const LQueue &q) { if(isEmpty(q)) return NULLDATA; return q.pHead->info; } Data getRear(const LQueue &q) { if(isEmpty(q)) return NULLDATA; return q.pTail->info; }
101

Phan Dinh The Huan

Tm tt
1. 2.

3. 4.

5. 6.

Stack l cu trc LIFO, Queue thuc dng FIFO. C stack v queue u c th c hin thc da trn DS c hoc DS lin kt. Cc thao tc chnh trong stack: push, pop, getTop Cc thao tc chnh trong queue: enqueue, dequeue, getFront. Stack: thm vo Top, ly ra Top. Queue: thm vo Rear, ly ra Front.

Cu trc d liu - Bi 2

Phan Dinh The Huan

102

MT S NG DNG CA DANH SCH

Cu trc d liu - Bi 2

Phan Dinh The Huan

103

5. ng dng ca danh sch


1. 2. 3.

My tnh b ti [4].2.3 Bi ton a thc [4].4.5 Bi ton tnh gi tr biu thc [4].13
Tnh gi tr biu thc hu t (postfix) Chuyn biu thc trung t (infix) sang hu t

4.

Mt s ng dng khc (c thm) :


Bi ton 8-Hu v phng php kh quy bng backtracking [4].5.3 Stack frame trong trnh bin dch [1]

Cu trc d liu - Bi 2

Phan Dinh The Huan

104

5.1 My tnh b ti
1.

2.

M t: xy dng chng trnh minh ha mt my tnh b ti dng n gin. Cch biu din:
Php ton c nhp vo di dng hu t.
VD: tnh (a*(b-c))+d biu thc hu t: abc-*d+=

ng dng stack tnh kt qu biu thc

Cu trc d liu - Bi 2

Phan Dinh The Huan

105

5.1 My tnh b ti (tt)

Cu trc d liu - Bi 2

Phan Dinh The Huan

106

5.1 My tnh b ti (tt)


3.

V d: tnh gi tr: 3*(4-1)+2

Cu trc d liu - Bi 2

Phan Dinh The Huan

107

5.2 Bi ton a thc


1. 2.

Biu din a thc Cc php ton trn a thc


Cng 2 a thc Tr 2 a thc Nhn 2 a thc Chia 2 a thc

3.

Chng trnh

Cu trc d liu - Bi 2

Phan Dinh The Huan

108

5.2 Bi ton a thc (tt)


1.

Biu din a thc


h s

s m

Cu trc d liu - Bi 2

Phan Dinh The Huan

109

5.2 Bi ton a thc (tt)


1.

Biu din a thc


h s typedef struct tagNode { double coefficient; //h s int degree; //s m Node *pNext; }Node; typedef struct tagList { Node *pHead; }List;

s m

Cu trc d liu - Bi 2

Phan Dinh The Huan

110

5.2 Bi ton a thc (tt)


2.

Cc php ton trn a thc


Cng 2 a thc Tr 2 a thc Nhn 2 a thc Chia 2 a thc

thc hin cc php ton gia 2 a thc, mt stack c to ra lu tr cc a thc ny. Khi ngi dng yu cu thc hin php ton, php ton c tin hnh v kt qu c lu li vo stack.
Cu trc d liu - Bi 2 Phan Dinh The Huan 111

Cch th hin php ton gia cc a thc


3x5 2x3 + x2 + 4 x2 + 1 3x5 2x3 + x2 + 4 x2 + 1 3x5 2x3 + 2x2 + 5

x2 + 1 3x5 2x3 + x2 + 4
1.Nhp a thc P
Cu trc d liu - Bi 2

3x5 2x3 + x2 + 4
2.Nhp a thc Q
Phan Dinh The Huan

3x5 2x3 + 2x2 + 5


3. Cng P v Q
112

5.2 Bi ton a thc (tt)


3.

Chng trnh

Nhp a thc: 3x5 2x3 + x2 + 4

Cu trc d liu - Bi 2

Phan Dinh The Huan

113

5.2 Bi ton a thc (tt)


3.

Chng trnh (tt)


Nhp a thc: x2 + 1

Kt qu php cng 2 a thc


Cu trc d liu - Bi 2 Phan Dinh The Huan 114

5.3 Bi ton tnh gi tr biu thc


1. 2. 3. 4.

Biu thc dng trung t l g? Biu thc dng hu t l g? Tnh gi tr biu thc hu t (postfix) Chuyn biu thc dng trung t (infix) sang dng hu t

Cu trc d liu - Bi 2

Phan Dinh The Huan

115

5.3 Bi ton tnh gi tr biu thc(tt)


1.

Biu thc dng trung t l g?


L cch vit t nhin ca biu thc Vd: 8 + 2 * (5 - 2)

Cu trc d liu - Bi 2

Phan Dinh The Huan

116

5.3 Bi ton tnh gi tr biu thc(tt)


2.

Biu thc dng hu t l g?


Dng hu t (postfix) cn c gi l dng k php nghch o Ba Lan (reverse Polish) Dng hu t c pht trin phc v cho vic tnh ton gi tr biu thc trn my tnh. Trong biu thc dng ny, ton t lun ng sau ton hng ca n. Vd: biu thc 8 + 2 * (5 - 2) c dng hu t tng ng l: 8 2 5 2 - * +

Cu trc d liu - Bi 2

Phan Dinh The Huan

117

5.3 Bi ton tnh gi tr biu thc(tt)


3.

Tnh gi tr biu thc hu t (postfix)


Trong qu trnh duyt biu thc, khi gp cc ton hng, chng ta phi hon vic tnh ton cho n khi gp ton t tng ng ca chng, do chng s c y vo stack. Khi gp ton t, ton hng s c ly ra khi stack v thc hin tnh ton, ri y kt qu vo li stack.

Cu trc d liu - Bi 2

Phan Dinh The Huan

118

5.3 Bi ton tnh gi tr biu thc(tt)


4.

Chuyn biu thc dng trung t (infix) sang dng hu t

Cu trc d liu - Bi 2

Phan Dinh The Huan

119

5.3 Bi ton tnh gi tr biu thc(tt)


4.

Chuyn biu thc dng trung t (infix) sang dng hu t (tt)

Cu trc d liu - Bi 2

Phan Dinh The Huan

120

Kt lun
Mt s li khuyn trong vic la chn v s dng danh sch
1.

Danh sch:
1. 2.

3.

ng bi ri gia danh sch c v mng Khi lm vic vi danh sch ni chung, vic u tin l phi xc nh danh sch ny cn dng nhng php ton no, sau chn cch ci t sao cho cc php ton c thc hin d dng nht. Khi chn la gia DS c v DS lin kt, cn xem xt cc php ton trn DS. DSLK mm do hn trong cc php chn, xo v sp xp li; trong khi DS c cho php truy xut ngu nhin.
Phan Dinh The Huan 121

Cu trc d liu - Bi 2

Kt lun (tt)
1.

Danh sch(tt):
4.

5.

DS c thng i hi t hao tn b nh, thi gian; v n lc lp trnh trong thao tc thm cc phn t vo DS cng nh, cn thut ton th n gin. Khi DS cha s lng ln d liu, DSLK li thng gip tit kim b nh, thi gian x l v k c n lc lp trnh. B nh ng v con tr cho php chng trnh t ng thch nghi vi cc ng dng c ln v cung cp kh nng linh hot trong cp pht b nh gia cc cu trc d liu khc nhau. B nh tnh (mng) i khi hiu qu hn i vi cc bi ton c kch c c xc nh trc.
Phan Dinh The Huan 122

Cu trc d liu - Bi 2

Kt lun (tt)
2.

Stack:
1.

2.

Stack l mt dng cu trc d liu n gin nht; hy s dng stack khi c th! Trong cc bi ton i hi o ngc d liu, hy ngh n stack lu tr d liu.

Cu trc d liu - Bi 2

Phan Dinh The Huan

123

Ht bi 2

Cu trc d liu - Bi 2

Phan Dinh The Huan

124

Вам также может понравиться