Download as pdf or txt
Download as pdf or txt
You are on page 1of 33

CHAPTER 6: DANH SCH LIN KT (LINKED LISTS)

Ni dung
2

Gii thiu Danh sch lin kt n (Single Linked List) Danh sch lin kt i (Double Linked List) Danh sch lin kt vng (Circular Linked List)

Chng 6: Danh sch lin kt

Gii thiu
3

Kiu d liu tnh

Khi nim: Mt s i tng d liu khng thay thay i c kch thc, cu trc, trong sut qu trnh sng. Cc i tng d liu thuc nhng kiu d liu gi l kiu d liu tnh. Mt s kiu d liu tnh: cc cu trc d liu c xy dng t cc kiu c s nh: kiu thc, kiu nguyn, kiu k t ... hoc t cc cu trc n gin nh mu tin, tp hp, mng ...

Cc i tng d liu c xc nh thuc nhng kiu d liu ny thng cng ngt, g b kh din t c thc t vn sinh ng, phong ph.

Chng 6: Danh sch lin kt

Gii thiu
4

Mt s hn ch ca CTDL tnh

Mt s i tng d liu trong chu k sng ca n c th thay i v cu trc, ln, nh danh sch cc hc vin trong mt lp hc c th tng thm, gim i ... Nu dng nhng cu trc d liu tnh bit nh mng biu din Nhng thao tc phc tp, km t nhin chng trnh kh c, kh bo tr v nht l kh c th s dng b nh mt cch c hiu qu D liu tnh s chim vng nh dnh cho chng sut qu trnh hot ng ca chng trnh s dng b nh km hiu qu

Chng 6: Danh sch lin kt

Gii thiu
5

Cu trc d liu tnh: V d: Mng 1 chiu


Kch thc c nh (fixed size) Chn 1 phn t vo mng rt kh Cc phn t tun t theo ch s 0 n-1 Truy cp ngu nhin (random access)

chn

0
Chng 6: Danh sch lin kt

n-2

n-1

Gii thiu
6

Cu trc d liu ng: V d: Danh sch lin kt, cy


Cp pht ng lc chy chng trnh Cc phn t nm ri rc nhiu ni trong b nh Kch thc danh sch ch b gii hn do RAM Thao tc thm xo n gin

Insert, Delete

Chng 6: Danh sch lin kt

Gii thiu
7

Danh sch lin kt:


Mi phn t ca danh sch gi l node (nt) Mi node c 2 thnh phn: phn d liu v phn lin kt cha a ch ca node k tip hay node trc n Cc thao tc c bn trn danh sch lin kt:

Thm mt phn t mi Xa mt phn t Tm kim

Chng 6: Danh sch lin kt

C nhiu kiu t chc lin kt gia cc phn t trong danh sch nh:

Danh sch lin kt n Danh sch lin kt kp Danh sch lin kt vng

Chng 6: Danh sch lin kt

Gii thiu
9

Danh sch lin kt n: mi phn t lin kt vi phn t ng sau n trong danh sch:
A B X Z Y

Danh sch lin kt i: mi phn t lin kt vi cc phn t ng trc v sau n trong danh sch:
A B C D

Chng 6: Danh sch lin kt

Gii thiu
10

Danh sch lin kt vng : phn t cui danh sch lin kt vi phn t u danh sch:
A B X Z Y

Chng 6: Danh sch lin kt

Ni dung
21

Gii thiu Danh sch lin kt n (Single Linked List) Danh sch lin kt kp (Doule Linked List) Danh sch lin kt vng (Circular Linked List)

Chng 6: Danh sch lin kt

Danh sch lin kt n (DSLK n)


22

Khai bo Cc thao tc c bn trn DSLK n Sp xp trn DSLK n

Chng 6: Danh sch lin kt

DSLK n Khai bo
23

L danh sch cc node m mi node c 2 thnh phn:


Thnh phn d liu: lu tr cc thng tin v bn thn phn t Thnh phn mi lin kt: lu tr a ch ca phn t k tip trong danh sch, hoc lu tr gi tr NULL nu l phn t cui danh sch Link Khai bo node
Data

