c5 Danhsachlienket

You might also like

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

n-2

n-1

Chng 6: Danh sch lin kt

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

Danh sch lin kt i: mi phn t lin kt vi cc phn t


ng trc v sau n trong danh sch:
A

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

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;

pTail

pHead
A

Chng 6: Danh sch lin kt

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;

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

pTail

pHead

X
new_node

new_node->pNext = pHead;
pHead = new_node;

Chng 6: Danh sch lin kt

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;

Ngc li

new_node->pNext = pHead;

pHead = new_node;

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;

X
new_node

Chng 6: Danh sch lin kt

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

Ngc li

pHead = pTail = new_node;

pTail->pNext = new_node ;

pTail = new_node;

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;

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

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

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)

C cc thao tc:

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

Chng 6: Danh sch lin kt

18

DSLK n Cc thao tc c s
68

Xa node sau node q trong danh sch


q

last

first
A

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:

Bc 2:

Tm phn t p c kha k v phn t q ng trc n


Nu (p!= NULL) th

// 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

{
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

phn t
c kho
k

}
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

B1.2:

Hy p;

Bc 2:

pTail = NULL;

//Bo m tnh nht qun khi xu rng

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;
};

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

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

Chng 6: Danh sch lin kt

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)
A

(2)
X
new_node

(1)

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)
(1)

X
new_node
Chng 6: Danh sch lin kt

DSLK i Thm vo cui ds


122

pHead

pTail
(3)
A

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

Gi hm??

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

pHead
A

D
(1)
(2)

Chng 6: Danh sch lin kt

(3)

X
new_node

25

DSLK i Chn vo sau q


125

pHead

pTail
q

p
B

(2)

(4)
(3)

(1)

X
new_node

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)

(2)

(4)
X

(1)

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

Head
A

Tail
Head
A

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);

// cha i gip vng

return p;
}

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

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;
}
}

Chng 6: Danh sch lin kt

32

DSLK vng Hy nt u ds
148

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;
}

Chng 6: Danh sch lin kt

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