Professional Documents
Culture Documents
c5 Danhsachlienket
c5 Danhsachlienket
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)
Gii thiu
3
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.
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
Gii thiu
5
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
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
Gii thiu
7
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:
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
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
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
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)
DSLK n Khai bo
23
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
struct SinhVien { char Ten[30]; int MaSV; }; struct SVNode { SinhVien data; SVNode *pNext; };
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
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??
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
DSLK n Cc thao tc c s
31
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
DSLK n Cc thao tc c s
33
Gn vo u danh sch Gn vo cui danh sch Chn vo sau nt q trong danh sch
DSLK n Cc thao tc c s
34
Thm mt phn t
X new_node
DSLK n Cc thao tc c s
35
Thm mt phn t
pTail
X 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
Ngc li
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
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);
DSLK n Cc thao tc c s
40
Gn vo u danh sch Gn vo cui danh sch Chn vo sau nt q trong danh sch
DSLK n Cc thao tc c s
41
Thm mt phn t
X new_node
10
DSLK n Cc thao tc c s
42
Thm mt phn t
pTail
pHead
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
Ngc li
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
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);
DSLK n Cc thao tc c s
47
Gn vo u danh sch Gn vo cui danh sch Chn vo sau nt q trong danh sch
12
DSLK n Cc thao tc c s
48
Thm mt phn t
X new_node
DSLK n Cc thao tc c s
49
Thm mt phn t
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; } }
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
Gn nt mi vo sau nt q (???)
Ngc li th bo li
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
14
DSLK n Cc thao tc c s
54
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)
DSLK n Cc thao tc c s
55
Bc 1: p = pHead; //Cho p tr n phn t u danh sch Bc 2: Trong khi (Danh sch cha ht) thc hin:
// 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
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???
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
16
DSLK n Cc thao tc c s
62
Xa node u ca danh sch Xa node sau node q trong danh sch Xa node c kho k
DSLK n Cc thao tc c s
63
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
DSLK n Cc thao tc c s
64
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; }
DSLK n Cc thao tc c s
66
Xa node u ca danh sch Xa node sau node q trong danh sch Xa node c kho k
DSLK n Cc thao tc c s
67
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:
18
DSLK n Cc thao tc c s
68
last
DSLK n Cc thao tc c s
69
DSLK n Cc thao tc c s
70
Xa node u ca danh sch Xa node sau node q trong danh sch Xa node c kho k
19
DSLK n Cc thao tc c s
71
Bc 1:
Bc 2:
// tm thy k
Ngc li
Bo khng c k
DSLK n Cc thao tc c s
72
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
20
DSLK n Cc thao tc c s
74
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:
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;
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???
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???
21
DSLK n Cc thao tc c s
77
Exercise
78
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
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)
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
struct DNode { DataType data; DNode* pPre; DNode* pNext; }; struct DList { DNode* pHead; DNode* pTail; };
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;
}
DSLK i Thm 1 nt vo ds
118
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
DSLK i Thm vo u ds
119
pHead
pTail
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)
pHead
(1)
X new_node
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??
25
pTail
p
C D
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
p
B (4) X (2)
q C (1) D
new_node
26
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
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
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
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
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
int removeNode (DList &l, int k) { DNode *p = l.pHead; while (p != NULL) { if (p->data== k) break; p = p->pNext; }
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); }
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)
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
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)
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
30
DSLK vng
142
Head
Tail Head A B C D
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
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
31
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
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
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
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; }
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