1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng cấu trúc dữ liệu - Chương 2 Cấu trúc dữ liệu danh sách pdf

80 968 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Cấu trúc dữ liệu danh sách
Tác giả Nguyễn Thanh Cẩm
Trường học Khoa Học Máy Tính, Đại Học Bách Khoa Hà Nội
Chuyên ngành Cấu trúc dữ liệu
Thể loại Bài giảng
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 80
Dung lượng 906 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Phép duyệt danh sách: là phép thăm tất cả các phần tử của danh sách thỏa mãn nào đó để thực hiện công việc Ví dụ: Phép tìm kiếm: là thao tác tìm phần tử trong danh sách thỏa mãn điều

Trang 3

a Định nghĩa

b Các phép toán trên danh sách

Trang 4

Số các phần tử (n) của danh sách gọi là độ dài

của danh sách Nếu n=0 thì ta có danh sách rỗng

Ví dụ:

a Định nghĩa

Trang 5

Phép duyệt danh sách: là phép thăm tất cả các

phần tử của danh sách thỏa mãn <điều kiện> nào

đó để thực hiện công việc <xử lý>

Ví dụ:

Phép tìm kiếm: là thao tác tìm phần tử trong danh

sách thỏa mãn điều kiện nào đó

Ví dụ:

Trang 6

1 Danh sách

Thêm phần tử vào danh sách: là thao tác thêm

phần tử mới Vào danh sách Phần tử có thể được thêm vào cuối, đầu hoặc giữa danh sách

Chú ý danh sách đầy

Ví dụ:

b Các phép toán trên danh sách

Trang 7

Loại bỏ phần tử khỏi danh sách: là thao tác loại

bỏ phần tử khỏi danh sách Trước khi loại bỏ phải xác định phần tử cần loại bỏ (tìm kiếm)

Chú ý: sau khi loại bỏ, số phần tử của danh sách giảm đi 1 đơn vị

Ví dụ:

Trang 8

1 Danh sách

Sửa đổi phần tử trong danh sách: là thao tác

hiệu chỉnh phần tử trong danh sách Trước khi

hiệu chỉnh cần phải xác định phần tử cần hiệu

chỉnh (tìm kiếm)

Ví dụ:

Sắp xếp thứ tự danh sách: là thao tác sắp lại thứ

tự các phần tử trong danh sách theo một quy tắc nào đó

Ví dụ:

b Các phép toán trên danh sách

Trang 9

Tách một danh sách thành nhiều danh sách: là

thao tác tách một phần hoặc tất cả các phần tử

trong DS đưa sang các danh sách khác

Vd:

Ghép nhiều danh sách thành danh sách mới: là

thao tác ngược lại của quá trình tách

Trộn nhiều danh sách thành danh sách mới

Trang 11

Danh sách đặc là danh sách mà các phần tử được sắp xếp kế tiếp nhau trong bộ nhớ, phần tử ai+1 đứng sau phần tử ai.

a0 a1 … ai ai+1 … an-2 an-1

add[1] add[i]  d  add[n]

add[i] = add[1] + (i-1)*d

Trang 12

2 Danh sách đặc

#define MaxLength //Số nguyên thích hợp để chỉ độ dài của danh sách

typedef ElementType; //kiểu của phần tử trong danh sách

typedef int Position; //kiểu vị trí cuả các phần tử

typedef struct {

ElementType Elements[MaxLength]; //mảng chứa các phần tử của DS

Position Last; //giữ độ dài danh sách

} List;

b Khai báo

Vd:

Trang 13

i Khởi tạo danh sách rỗng

ii Kiểm tra danh sách rỗng

iii Tìm kiếm phần tử trong danh sách

iv Chèn phần tử vào danh sách

v Loại bỏ phần tử khỏi danh sách

c Các phép toán

Trang 14

Trong đó Last chỉ vị trí của phần tử cuối cùng

trong danh sách và đó cũng là độ dài hiện tại của danh sách

Trang 15

ii Kiểm tra danh sách rỗng

Danh sách rỗng là một danh sách mà độ dài của

Trang 16

2 Danh sách đặc