struct Node { DataType data; // DataType l kiu nh ngha trc Node *pNext; // con tr ch n cu trc Node };
Chng 6: Danh sch lin kt

DSLK n Khai bo
24

V d 1: Khai bo node lu s nguyn:

struct Node { int data; Node *pNext; };

V d 2: nh ngha mt phn t trong danh sch n lu tr h s sinh vin:

struct SinhVien { char Ten[30]; int MaSV; }; struct SVNode { SinhVien data; SVNode *pNext; };

Chng 6: Danh sch lin kt

DSLK n Khai bo
25

T chc, qun l:

qun l mt DSLK n ch cn bit a ch phn t u danh sch Con tr pHead s c dng lu tr a ch phn t u danh sch. Ta c khai bo: tin li, c th s dng thm mt con tr pTail gi a ch phn t cui danh sch. Khai bo pTail nh sau:

Node *pHead;

Node *pTail;
pHead A
Chng 6: Danh sch lin kt

pTail B X Z Y

DSLK n Khai bo
26

V d: Khai bo cu trc 1 DSLK n cha s nguyn


// kiu ca mt phn t trong danh sch

struct Node { int data; Node* pNext; };


// kiu danh sch lin kt

Khai bo bin kiu danh sch: List tn_bin;

struct List { Node* pHead; Node* pTail; };


Chng 6: Danh sch lin kt

DSLK n Khai bo
27

To mt node mi

Th tc GetNode to ra mt nt cho danh sch vi thng tin cha trong x Node* getNode ( DataType x)
{ Node *p; p = new Node; // Cp pht vng nh cho node if (p==NULL) { cout<<Khong du bo nho!; return NULL; } p->data = x; // Gn d liu cho phn t p p->pNext = NULL; return p; }

Gi hm??

Chng 6: Danh sch lin kt

Danh sch lin kt n (DSLK n)


29

Khai bo Cc thao tc c bn trn DSLK n Sp xp trn DSLK n

Chng 6: Danh sch lin kt

DSLK n
30

Cc thao tc c bn

To danh sch rng Thm mt phn t vo danh sch Duyt danh sch Tm kim mt gi tr trn danh sch Xa mt phn t ra khi danh sch Hy ton b danh sch

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
31

To danh sch rng


pTail pHead

void Init(List &l) { l.pHead = l.pTail = NULL; }

Chng 6: Danh sch lin kt

DSLK n
32

Cc thao tc c bn

To danh sch rng Thm mt phn t vo danh sch Duyt danh sch Tm kim mt gi tr trn danh sch Xa mt phn t ra khi danh sch Hy ton b danh sch

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
33

Thm mt phn t vo danh sch: C 3 v tr thm


Gn vo u danh sch Gn vo cui danh sch Chn vo sau nt q trong danh sch

Ch trng hp danh sch ban u rng

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
34

Thm mt phn t

Nu danh sch ban u rng


pTail pHead

pHead = pTail = new_node;

X new_node

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
35

Thm mt phn t

Nu danh sch ban u khng rng:

Gn node vo u danh sch


pHead

pTail

X new_node
Chng 6: Danh sch lin kt

new_node->pNext = pHead; pHead = new_node;

DSLK n Cc thao tc c s
36

Thut ton: Gn nt vo u DS // input: danh sch, phn t mi new_node // output: danh sch vi new_node u DS Nu DS rng th

pHead = pTail = new_node; new_node->pNext = pHead; pHead = new_node;

Ngc li

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
37

Ci t: Gn nt vo u DS void addHead(List &l, Node* new_node) { if (l.pHead == NULL) // DS rng { l.pHead = l.pTail = new_node; } else { new_node->pNext = l.pHead; l.pHead = new_node; } }
Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
38

Thut ton: Thm mt thnh phn d liu vo u DS // input: danh sch l // output: danh sch l vi phn t cha X u DS

Nhp d liu cho X (???) To nt mi cha d liu X (???) Nu to c:

Gn nt mi vo u danh sch (???)

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
39

V d: Thm mt s nguyn vo u ds: // Nhp d liu cho X int x; cout<<Nhap X=; cin>>x; // To nt mi Node* new_node = getNode(x); // Gn nt vo u ds if (new_node != NULL) addHead(l, new_node);

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
40

Thm mt phn t vo danh sch: C 3 v tr thm


Gn vo u danh sch Gn vo cui danh sch Chn vo sau nt q trong danh sch

Ch trng hp danh sch ban u rng

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
41

Thm mt phn t

Nu danh sch ban u rng


pTail pHead

pHead = pTail = new_node;

X new_node

Chng 6: Danh sch lin kt

10

DSLK n Cc thao tc c s
42

Thm mt phn t

Nu danh sch ban u khng rng:

Gn node vo cui danh sch:

pTail

pHead

pTail->pNext = new_node; pTail = new_node;


Chng 6: Danh sch lin kt

X new_node

DSLK n Cc thao tc c s
43

Thut ton: Thm mt phn t vo cui DS // input: danh sch, phn t mi new_node // output: danh sch vi new_node cui DS

Nu DS rng th

pHead = pTail = new_node; pTail->pNext = new_node ; pTail = new_node;

Ngc li

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
44

Ci t: Gn nt vo cui DS void addTail(List &l, Node *new_node) { if (l.pHead == NULL) { l.pHead = l.pTail = new_node; } else { l.pTail->pNext = new_node; l.pTail = new_node ; } }
Chng 6: Danh sch lin kt

11

DSLK n Cc thao tc c s
45

Thut ton: Thm mt thnh phn d liu vo cui ds // input: danh sch thnh phn d liu X // output: danh sch vi phn t cha X cui DS

Nhp d liu cho X (???) To nt mi cha d liu X (???) Nu to c:

Gn nt mi vo cui danh sch (???)

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
46

V d: Thm mt s nguyn vo cui ds: // Nhp d liu cho X int x; cout<<Nhp X=; cin>>x; // To nt mi Node* p = getNode(x); // Gn nt vo cui DS if (p != NULL) addTail(l, p);

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
47

Thm mt phn t vo danh sch: C 3 v tr thm


Gn vo u danh sch Gn vo cui danh sch Chn vo sau nt q trong danh sch

Ch trng hp danh sch ban u rng

Chng 6: Danh sch lin kt

12

DSLK n Cc thao tc c s
48

Thm mt phn t

Nu danh sch ban u rng


pTail pHead

pHead = pTail = new_node;

X new_node

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
49

Thm mt phn t

Nu danh sch ban u rng

Chn mt phn t sau q


q pTail B C D E

pHead A

X new_node
Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
50

Thut ton: Chn mt phn t sau q // input: danh sch l, q, phn t mi new_node // output: danh sch vi new_node sau q Nu (q != NULL) th: new_node -> pNext = q -> pNext; q -> pNext = new_node ; Nu ( q == l.pTail) th l.pTail = new_node; Ngc li Thm new_node vo u danh sch
Chng 6: Danh sch lin kt

13

DSLK n Cc thao tc c s
51

Ci t: Chn mt phn t sau q void addAfter (List &l, Node *q, Node* new_node) { if (q!=NULL) { new_node->pNext = q->pNext; q->pNext = new_node; if(q == l.pTail) l.pTail = new_node; } }

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
52

Thut ton: Thm mt thnh phn d liu vo sau q // input: danh sch thnh phn d liu X // output: danh sch vi phn t cha X cui DS

Nhp d liu cho nt q (???) Tm nt q (???) Nu tn ti q trong ds th:


Nhp d liu cho X (???) To nt mi cha d liu X (???) Nu to c:

Gn nt mi vo sau nt q (???)

Ngc li th bo li

Chng 6: Danh sch lin kt

DSLK n
53

Cc thao tc c bn

To danh sch rng Thm mt phn t vo danh sch Duyt danh sch Tm kim mt gi tr trn danh sch Xa mt phn t ra khi danh sch Hy ton b danh sch

Chng 6: Danh sch lin kt

14

DSLK n Cc thao tc c s
54

Duyt danh sch

L thao tc thng c thc hin khi c nhu cu x l cc phn t ca danh sch theo cng mt cch thc hoc khi cn ly thng tin tng hp t cc phn t ca danh sch nh:

m cc phn t ca danh sch Tm tt c cc phn t tho iu kin Hy ton b danh sch (v gii phng b nh)

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
55

Duyt danh sch


Bc 1: p = pHead; //Cho p tr n phn t u danh sch Bc 2: Trong khi (Danh sch cha ht) thc hin:

B2.1 : X l phn t p B2.2 : p=p->pNext;

// Cho p tr ti phn t k

void processList (List l) { Node *p = l.pHead; while (p!= NULL) { // x l c th p ty ng dng p = p->pNext; } }
Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
56

V d: In cc phn t trong danh sch void Output (List l) { Node* p=l.pHead; while (p!=NULL) { cout<<p->data<<\t; p=p ->pNext; } cout<<endl; }
Chng 6: Danh sch lin kt

15

DSLK n
59

Cc thao tc c bn

To danh sch rng Thm mt phn t vo danh sch Duyt danh sch Tm kim mt gi tr trn danh sch Xa mt phn t ra khi danh sch Hy ton b danh sch

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
60

Tm kim mt phn t c kha x Node* Search (List l, int x) { Node* p = l.pHead; while (p!=NULL) { if (p->data==x) return p; p=p->pNext; } return NULL; } Gi hm???

Chng 6: Danh sch lin kt

DSLK n
61

Cc thao tc c bn

To danh sch rng Thm mt phn t vo danh sch Duyt danh sch Tm kim mt gi tr trn danh sch Xa mt phn t ra khi danh sch Hy ton b danh sch

Chng 6: Danh sch lin kt

16

DSLK n Cc thao tc c s
62

Xa mt node ca danh sch


Xa node u ca danh sch Xa node sau node q trong danh sch Xa node c kho k

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
63

Xa node u ca danh sch


Gi p l node u ca danh sch (pHead) Cho pHead tr vo node sau node p (l p->pNext) Nu danh sch tr thnh rng th pTail = NULL Gii phng vng nh m p tr ti

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
64

Xa mt node ca danh sch


pHead pTail A p B C D E

l.pHead = p->pNext; delete p;


Chng 6: Danh sch lin kt

17

DSLK n Cc thao tc c s
65

int removeHead (List &l) { if (l.pHead == NULL) return 0; Node* p=l.pHead; l.pHead = p->pNext; if (l.pHead == NULL) l.pTail=NULL; //Nu danh sch rng delete p; return 1; }

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
66

Xa mt node ca danh sch


Xa node u ca danh sch Xa node sau node q trong danh sch Xa node c kho k

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
67

Xa node sau node q trong danh sch

iu kin c th xa c node sau q l:


q phi khc NULL (q !=NULL) Node sau q phi khc NULL (q->pNext !=NULL) Gi p l node sau q Cho vng pNext ca q tr vo node ng sau p Nu p l phn t cui th pTail tr vo q Gii phng vng nh m p tr ti

C cc thao tc:

Chng 6: Danh sch lin kt

18

DSLK n Cc thao tc c s
68

Xa node sau node q trong danh sch


q first A B C D E p

last

q->pNext = p->pNext; delete p;

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
69

Xa node sau node q trong danh sch


int removeAfter (List &l, Node *q ) { if (q !=NULL && q->pNext !=NULL) { Node* p = q->pNext; q->pNext = p->pNext; if (p==l.pTail) l.pTail = q; delete p; return 1; } else return 0; }
Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
70

Xa mt node ca danh sch


Xa node u ca danh sch Xa node sau node q trong danh sch Xa node c kho k

Chng 6: Danh sch lin kt

19

DSLK n Cc thao tc c s
71

Thut ton: Hy 1 phn t c kho k

Bc 1:

Tm phn t p c kha k v phn t q ng trc n Nu (p!= NULL) th

Bc 2:

// tm thy k

Hy p ra khi ds: tng t hy phn t sau q;

Ngc li

Bo khng c k

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
72

Ci t: int removeNode (List &l, int k)


Hy 1 phn t c kho k { Node *p = l.pHead; Tm phn t p c kha k v phn t q ng trc n Node *q = NULL; while (p != NULL) { if (p->data == k) break; q = p; p = p->pNext; } if (p == NULL) { cout<<Khng tm thy k; return 0;} else if (q == NULL) // thc hin xa phn t u ds l p else // thc hin xa phn t p sau q }

Chng 6: Danh sch lin kt

DSLK n
73

Cc thao tc c bn

To danh sch rng Thm mt phn t vo danh sch Duyt danh sch Tm kim mt gi tr trn danh sch Xa mt phn t ra khi danh sch Hy ton b danh sch

Chng 6: Danh sch lin kt

20

DSLK n Cc thao tc c s
74

Hy ton b danh sch

hy ton b danh sch, thao tc x l bao gm hnh ng gii phng mt phn t, do vy phi cp nht cc lin kt lin quan: Thut ton:

Bc 1: Trong khi (Danh sch cha ht) thc hin:

B1.1:

p = pHead; pHead = pHead ->pNext; // Cho p tr ti phn t k Hy p; //Bo m tnh nht qun khi xu rng

B1.2:

Bc 2:

pTail = NULL;

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
75

Hy ton b danh sch: ci t void RemoveList (List &l) { Node *p; while (l.pHead != NULL) { p = l.pHead; l.pHead = p->pNext; delete p; } l.pTail = NULL; }
Gi hm???

Chng 6: Danh sch lin kt

DSLK n Cc thao tc c s
76

m s nt trong danh sch: int CountNodes (List l) { int count = 0; Node *p = l.pHead; while (p!=NULL) { count++; p = p->pNext; } return count; }
Gi hm???

Chng 6: Danh sch lin kt

21

DSLK n Cc thao tc c s
77

Trch phn t u danh sch


Node* PickHead (List &l) Gi hm??? { Node *p = NULL; if (l.pHead != NULL){ p = l.pHead; l.pHead = l.pHead->pNext; p->pNext = NULL; if (l.pHead == NULL) l.pTail = NULL; } return p; }

Chng 6: Danh sch lin kt

Exercise
78

Write a program for buiding single linked list (Display menu)


Add one node at first Add one node at last Add many node at first Add many node at last Add one node after select node Display List Find one node Select and display n(th) node Display node count Remove one node Remove List Get sum of all nodes Inserting a new node in a sorted list

Chng 6: Danh sch lin kt

Danh sch lin kt n (DSLK n)


79

Khai bo Cc thao tc c bn trn DSLK n Sp xp trn DSLK n

Chng 6: Danh sch lin kt

22

Ni dung
114

Gii thiu Danh sch lin kt n (Single Linked List) Danh sch lin kt i (Double Linked List) Danh sch lin kt vng (Circular Linked List)

Chng 6: Danh sch lin kt

Danh sch lin kt i (DSLK i)


115

L danh sch m mi phn t trong danh sch c kt ni vi 1 phn t ng trc v 1 phn t ng sau n

Chng 6: Danh sch lin kt

DSLK i Khai bo cu trc


116

Dng hai con tr:


pPrev lin kt vi phn t ng trc pNext lin kt vi phn t ng sau

struct DNode { DataType data; DNode* pPre; DNode* pNext; }; struct DList { DNode* pHead; DNode* pTail; };
Chng 6: Danh sch lin kt

// tr n phn t ng trc // tr n phn t ng sau

// tr n phn t u ds // tr n phn t cui ds

23

DSLK i To nt mi
117

Hm to nt:
DNode* getNode ( DataType x) Gi hm?? { DNode *p; p = new DNode; // Cp pht vng nh cho phn t if (p==NULL) { cout<<Khong du bo nho; return NULL;
}

p->data = x; // Gn thng tin cho phn t p p->pPrev = p->pNext = NULL; return p; }


Chng 6: Danh sch lin kt

DSLK i Thm 1 nt vo ds
118

C 4 loi thao tc chn new_node vo danh sch:


Cch 1: Chn vo u danh sch Cch 2: Chn vo cui danh sch Cch 3 : Chn vo danh sch sau mt phn t q Cch 4 : Chn vo danh sch trc mt phn t q

Chng 6: Danh sch lin kt

DSLK i Thm vo u ds
119

pHead

pTail

(3) (2) X new_node (1) A B C D

new_node->pNext = l.pHead; l.pHead->pPrev = new_node; l.pHead = new_node;

// (1) // (2) // (3)

Chng 6: Danh sch lin kt

24

DSLK i Thm vo u ds
120

void addHead (DList &l, DNode* new_node) { Gi hm?? if (l.pHead==NULL) l.pHead = l.pTail = new_node; else { new_node->pNext = l.pHead; // (1) l.pHead->pPrev = new_node; // (2) l.pHead = new_node; // (3) pTail } pHead } A B C D
(3) (2) X new_node
Chng 6: Danh sch lin kt

(1)

DSLK i Thm vo cui ds


122

pHead

pTail (3) A B C D (2)

l.pTail->pNext = new_node; new_node->pPrev = l.pTail; l.pTail = new_node;

// (1) // (2) // (3)

(1)

X new_node

Chng 6: Danh sch lin kt

DSLK i Thm vo cui ds


123

void addTail (DList &l, DNode *new_node) { if (l.pHead==NULL) l.pHead = l.pTail = new_node; else { l.pTail->pNext = new_node; new_node->pPrev = l.pTail; l.pTail = new_node; } } pTail
pHead A B C (2)
Chng 6: Danh sch lin kt

Gi hm??

// (1) // (2) // (3)

D (1) (3) X new_node

25

DSLK i Chn vo sau q


125

pHead q A (3) B (4) X new_node (2) (1)

pTail

p
C D

Chng 6: Danh sch lin kt

DSLK i Chn vo sau q


126

void addAfter (DList &l, DNode *q, DNode *new_node) { Gi hm?? DNode *p = q->pNext; if (q!=NULL) { new_node->pNext = p; //(1) if (p != NULL) p->pPrev = new_node; //(2) new_node->pPrev = q; //(3) q->pNext = new_node; //(4) if (q == l.pTail) l.pTail = new_node; } else addFirst (l, new_node); // chn vo u ds }
Chng 6: Danh sch lin kt

DSLK i Chn vo trc q


128

pTail pHead A (3)

p
B (4) X (2)

q C (1) D

new_node

Chng 6: Danh sch lin kt

26

DSLK i Chn vo trc q


129

void addBefore (DList &l, DNode q, DNode* new_node) { DNode* p = q->pPrev; Gi hm?? if (q!=NULL) { new_node->pNext = q; //(1) q->pPrev = new_node; //(2) new_node->pPrev = p; //(3) if (p != NULL) p->pNext = new_node; //(4) if (q == l.pHead) l.pHead = new_node; } else addTail (l, new_node); // chn vo cui ds }
Chng 6: Danh sch lin kt

DSLK i Hy phn t
131

C 5 loi thao tc thng dng hy mt phn t ra khi danh sch lin kt i:


Hy phn t u ds Hy phn t cui ds Hy mt phn t ng sau phn t q Hy mt phn t ng trc phn t q Hy 1 phn t c kha k

Chng 6: Danh sch lin kt

DSLK i Hy u ds
132

int removeHead (DList &l) { if ( l.pHead == NULL) return 0; DNode *p = l.pHead; l.pHead = l.pHead->pNext; l.pHead->pPrev = NULL; delete p; if (l.pHead == NULL) l.pTail = NULL; else l.pHead->pPrev = NULL; return 1; }
Chng 6: Danh sch lin kt

27

DSLK i Hy cui ds
133

int removeTail (DList &l) { if (l.pTail == NULL) return 0; DNode *p = l.pTail; l.pTail = l.pTail->pPrev; l.pTail->pNext = NULL; delete p; if (l.pHead == NULL) l.pTail = NULL; else l.pHead->pPrev = NULL; return 1; }
Chng 6: Danh sch lin kt

DSLK i Hy phn t sau q


134

int removeAfter (DList &l, DNode *q) { if (q == NULL) return 0; DNode *p = q ->pNext ; if (p != NULL) { q->pNext = p->pNext; if (p == l.pTail) l.pTail = q; else p->pNext->pPrev = q; delete p; return 1; } else return 0; }
Chng 6: Danh sch lin kt

DSLK i Hy phn t trc q


135

int removeBefore (DList &l, DNode *q) { if (q == NULL) return 0; DNode *p = q ->pPrev; if (p != NULL) { q->pPrev = p->pPrev; if (p == l.pHead) l.pHead = q; else p->pPrev->pNext = q; delete p; return 1; } else return 0; }
Chng 6: Danh sch lin kt

28

DSLK i Hy phn t c kha k


136

int removeNode (DList &l, int k) { DNode *p = l.pHead; while (p != NULL) { if (p->data== k) break; p = p->pNext; }

Chng 6: Danh sch lin kt

DSLK i Hy phn t c kha k


137

if (p == NULL) return 0; // Khng tm thy k DNode *q = p->pPrev; if (q != NULL) // Xa nt p sau q return removeAfter (l, q); else // Xa p l nt u ds return removeHead (l); }

Chng 6: Danh sch lin kt

DSLK i Nhn xt
138

DSLK i v mt c bn c tnh cht ging nh DSLK n Tuy nhin DSLK i c mi lin kt hai chiu nn t mt phn t bt k c th truy xut mt phn t bt k khc Trong khi trn DSLK n ta ch c th truy xut n cc phn t ng sau mt phn t cho trc iu ny dn n vic ta c th d dng hy phn t cui DSLK i, cn trn DSLK n thao tc ny tn chi ph O(n)

Chng 6: Danh sch lin kt

29

DSLK i Nhn xt
139

B li, xu i tn chi ph gp i so vi xu n cho vic lu tr cc mi lin kt. iu ny khin vic cp nht cng nng n hn trong mt s trng hp. Nh vy ta cn cn nhc la chn CTDL hp l khi ci t cho mt ng dng c th

Chng 6: Danh sch lin kt

Ni dung
140

Gii thiu Danh sch lin kt n (Single Linked List) Danh sch lin kt i (Double Linked List) Danh sch lin kt vng (Circular Linked List)

Chng 6: Danh sch lin kt

Danh sch lin kt vng (DSLK vng)


141

L mt danh sch lin kt n (hoc i) m phn t cui danh sch, thay v mang gi tr NULL, tr ti phn t u danh sch i vi danh sch vng, c th xut pht t mt phn t bt k duyt ton b danh sch

Chng 6: Danh sch lin kt

30

DSLK vng
142

biu din, c th s dng cc k thut biu din nh danh sch n (hoc i)


Tail A B X Z Y

Head

Tail Head A B C D

Chng 6: Danh sch lin kt

DSLK vng Tm kim


143

Danh sch vng khng c phn t u danh sch r rt, nhng ta c th nh du mt phn t bt k trn danh sch xem nh phn t u xu kim tra vic duyt qua ht cc phn t ca danh sch hay cha

Chng 6: Danh sch lin kt

DSLK vng Tm kim


144

Node* Search (List &l, int x) { Node *p = l.pHead; do{ if (p->data== x) return p; p = p->pNext; } while (p != l.pHead); return p; } // cha i gip vng

Chng 6: Danh sch lin kt

31

DSLK vng Thm vo u ds


145

void addHead (List &l, Node *new_node) { if (l.pHead == NULL) { l.pHead = l.pTail = new_node; l.pTail->pNext = l.pHead; } else { new_node->pNext = l.pHead; l.pTail->pNext = new_node; l.pHead = new_node; } }
Chng 6: Danh sch lin kt

DSLK vng Thm vo cui ds


146

void {

addTail (List &l, Node *new_node) if (l.pHead == NULL) { l.pHead = l.pTail = new_node; l.pTail->pNext = l.pHead; } else { new_node->pNext = l.pHead; l.pTail->pNext = new_node; l.pTail = new_node; }

}
Chng 6: Danh sch lin kt

DSLK vng Thm sau nt q


147

Chng 6: Danh sch lin kt

void addAfter (List &l, Node *q, Node *new_node) { if (l.pHead == NULL) { l.pHead = l.pTail = new_node; l.pTail->pNext = l.pHead; } else { new_node->pNext = q->pNext; q->pNext = new_node; if (q == l.pTail) l.pTail = new_node; } }

32

DSLK vng Hy nt u ds
148

Chng 6: Danh sch lin kt

int removeHead (List &l) { Node *p = l.pHead; if (p == NULL) return 0; if (l.pHead == l.pTail) l.pHead = l.pTail = NULL; else { l.pHead = p->pNext; if (p == l.pTail) l.pTail->pNext = l.pHead; } delete p; return 1; }

DSLK vng Hy phn t sau q


149

int removeAfter(List &l, Node *q) { if (q == NULL) return 0; Node *p = q ->pNext ; if (p == q) l.pHead = l.pTail = NULL; else{ q->Next = p->pNext; if (p == l.pTail) l.pTail = q; } delete p; return 1; }
Chng 6: Danh sch lin kt

33

You might also like