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

Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 4.1 - Trần Minh Thái (2016)

57 62 0

Đ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

Định dạng
Số trang 57
Dung lượng 252,81 KB

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

Nội dung

Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 4: Danh sách liên kết cung cấp các kiến thức giúp sinh viên nắm vững khái niệm về kiểu dữ liệu tĩnh và động, nắm vững cách tổ chức dữ liệu động bằng danh sách liên kết và minh họa được các thao tác xử lý trên danh sách liên kết đơn, cài đặt minh họa được các thao tác của danh sách đơn bằng ngôn ngữ C#.

Trang 1

Chương 4 Danh sách liên kết

(Phần 1 – 3 tiết)

Trần Minh Thái

Email: minhthai@huflit.edu.vn

Website: www.minhthai.edu.vn

Trang 2

Mục tiêu

 Nắm vững khái niệm về kiểu dữ liệu tĩnh và động

 Nắm vững cách tổ chức dữ liệu động bằng danh sách liên kết và minh họa được các thao tác xử lý trên danh sách liên kết đơn

 Cài đặt minh họa được các thao tác của danh sách đơn bằng ngôn ngữ C#

2

Trang 3

15 15

1 1

? Làm sao để chèn thêm số 6 vào vị trí 5 của mảng

6 6

Trang 4

15 15

1 1

6 6

Bổ sung thêm

Giả sử cần thêm tiếp 1 phần tử

?

Trang 5

Bài tập

Hãy cài phương thức (bằng ngôn ngữ C#) chèn một phần tử có giá trị x vào vị trí

vt trong mảng số nguyên arr, theo mẫu như sau:

class CMyIntArray{

int []arr;

public void InsertX(int x, int vt){}

}

Trang 6

15 15

1 1

Trang 7

15 15

1 1

Trang 9

Vấn đề kiểu dữ liệu tĩnh

Độ phức tạp của chèn/ xóa trên mảng 1 chiều là O(n)

i

Trang 10

Vấn đề kiểu dữ liệu tĩnh

 Giải quyết vấn đề phức tạp khi chèn/ xóa?

 Giải quyết vấn đề giới hạn kích thước vùng nhớ tối đa?

 Giải quyết vấn đề vùng nhớ không liên tục?

 Giải quyết vấn đề giải phóng vùng nhớ khi không cần dùng đến?

10

DÙNG CẤU TRÚC DỮ LIỆU ĐỘNG

Trang 11

Danh sách liên kết (DSLK)

1

7 2 6

3 10 8 5 9

Các phần tử kết dính với nhau bằng “sợi dây liên kết”

Trang 13

Đặc điểm DSLK

Một dãy tuần tự các nút (Node)

Giữa hai nút có con trỏ liên kết

Các nút không cần phải lưu trữ liên tiếp nhau trong bộ nhớ

Có thể mở rộng tuỳ ý (chỉ giới hạn bởi dung lượng bộ nhớ)

Trang 14

Đặc điểm DSLK

Thao tác Chèn/Xóa không cần phải dịch chuyển phần tử mà chỉ cần thay đổi mối liên kết

Quản lý phần tử đầu tiên bằng con trỏ pHead

Có thể truy xuất đến các phần tử khác thông qua con trỏ liên kết

14

Trang 15

Cấu tạo của DSLK

pHead pTail List

Trang 16

Cấu tạo của nút

Tạo lập bằng cách cấp phát bộ nhớ động

Mỗi nút có 2 thông tin:

Dữ liệu (data)

Con trỏ liên kết đến phần tử kế tiếp trong danh sách (Next pointer link)

Nếu không trỏ đến phần tử nào thì con trỏ Next = null

16

Trang 17

Thao tác chèn thêm node vào DSLK

“Kết nối” lại sợi dây liên kết theo trình tự

pHead pTail List

Trang 18

Thao tác xóa node khỏi DSLK

18

Cần xóa

pHead pTail List

Trang 19

Các loại hình DSLK

DSLK đơn: Các phần tử kết nối với nhau theo hướng “chiều đi tới”

Trang 20

Các loại hình DSLK

DSLK đôi: Các phần tử kết nối với nhau theo hướng “chiều đi tới và và đi lui”

20

Trang 21

Các loại hình DSLK

Danh sách liên kết vòng: Các phần tử kết nối với nhau theo hướng “chiều đi tới”

và phần tử cuối cùng có “đường đi vòng trở lại tới” phần tử đầu danh sách

Trang 22

So sánh Mảng và DSLK

Các phần tử lưu trữ tuần tự (địa chỉ tăng

Phải dịch chuyển các phần tử khi

Trang 23

DSLK đơn

Cấu trúc 1 node

Data

pNext

Data : Dữ liệu của node

pNext : Con trỏ đến node kế tiếp

pHead : Con trỏ đến node đầu

pTail : Con trỏ đến node cuối

pHead pTail List

Trang 24

Cấu tạo của DSLK

Quản lý toàn bộ danh sách liên kết thông qua con trỏ đầu pHead

pHead không phải là 1 nút, nó chỉ là “con trỏ chỉ đến nút”

Ta cũng có thể quản lý danh sách bằng cách sử dụng thêm con trỏ cuối (pTail)

pTail không phải là 1 nút, nó chỉ là “con trỏ chỉ đến nút”

24

Trang 25

Cấu tạo của nút

Tạo lập bằng cách cấp phát bộ nhớ động

Mỗi nút có 2 thông tin:

Dữ liệu (data)

Con trỏ liên kết đến phần tử kế tiếp trong danh sách (Next pointer link)

Nếu không trỏ đến phần tử nào thì con trỏ Next = null

Trang 26

Khai báo node

get { return data; }

set { data = value; }

}

public Node<T> PNext

{

get { return pNext; }

set { pNext = value; }

}

}