iii Chèn phần tử vào danh sách

Giả sử ta chèn phần tử có nội dung x vào danh sách ở vị trí p Khi đó các phần tử từ vị trí thứ p đến

vị trí thứ last được di chuyển ra sau 1 đơn vị và độ dài danh sách tăng lên 1 đơn vị

c Các phép toán

Trang 17

Giải thuật Chèn phần tử vào danh sách

void Insert_List(ElementType X, Position P, List *L){

if (L->Last==MaxLength) printf("Danh sach day");

Trang 18

2 Danh sách đặc

iv Loại bỏ phần tử khỏi danh sách

Để loại bỏ phần tử vị trí p ra khỏi danh sách L ta dời các phần tử từ vị trí p+1 đến cuối danh sách sang trái

1 vị trí

Lưu ý: độ dài của danh sách giảm đi 1 đơn vị

c Các phép toán

Trang 19

iv Loại bỏ phần tử khỏi danh sách

Giải thuật loại bỏ

void Delete_List(Position P,List *L){

if ((P<0) || (P>L->Last)) printf("Vi tri khong hop le"); else if (Empty_List(*L)) printf("Danh sach rong!"); else{ Position i;

Trang 20

2 Danh sách đặc

v Tìm kiếm phần tử trong danh sách

Trường hợp danh sách không thứ tự

Position Search_List(ElementType X,List L){ Position found=0, i=0;

if (Empty_List(L)) printf("Danh sach rong!"); else{ while (i<L.last&&found==0)

Trang 21

v Tìm kiếm phần tử trong danh sách

Trường hợp danh sách có thứ tự

(tự nghiên cứu)

c Các phép toán

Trang 22

2 Danh sách đặc

i Ưu điểm

d Đặc điểm của danh sách đặc

 Sử dụng 100% ô nhớ để lưu trữ thông tin

 Truy xuất trực tiếp phần tử List[i]

 Dễ dàng tìm kiếm phần tử bằng phương pháp nhị phân, nếu danh sách có thứ tự

Trang 23

ii Nhược điểm

d Đặc điểm của danh sách đặc

 Không phù hợp với phép chèn và loại bỏ Số lần

di chuyển trung bình cho một phép chèn hoặc loại bỏ là n/2

Trang 24

Chúc các bạn thành công !

KHOA KHOA HỌC MÁY TÍNH – BỘ MÔN LẬP TRÌNH

Trang 25

1 Cho dãy số n nguyên và số nguyên x Kiểm tra xem

x có thuộc dãy đã cho hay không Nếu có cho biết

vị trí của x Xóa tất cả các số lớn hơn x

2 Cho n số nguyên dương Xóa các số trong dãy nhỏ

hơn 10 Chèn số 20 vào vị trí thứ 10

3 Cho n số nguyên Tìm phần tử nhỏ nhất của dãy

4 Nhập vào một dãy n số nguyên Kiểm tra xem dãy

đã cho có tăng hay không

5 Cho 2 dãy A, B Viết chương trình trộn 2 dãy A, B

thành dãy C

Bài tập

Trang 26

3 Danh sách liên kết

a Định nghĩa và khai báo

b Các phép toán

Trang 27

Danh sách liên kết là danh sách mà các phần tử được kết nối với nhau nhờ các vùng liên kết.

Mỗi phần tử của danh sách gọi là nút gồm có hai thành phần:

+ phần thông tin

+ và phần kết nối (chứa địa chỉ của nút kế tiếp).

Trang 28

3 Danh sách liên kết

typedef ElementType; //kiểu của phần tử trong danh sách typedef struct Node{

ElementType Element; //Chứa nội dung của phần tử

struct Node *link; /*con trỏ chỉ đến phần tử kế tiếp trong danh sách*/

}List;

List *First, *Last;

a Định nghĩa và khai báo

Trang 29

i Khởi tạo danh sách rỗng

ii Kiểm tra danh sách rỗng

iii Xác định vị trí của phần tử trong DS

iv Chèn phần tử vào danh sách

v Loại bỏ phần tử khỏi danh sách

vi Ghép danh sách

vii Trộn danh sách

b Các phép toán

Trang 30

2 Danh sách liên kết

i.Khởi tạo danh sách rỗng

void Make_List(List **First, List **Last){

(*First)=(*Last)= NULL;

}

b Các phép toán

Trang 31

ii Kiểm tra danh sách rỗng

Danh sách rỗng nếu First == NULL int Empty_List(List *First)

{

return First==NULL;

}

b Các phép toán

Trang 32

2 Danh sách liên kết

iii Xác định vị trí n trong danh sách

List *Locate(int n, List *T)

{ List *P,*q; int count = 0;

If(Empty(T)) cout<<“danh sách rỗng”;else{P = T;

while ((P != NULL) && (count<n))

Trang 33

iv Chèn phần tử vào danh sách

Chèn ở đầu DS:

void in_sert(ElementType x,List **T){List *p;

p=(List*)malloc(sizeof(List));p->element=x;

p->link=(*T);(*T)=p;

}

b Các phép toán

Trang 35

iv Chèn phần tử vào danh sách

Trang 36

2 Danh sách liên kết

v Xóa phần tử khỏi danh sách

Xóa ở đầu danh sách:

void Delete_T(List **T)

{List *p;

if((*T)!=NULL){

p=(*T);(*T)=p->link;delete(p);}

}

b Các phép toán

Trang 37

v Xóa phần tử khỏi danh sách

Xóa ở giữa danh sách:

void Delete_G(int n,List **T)

{List *p,*q;

if(Empty(*T)) cout<<"danh sach rong \n";else{ p=search(n,*T);

if(p->link!=NULL) {q=p->link; p->link=q->link;

free(q);}

}

}

Trang 38

2 Danh sách liên kết

i Ưu điểm

- Thích hợp phép chèn, loại bỏ, trộn, ghép danh sách

- Rất phù hợp với các loại danh sách có nhiều biến động

c Đặc điểm của danh sách liên kết

Trang 39

ii Nhược điểm

- Tốn vùng nhớ cho chỉ điểm liên kết

- Không thích hợp cho tìm kiếm

c Đặc điểm của danh sách liên kết

Trang 40

Chúc các bạn thành công !

KHOA KHOA HỌC MÁY TÍNH – BỘ MÔN LẬP TRÌNH

Trang 41

1 Viết thuật toán tạo danh sách liên kết chứa các số

nguyên nhập từ bàn phím, sau đó hiển thị danh

4 Viết thuật toán đếm số nút trong danh sách liên kết

5 Viết thuật toán tính giá trị trung bình của các phần

tử trong danh sách

6 Viết thuật toán đảo ngược một danh sách liên kết

7 Viết thuật toán trộn 2 danh sách liên kết cho trước

Bài tập

Trang 43

Ngăn xếp (Stack) là danh sách mà việc thêm vào hoặc loại bỏ một phần tử chỉ thực hiện tại một đầu được gọi là đỉnh (TOP) của ngăn xếp Theo nguyên tắc vào sau ra trước LIFO (last in - first out )

Trang 44

4 Ngăn xếp

MAKE_STACK(S): Khởi tạo ngăn xếp

POP(S,x) lấy phần tử đỉnh của ngăn xếp gán cho x

PUSH(x,S) thêm một phần tử x vào đầu ngăn xếp

EMPTY_STACK(S) kiểm tra ngăn xếp rỗng

FULL_STACK(S): Kiểm tra ngăn xếp đầy

b Các phép toán trên ngăn xếp

Trang 45

Khai báo ngăn xếp

#define MaxLength //độ dài của mảng

typedef ElementType; //kiểu các phần tử trong ngăn xếp

typedef struct {

ElementType Elements[MaxLength];

int Top_idx; //giữ vị trí đỉnh ngăn xếp

} Stack;

Trang 47

Kiểm tra ngăn xếp rỗng

int Empty_Stack(Stack S){

return S.Top_idx==MaxLength; }

Trang 49

Chương trình con xóa phần tử ra khỏi ngăn xếp

void Pop(Stack *S,int *y){

Trang 50

4 Ngăn xếp

Chương trình con thêm phần tử vào ngăn xếp :

void Push(ElementType X, Stack *S){

if (Full_Stack(*S)) printf("Loi! Ngan xep day!");

Trang 51

Khai báo ngăn xếp

typedef ElementType;

typedef struct Node{

ElementType Element;

struct Node *link;} Stack;

d Tổ chức theo danh sách liên kết

Trang 53

Kiểm tra ngăn xếp rỗng:

Trang 54

4 Ngăn xếp

Thêm phần tử vào ngăn xếp

void Push(int X, Stack **S)

{Stack *p;

p=(Stack*)malloc(sizeof(Stack));p->Element=X;

p->link=(*S);(*S)=p;

}

d Tổ chức theo danh sách liên kết

Trang 55

Xóa phần tử ra khỏi ngăn xếp

void Pop (Stack **S,int *y)

{Stack *p;

if((S)!=NULL){ *y=(*S)->Element;

p=(*S);(*S)=p->link;

delete(p);

}}

d Tổ chức theo danh sách liên kết

Trang 57

Thuật toán chuyển đổi cơ số

e Ứng dụng

Thuật toán này chuyển đổi biểu diễn cơ số 10 của một

số nguyên dương Number sang cơ số 2 và hiển thị biểu diễn cơ số 2

(1)Lặp lại các bước sau cho đến khi Number = 0:

(a)Tính số dư Remaider của phép chi Number cho 2(b)Đặt số dư remaider vào đỉnh ngăn xếp

(c)Thay Number bằng phần nguyên của kết quả phép Number chia cho 2

Trang 58

4 Ngăn xếp

Thuật toán chuyển đổi cơ số

e Ứng dụng

Thuật toán này chuyển đổi biểu diễn cơ số 10 của một

số nguyên dương Number sang cơ số 2 và hiển thị biểu diễn cơ số 2

(2) Lặp lại các bước sau cho đến khi ngăn xếp số dư rỗng:

(a)Lấy ra remaider từ đỉnh ngăn xếp

(b)Hiển thị Remaider

Trang 59

Ký pháp nghich đảo Ba lan

Trang 60

4 Ngăn xếp

Ký pháp nghich đảo Ba lan

e Ứng dụng

(1) Khởi động ngăn xếp rỗng của các toán hạng:

(2) Lặp lại các bước sau cho đến khi gặp dấu kết thúc

biểu thức được đọc:

(a) Đọc phần tử (hằng, biến, phần tử)

Trang 61

Ký pháp nghich đảo Ba lan

(ii) áp dụng toán tử trên vào hai giá trị vừa lấy

(iii) đẩy kết quả vào ngăn xếp

(c) Khi gặp dấu kết thức biểu thức, giá trị biểu thức là giá trị duy nhất ở

đỉnh ngăn xếp.

Trang 63

Hàng đợi, hay ngắn gọn là hàng (queue) là danh sách

mà phép thêm vào thực hiện tại một đầu gọi là cuối hàng (REAR), còn phép loại bỏ thì thực hiện ở đầu kia của danh sách, gọi là đầu hàng (FRONT) Hàng tuân thủ nguyên tắc vào trước - ra trước FIFO (first in - first

out)

Hàng đợi

Trang 64

4 Hàng đợi

• MAKE_QUEUE(Q) khởi tạo một hàng

• I_QUEUE(x,Q) thêm phần tử x vào cuối hàng Q

• O_QUEUE(Q,y) lấy ra phần tử y tại đầu của hàng Q

• EMPTY_QUEUE(Q) hàm kiểm tra hàng rỗng

• FULL_QUEUE(Q) kiểm tra hàng đầy

b Các phép toán cơ bản trên hàng

Trang 65

Các khai báo cần thiết

#define MaxLength //chiều dài tối đa của mảng typedef ElementType;

//Kiểu dữ liệu của các phần tử trong hàng

typedef struct {

ElementType Elements[MaxLength];

//Lưu trữ nội dung các phần tử

int Front, Rear; //chỉ số đầu và đuôi hàng

} Queue;

c Tổ chức theo danh sách đặc

Trang 68

4 Hàng đợi

Kiểm tra đầy

Hàng đầy nếu số phần tử hiện có trong hàng bằng

Trang 69

Xóa phần tử ra khỏi hàng

Khi xóa một phần tử đầu hàng ta chỉ cần cho front tăng lên 1 Nếu front > rear thì hàng thực chất là hàng đã rỗng, nên ta sẽ khởi tạo lại hàng rỗng

(tức là đặt lại giá trị front = rear =-1)

Trang 70

*x=Q->Elements[Q->Front]; Q->Front=Q->Front+1;

if (Q->Front>Q->Rear) Make_Queue(Q);

} else cout<<"Loi: Hang rong!";

}

c Tổ chức theo danh sách đặc

Trang 71

Q->Rear=MaxLength - Q->Front-1; Q->Front=0; }

Q->Rear=Q->Rear+1; Q->Elements[Q->Rear]=X; } else cout<<"Loi: Hang day!";

}

Trang 72

4 Hàng đợi

Khai báo cần thiết

typedef ElementType; //kiểu phần tử của hàng typedef struct Node{

Position Front, Rear;

//là hai trường chỉ đến đầu và cuối của hàng } Queue;

d Tổ chức theo danh sách liên kết

Trang 75

}else {p=(Node*)malloc(sizeof(Node));

p->Element=X;p->Next=NULL;

Q->Rear->Next=p; Q->Rear=p;

} }

d Tổ chức theo danh sách liên kết

Trang 76

d Tổ chức theo danh sách liên kết

Trang 77

Hàng đợi là một cấu trúc dữ liệu được dùng khá phổ biến trong thiết kế giải thuật Bất kỳ nơi nào ta cần

quản lí dữ liệu, quá trình theo kiểu vào trước-ra

trước đều có thể ứng dụng hàng đợi

Ví dụ rất dễ thấy là quản lí in trên mạng, nhiều máy tính yêu cầu in đồng thời và ngay cả một máy tính

cũng yêu cầu in nhiều lần Nói chung có nhiều yêu

cầu in dữ liệu, nhưng máy in không thể đáp ứng tức thời tất cả các yêu cầu đó nên chương trình quản lí in

sẽ thiết lập một hàng đợi để quản lí các yêu cầu Yêu cầu nào mà chương trình quản lí in nhận trước nó sẽ giải quyết trước

e Ứng dụng

Trang 78

4 Hàng đợi

Một ví dụ khác là duyệt cây theo mức được trình bày chi tiết trong chương sau Các giải thuật duyệt theo chiều rộng một đồ thị có hướng hoặc vô hướng cũng dùng hàng đợi để quản lí các nút đồ thị Các giải thuật đổi biểu thức trung tố thành hậu tố, tiền tố

e Ứng dụng

Trang 79

Chúc các bạn thành công !

Trang 80

Bài tập Ngăn xếp & Hàng đợi

1 Viết chương trình dùng ngăn xếp để chuyển một số thập

phân sang số nhị phân

2 Dùng các hàm cơ bản trên ngăn xếp như: MAKE_STACK(S) ,

POP(S,x), PUSH(x,S), EMPTY_STACK(S), FULL_STACK(S

1 Lấy ra phần tử đáy của ngăn xếp, nhưng để lại nguyên

nội dung của ngăn xếp

2 Lấy ra phần tử thư n của ngăn xếp, nhưng để lại

nguyên nội dung của ngăn xếp.

3 Dùng các hàm cơ bản trên hàng đợi như: MAKE_QUEUE(Q) ,

I_QUEUE(x,Q) , O_QUEUE(Q,y) , EMPTY_QUEUE(Q) ,

1 Lấy ra phần tử ởcuối hàng đợi, nhưng để lại nguyên nội

dung của hàng đợi.

2 Lấy ra phần tử thứ n của hàng đợi, nhưng để lại nguyên

nội dung của hàng đợi.

4 Dùng các phép toán cơ bản trên hàng đợi và ngăn xếp Viết

chương trình đảo ngược các phần tử của hàng đợi.

Ngày đăng: 03/04/2014, 00:21

TỪ KHÓA LIÊN QUAN