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

Preview:

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

Citation preview

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ẻ

Recommended