Trang 27

Khai báo node lưu số nguyên 20

pNext

public class IntNode

{

private int data;

private IntNode pNext = null;

public int Data {

get { return data; } set { data = value; } }

public IntNode PNext {

get { return pNext; } set { pNext = value; }

Trang 28

Tạo lập danh sách rỗng

28

Sau khi tạo lập

?pHead

?pTail List

Trước khi tạo lập

pHead pTail List

pHead và pTail chưa xác định pHead và pTail trỏ vào null (rỗng)

Trang 29

Khai báo DSLK đơn

pHead pTail List

class CMyLinkedList<T>

{

private Node<T> pHead = null;

private Node<T> pTail = null;

Trang 30

Khai báo DSLK đơn số nguyên

30

pHead pTail List

public class CMyIntLinkedList

{

private IntNode pHead = null;

private IntNode pTail = null;

//Các phương thức }

Trang 31

Các thao tác trên DSLK đơn

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

 Thêm 1 nút vào danh sách

 Duyệt danh sách

 Xóa 1 nút

 Tìm 1 phần tử

 Sắp xếp danh sách

Trang 32

Kiểm tra danh sách rỗng

32

Danh sách rỗng

pHead pTail List

public bool IsEmpty()

{

return pHead == null;

}

Trang 33

Thêm một nút vào danh sách

Trang 34

Thêm một nút vào danh sách

Có 2 trường hợp để thêm pNew

1.Thêm pNew vào đầu (AddHead)

2.Thêm pNew vào cuối (AddTail)

Trang 35

TH Thêm một nút vào đầu danh sách

pHead pTail

pNew

1 2

Trang 36

TH Thêm một nút vào đầu danh sách

Trang 37

TH Thêm một nút vào đầu danh sách

pHead pTail

Hãy vẽ lại “đường kết nối” theo

thứ tự thích hợp khi thêm pNew

vào đầu danh sách ?

Trang 38

TH Thêm một nút vào đầu danh sách

38

1 pNew.PNext = pHead;

2 pHead = pNew;

Trang 39

TH Thêm một nút vào đầu danh sách

Hãy viết phương thức thêm phần tử vào

đầu danh sách (C#), theo mẫu sau:

public void AddHead(Node<T> pNew)

?

Trang 40

TH Thêm một nút vào cuối danh sách

1

1

2

2

Trang 41

TH Thêm một nút vào cuối danh sách

pHead pTail

Hãy vẽ lại “đường kết nối” theo

thứ tự thích hợp khi thêm pNew

vào cuối danh sách ?

42

Trang 42

TH Thêm một nút vào cuối danh sách

42

Hãy viết phương thức thêm phần tử pNew vào cuối danh sách (C#), theo mẫu:

public void AddTail(Node<T> pNew)

?

Trang 43

Nhập dữ liệu vào DSLK

Nhập dữ liệu cho node

Tạo con trỏ node

Thêm node vào danh sách

Trang 44

Nhập dữ liệu vào danh sách

Để tạo node mới từ dữ liệu x có sẵn

Đưa dữ liệu có giá trị x vào phần data

Con trỏ pNext trỏ đến null

Trang 45

VD nhập dữ liệu vào DSLK số nguyên

Tạo và trả về Node có chứa giá trị x

public class IntNode

{

private int data;

private IntNode pNext = null;

Trang 46

Console Write( "Nhap vao so nguyen duong (nhap -1 ket thuc): " );

int TryParse( Console ReadLine(), out x);

Trang 47

Xuất dslk

pHead pTail List

p

Trang 50

Chương trình mẫu

Minh hoạ thao tác nhập vào đầu và xuất DSLK số nguyên Chương trình gồm 3 lớp:

1 Lớp IntNode: cấu trúc dữ liệu Node

2 Lớp CMyIntLinkedList: cấu trúc DSLK đơn

3 Lớp Program: gọi thử nghiệm

50

Trang 51

Lớp IntNode

public class IntNode

{

private int data;

private IntNode pNext = null ;

public int Data

{

get { return data; }

set { data = value ; }

}

public IntNode PNext

{

get { return pNext; }

set { pNext = value ; }

Trang 52

Lớp CMyIntLinkedList

52

public class CMyIntLinkedList

{

private IntNode pHead = null ;

private IntNode pTail = null ;

Trang 53

Console Write( "Nhap vao so nguyen duong (nhap -1 ket thuc): " );

int TryParse( Console ReadLine(), out x);

Trang 56

Bài tập thực hành

Cài đặt lớp CMyLinkedList có kiểu dữ liệu chung gồm các chức năng:

1. Tạo node

2. Thêm node vào đầu DSLK

3. Thêm node vào cuối DSLK

4. Tìm node có giá trị x

Sử dụng lớp này cho trường hợp kiểu dữ liệu là số nguyên và thử nghiệm các chức năng: nhập, xuất, tìm kiếm

56

Ngày đăng: 10/05/2021, 23:16

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm