Xin vui lòng yên lặng!

52
Lê Mậu Long 1 Xin vui lòng yên lặng!

description

Xin vui lòng yên lặng!. Danh sách liên kết (Linked List). Giới thiệu. Định nghĩa: Là danh sách bao gồm các phần tử kết nối với nhau bằng 1 hay nhiều mối liên kết. Các thao tác trên danh sách. Khởi tạo danh sách rỗng Kiểm tra danh sách rỗng? - PowerPoint PPT Presentation

Transcript of Xin vui lòng yên lặng!

Page 1: Xin vui lòng yên lặng!

Lê Mậu Long 1

•Xin vui lòng yên lặng!

Page 2: Xin vui lòng yên lặng!

Lê Mậu Long 2

Danh sach liên kêt(Linked List)

Page 3: Xin vui lòng yên lặng!

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

Page 4: Xin vui lòng yên lặng!

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• ….

Page 5: Xin vui lòng yên lặng!

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

Page 6: Xin vui lòng yên lặng!

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

Page 7: Xin vui lòng yên lặng!

Lê Mậu Long 7

typedef struct {

nodeptr head, pos, rear;

int count;

} list;

head pos rear

Page 8: Xin vui lòng yên lặng!

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;

}

Page 9: Xin vui lòng yên lặng!

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;

}

Page 10: Xin vui lòng yên lặng!

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

Page 11: Xin vui lòng yên lặng!

Lê Mậu Long 11

• Chen sau phân tư p (p!=NULL)

newp->next = p->next;

p->next = newp;

head pos rearp

newp

Page 12: Xin vui lòng yên lặng!

Lê Mậu Long 12

• Trương hơp chen cuôi (newpnext == NULL)

• Thay đôi rear

rear = newp;

head pos rearp

newp

Page 13: Xin vui lòng yên lặng!

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

}

Page 14: Xin vui lòng yên lặng!

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

Page 15: Xin vui lòng yên lặng!

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

Page 16: Xin vui lòng yên lặng!

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

}

Page 17: Xin vui lòng yên lặng!

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

Page 18: Xin vui lòng yên lặng!

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

Page 19: Xin vui lòng yên lặng!

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;

}

Page 20: Xin vui lòng yên lặng!

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;

}

Page 21: Xin vui lòng yên lặng!

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;

}

Page 22: Xin vui lòng yên lặng!

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

Page 23: Xin vui lòng yên lặng!

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;

}

Page 24: Xin vui lòng yên lặng!

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

Page 25: Xin vui lòng yên lặng!

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

Page 26: Xin vui lòng yên lặng!

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)

Page 27: Xin vui lòng yên lặng!

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

Page 28: Xin vui lòng yên lặng!

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

Page 29: Xin vui lòng yên lặng!

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

}

Page 30: Xin vui lòng yên lặng!

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;

}}

Page 31: Xin vui lòng yên lặng!

Lê Mậu Long 31

Đê qui va tổ chức đê qui

Page 32: Xin vui lòng yên lặng!

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

Page 33: Xin vui lòng yên lặng!

Lê Mậu Long 33

Vi du

Page 34: Xin vui lòng yên lặng!

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

Page 35: Xin vui lòng yên lặng!

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

Page 36: Xin vui lòng yên lặng!

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

}

Page 37: Xin vui lòng yên lặng!

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

Page 38: Xin vui lòng yên lặ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

Page 39: Xin vui lòng yên lặng!

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

Page 40: Xin vui lòng yên lặng!

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

Page 41: Xin vui lòng yên lặng!

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

Page 42: Xin vui lòng yên lặng!

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

Page 43: Xin vui lòng yên lặng!

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)

Page 44: Xin vui lòng yên lặng!

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;

Page 45: Xin vui lòng yên lặng!

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

Page 46: Xin vui lòng yên lặng!

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;

}

Page 47: Xin vui lòng yên lặng!

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

Page 48: Xin vui lòng yên lặng!

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

Page 49: Xin vui lòng yên lặng!

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

Page 50: Xin vui lòng yên lặng!

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

Page 51: Xin vui lòng yên lặng!

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

Page 52: Xin vui lòng yên lặng!

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ẻ