Xin vui lòng yên lặng!
description
Transcript of Xin vui lòng yên lặng!
Lê Mậu Long 1
•Xin vui lòng yên lặng!
Lê Mậu Long 2
Danh sach liên kêt(Linked List)
Lê Mậu Long 3
Giơi thiêu• Đinh nghia: La danh sach bao gôm cac
phân tư kêt nôi vơi nhau băng 1 hay nhiêu môi liên kêt
Lê Mậu Long 4
Cac thao tac trên danh sach• Khơi tao danh sach rông• Kiêm tra danh sach rông?• Chen phân tư vao danh sach• Xoa phân tư trong danh sach• Tim kiêm phân tư trong danh sach• Khơi đâu tư đâu danh sach• Lây dư liêu 1 phân tư• Chuyên sang phân tư kê tiêp• Hêt danh sach• ….
Lê Mậu Long 5
Danh sach liên kêt đơn• La danh sach ma môi phân tư co 1 môi liên
kêt đê kêt nôi vơi phân tư kê tiêp
• Cai đăt: dưa trên con tro, bao gôm:• 3 con tro: head (đâu ds), pos (phân tư hiên hanh),
va rear (cuôi ds) • biên count: sô phân tư cua danh sach
head pos rear
Lê Mậu Long 6
Mô ta kiêu dư liêu
typedef struct nodet {
elem data;
struct nodet *next;
} node;
typedef node *nodeptr; data next
Lê Mậu Long 7
typedef struct {
nodeptr head, pos, rear;
int count;
} list;
head pos rear
Lê Mậu Long 8
Khơi tao danh sach rông
Gan – head, pos va rear = NULL– count = 0
// Ham khơi taovoid createlist(list &l){
l.head = l.pos = l.rear = NULL;l.count = 0;
}
Lê Mậu Long 9
Kiêm tra danh sach rông?
• Kiêm tra sô phân tư = 0
int emptylist(list l)
{
return l.count == 0;
}
Lê Mậu Long 10
Chen phân tư x vao danh sach – cuc bô (local)
• Câp phat bô nhơ cho newp va gan dư liêu• Chen ơ đâu ds (p==NULL)
newp->next = head;head = newp;
head pos rear
newp
Lê Mậu Long 11
• Chen sau phân tư p (p!=NULL)
newp->next = p->next;
p->next = newp;
head pos rearp
newp
Lê Mậu Long 12
• Trương hơp chen cuôi (newpnext == NULL)
• Thay đôi rear
rear = newp;
head pos rearp
newp
Lê Mậu Long 13
void insertlist(list &l, elem &x, nodeptr p){
nodeptr newp = new node; memcpy(&newp->data, &x, sizeof(elem));if (p==NULL){
newp->next = l.head;l.head = newp;
}else{
newp->next = p->next;p->next = newp;
}if (newp->next == NULL)
l.rear = newp;l.count++;
}
Lê Mậu Long 14
Cac ham chen phân tư – toan cuc (global)• Chen đâu danh sach
void inserthead(list &l, elem &x){
insertlist(l, x, NULL);}
• Chen vi tri hiên hanhvoid insertpos(list &l, elem &x){
insertlist(l, x, l.pos);}
• Chen cuôi danh sachvoid insertrear(list &l, elem &x){
insertlist(l, x, l.rear);}
Lê Mậu Long 15
Xoa phân tư trong danh sach – cuc bô
• Xoa phân tư đâu danh sach (p=NULL)
t = head;head = t->next;
• Xoa phân tư sau p (p!=NULL)
t = p->next;p->next = t->next;
p
head p reart
headrear
t
Lê Mậu Long 16
void deletelist(list &l, nodeptr p){ nodeptr t;
if (p==NULL){
t = l.head;l.head = t->next;
}else{
t = p->next;p->next = t->next;
}if (t->next == NULL)
l.rear = p;delete t;l.count--;
}
Lê Mậu Long 17
Cac ham xoa phân tư – toan cuc
• Xoa phân tư đâu danh sachvoid deletehead(list &l){
deletelist(l, NULL);}
• Xoa phân tư tai vi tri hiên hanhvoid deletepos(list &l){
deletelist(l, l.pos);}
Lê Mậu Long 18
Tim kiêm trên DSX=5
1. Khơi đâu tư đâu danh sach (pos = NULL; c = head)
2. Khi chưa hêt ds va chưa tim thây
Chuyên sang phân tư kê tiêp (pos = c; c = cnext)
head pos rearc
1 8 2 5 4 3
Lê Mậu Long 19
Tim kiêm trên DS – ban nhapint searchlist(list &l, elem x){
nodeptr c = l.head;l.pos = NULL;while (c!=NULL && x!=c->data){
l.pos = c;c = c->next;
}return c!=NULL;
}
Lê Mậu Long 20
Tim kiêm trên DS – viêt laiint searchlist(list &l, elem x, int (*comp)(elem, elem)){
nodeptr c = l.head;l.pos = NULL;while (c!=NULL && comp(x, c->data)!=0){
l.pos = c;c = c->next;
}return c!=NULL;
}
Lê Mậu Long 21
Tim kiêm trên DS co thư tưint searchorderlist(list &l, elem x, int (*comp)(elem, elem)){
nodeptr c = l.head;l.pos = NULL;while (c!=NULL && comp(x, c->data)>0){
l.pos = c;c = c->next;
}if (c!=NULL && comp(x, c->data)<0)
return 0;return c!=NULL;
}
Lê Mậu Long 22
Vi duint searchorderlist(list &l, elem x, int
(*comp)(elem, elem)){
nodeptr c = l.head;l.pos = NULL;while (c!=NULL && comp(x, c->data)>0){
l.pos = c;c = c->next;
}if (c!=NULL && comp(x, c->data)<0)
return 0;return c!=NULL;
}
// Ham so sanh trên khoaint ss(int x, int y){
return x-y;}//Đoan chương trinh nhâp day
createlist(l);cout<<"\nNhap day:";do {
cin>>x;if (x>0){ searchorderlist(l, x,
ss); insertpos(l, x);
}} while (x>0);
Lê Mậu Long 23
• Khơi đâu tư đâu danh sachvoid start(list &l){
l.pos = l.head;}
• Chuyên sang phân tư kê tiêpvoid skip(list &l){
if (l.pos == NULL)l.pos = l.head;
elsel.pos = l.pos->next;
}
Lê Mậu Long 24
• Kiêm tra hêt danh sachint eol(list l){
return l.pos == NULL;}
• Lây dư liêu 1 phân tư void getdata(list l, elem &x){
memcpy(&x, &l.pos->data, sizeof(elem));}
• Sô phân tư trong danh sachint nolist(list l){
return l.count;}
Lê Mậu Long 25
Ngăn xêp (Stack)
• La câu truc bao gôm cac phân tư đươc truy xuât theo nguyên tăc “vao sau, ra trươc” (Last In, First Out – LIFO)
Vi du: Chông đia, đôi sô ra nhi phân
19
9
4
2
1
1
1
0
0
1
1
1
0
0
1
Lê Mậu Long 26
Cac thao tac trên Stack
4 thao tac cơ ban trên stack
• Khơi tao stack rông: CreateStack(s)
• Kiêm tra stack rông: EmptyStack(s)
• Đưa phân tu vao Stack: Push(s, x)
• Lây phân tu ra khoi Stack: Pop (s, x)
Lê Mậu Long 27
Cai đăt trên cơ sơ mang
• Sư dung – Mang e[Max] phân tư kiêu elem
(elementtype)– Chi sô top đê chi đinh stack (nơi
đưa vao, lây ra)
• Tao tâp tin Stack.cpp:typedef struct {
elem e[Max];int top;
} stack;
1
1
0
top
e
Max-1
Lê Mậu Long 28
Cac thao tac trên Stack
• Khơi tao stack s rôngvoid createstack(stack &s){
s.top = -1;}• Kiêm tra stack s rông?int emptystack(stack s){
return s.top==-1;}
Lê Mậu Long 29
• Đưa phân tư x vao stack svoid push(stack &s, elem &x){
if (s.top==Max-1) exit(0);memcpy(&s.e[++s.top], &x, sizeof(elem));
}• Lây phân tư x ra khoi stack svoid pop(stack &s, elem &x){
if (s.top==-1) exit(0);memcpy(&x, &s.e[s.top--], sizeof(elem));
}
Lê Mậu Long 30
Ví dụ: Đổi số ra nhị phân#define Max 32#include <iostream.h>typedef int elem;#include "stack.cpp"void main(){
int i, n;stack s;cout<<"\nNhap so can
doi:";cin>>n;createstack(s);while (n>0){
i = n%2;push(s, i);n = n/2;
}
cout<<"Ket qua dang nhi phan :";
while (!emptystack(s)){
pop(s, i);cout<<i;
}}
Lê Mậu Long 31
Đê qui va tổ chức đê qui
Lê Mậu Long 32
Đinh nghia
• Một đinh nghia được gọi la đê qui nêu no được đinh nghia trên chinh no một cach trưc tiêp hay gian tiêp
• Đê qui luôn gôm 2 phân– Phân dừng– Phân đê qui
Lê Mậu Long 33
Vi du
Lê Mậu Long 34
Giai thừa
long gt(int n){
if (n==0) return 1;return n*gt(n-1);
}void main(){
cout<<gt(5);}
Lê Mậu Long 35
Khư bo đê qui
• Sư dung Stack
• Đê qui được thay băng:– Ham đê qui: Vòng lăp– Lời gọi đê qui: Push cac gia tri cuc bộ– Thưc hiên đê qui: Pop cac gia tri cuc bộ
• Lưu ý: Stack la cấu trúc LIFO
Lê Mậu Long 36
Bai toan Thap Hanoi#include <iostream.h>void chuyen(int n, char A, char B, char C){
if (n==1)cout<<"\nChuyen "<<A<<" qua "<<C;
else{
chuyen(n-1, A, C, B);chuyen(1, A, ' ', C);chuyen(n-1, B, A, C);
}}
void main(){
cout<<"\n============ De qui ===============";chuyen(3, 'a', 'b', 'c');
}
Lê Mậu Long 37
Bai toan Thap Hanoi không đê qui1. Khởi tạo stack s rông
2. Push 1 bộ (3, ‘A’, ‘B’, ‘C’) vao s
3. Lăp– Pop ra khoi s 1 bộ (n, A, B, C);– Nêu n=1 thì
• cout<<"\nChuyen "<<A<<" qua "<<C;
– Ngược lại• Push 1 bộ (n-1, B, A, C) vao s• Push 1 bộ (1, A, ‘ ‘, C) vao s• Push 1 bộ (n-1, A, C, B) vao s
4. Cho đên khi s rông
Lê Mậu Long 38
Cai đăt trên cơ sơ con tro
• Cai đăt tương tư như danh sach liên kêt đơn vơi 2 thao tac– Chen đâu danh sach– Lây ra ơ đâu danh sach
s
pop
push
Lê Mậu Long 39
• Tao tâp tin Stack.cpp:typedef struct nodet {
elem data;struct nodet *next;
} node;typedef node *stack;
void createstack(stack &s){
s = NULL;}
Lê Mậu Long 40
int emptystack(stack s){
return s==NULL;}
void push(stack &s, elem &x){
stack newp = new node;memcpy(&newp->data, &x, sizeof(elem));newp->next = s;s = newp;
}
newp
s
Lê Mậu Long 41
void pop(stack &s, elem &x){
stack t = s; if (s==NULL) exit(0);
memcpy(&x, &s->data, sizeof(elem));s = s->next;delete t;
}Chay lai chương trinh đôi nhi phân, nhân xet?
s
t
Lê Mậu Long 42
Hang đơi (Queue)
• La câu truc bao gôm cac phân tư đươc truy xuât theo nguyên tăc “vao trươc, ra trươc” (First In, First Out – FIFO)
Vi du: Cac vung đêm giao tiêp giưa may tinh va cac thiêt bi
Lê Mậu Long 43
Cac thao tac trên Queue
4 thao tac cơ ban trên queue
• Khơi tao queue rông: CreateQueue(q)
• Kiêm tra queue rông: EmptyQueue(q)
• Đưa phân tu vao queue : AddQueue(q, x)
• Lây phân tu ra khoi queue : RemoveQueue(q, x)
Lê Mậu Long 44
Cai đăt trên cơ sơ mang• Sư dung
– Mang e[Max] phân tư kiêu elem (elementtype)– Chi sô
– front đê chi đâu hang đơi (nơi lây ra)
– rear đê chi cuôi hang đơi (nơi đưa vao)
Hai chi sô front va rear tăng xoay vong
• Tao tâp tin Queue.cpp:
typedef struct {
elem e[Max];
int front, rear;
} queue;
Lê Mậu Long 45
Cac thao tac trên Queue
• Khơi tao queue q rôngvoid createqueue(queue &q){
q.front = q.rear = 0;}• Kiêm tra queue q rông?int emptyqueue(queue q){
return q.front == q.rear;}
Lê Mậu Long 46
• Đưa phân tư x vao queue qvoid addqueue(queue &q, elem &x){
int nr = (q.rear + 1) % Max;if (nr == q.front) exit(0);memcpy(&q.e[q.rear], &x, sizeof(elem));q.rear = nr;
}• Lây phân tư x ra khoi queue qvoid removequeue(queue &q, elem &x){
if (q.front == q.rear) exit(0);memcpy(&x, &q.e[q.front], sizeof(elem));q.front = (q.front + 1) % Max;
}
Lê Mậu Long 47
Vi du: Radix sort• Săp xêp day sô nguyên dương tăng dân71, 32, 53, 70, 50 , 63, 84, 15, 26, 19, 8, 37, 17, 46, 98, 21
8, 15, 17, 19, 21, 26, 32, 37, 46, 50, 53, 63, 70, 71, 84, 98
70
50
71
21
32 53
63
84
0 1 2 3 4 5 6 7 8 9
15 26
46
37
17
8
98
19
70
71
5021 32
53
63 8415
26
46
3717
8 98
19
Lê Mậu Long 48
Cai đăt trên cơ sơ con tro
• Cai đăt tương tư như danh sach liên kêt đơn vơi 2 thao tac– Chen cuôi danh sach– Lây ra ơ đâu danh sach
front
remove add
rear
Lê Mậu Long 49
• Tao tâp tin Queue.cpp:typedef struct nodet {
elem data;struct nodet *next;
} node;typedef node *nodeptr;typedef struct {
nodeptr front, rear;} queue;
void createqueue(queue &q){
q.front = NULL;}
Lê Mậu Long 50
int emptyqueue(queue q){
return q.front == NULL;}
void addqueue(queue &q, elem &x){
nodeptr newp = new node;memcpy(&newp->data, &x, sizeof(elem));newp->next = NULL;if (q.front == NULL)
q.front = newp;else
q.rear->next = newp;q.rear = newp;
}
newp
frontrear
Lê Mậu Long 51
void removequeue(queue &q, elem &x)
{
nodeptr t = q.front;
if (q.front == NULL) exit(0);
q.front = t->next;
memcpy(&x, &t->data, sizeof(elem));
delete t;
}
front
t rear
Lê Mậu Long 52
• Viêt ham tach danh sach liên kêt đơn chứa cac sô nguyên thanh 2 danh sach chẵn/lẻ