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 Phần 2 pdf

41 822 4

Đ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 - Trường Đại Học Cần Thơ
Chuyên ngành Cấu trúc dữ liệu
Thể loại Bài giảng
Thành phố Cần Thơ
Định dạng
Số trang 41
Dung lượng 382,5 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ụ:

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

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ụ:

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

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ụ:

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

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

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

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

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

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ị

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

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

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

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 !

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

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

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;

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

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

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

{count++; q=P;P=P->link;}}

if(count==n) return q;

else return NULL;

}

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 34

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

Trang 35

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

Trang 36

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

}

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

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 !

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ểm 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

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

TỪ KHÓA LIÊN QUAN