Tải bản đầy đủ (.pptx) (27 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (167.38 KB, 27 trang )

Chương 4. Danh sách liên kết – Phần 2

Trần Minh Thái
Email:
Website: www.minhthai.edu.vn

Cập nhật: ngày 30 tháng 10 năm 2016


Nội dung

Sinh viên sẽ được trình bày, hiểu và vận dụng vào lập trình một số kỹ thuật sau để xử lý trên DSLK
đơn:

1.
2.
3.

Chèn thêm một node
Xoá một node
Sắp xếp

2


Chèn node vào DSLK đơn

Chèn vào sau node p
Chèn vào trước node p

25


pNew

p

list
pHead

pTail

3


Chèn node vào sau node p

pNew

p

list
pHead

pTail

4


Chèn node vào sau node p

 Input: DSLK list, node p và node cần thêm pNew
 Output: list sau khi thêm pNew vào sau p

 Algorithm:
 B1: Nếu p là pTail của list thì
Thêm pNew vào cuối list: Kết thúc

 B2: pSau = p.pNext
Nối pNew vào pSau
Nối p vào pNew

5


?
Cài đặt phương thức thêm pNew vào sau p
public void InsertAfterP(Node<T> p, Node<T> pNew)
{

}

6


Chèn node vào trước node p – Cách 1

pPrev

p

list
pHead


pTail

7

pNew


Tìm node trước node p

 Input: DSLK list, node p
 Output: node phía trước node p: pTruoc (nếu khơng có node trước p thì trả về null)
 Algorithm:
 B1: Nếu p là pHead của list thì
Trả về null: Kết thúc

 B2: pTruoc = pHead của list
 B3: Trong khi node sau của pTruoc khác p thực hiện
pTruoc = node sau của pTruoc

 B4: Trả về pTruoc

8


?

Cài đặt phương thức tìm node trước node p

public Node<T> PrevNodeP (Node<T> p)
{


}

9


Chèn node pNew vào trước node p

 Input: DSLK list, node p, node cần thêm pNew
 Output: list sau khi thêm pNew vào trước node p (trả về true nếu chèn thành công, ngược lại trả
về false)

 Algorithm:
 B1: Nếu p là pHead của list thì
Thêm pNew vào đầu list trả về true: Kết thúc

 B2: pTruoc = Tìm node trước p
 B3: Nếu pTruoc = null trả về false: Kết thúc
 B4: pTruoc nối với pNew
pNew nối với node sau của p
trả về true

10


?

Cài đặt phương thức thêm pNew vào trước node p – Cách 1

public bool InsertBeforeP1 (Node<T> p, Node<T> pNew)

{

}
11


Chèn node vào trước node p – Cách 2
Bước 1. Chèn pNew vào sau p
Bước 2. Hoán vị giá trị pNew và p

pNew

p

list
pHead

pTail

12


?
Cài đặt phương thức thêm pNew vào trước node p – Cách 2

public bool InsertBeforeP2 (Node<T> p, Node<T> pNew)
{

}
13



Xóa một node trong danh sách

 TH1: Xóa node đầu của danh sách  Ảnh hưởng pHead
 TH2: Xóa node cuối của danh sách  Ảnh hưởng pTail
 TH còn lại: Xoá node bên trong danh sách

14


Xóa một nút trong danh sách

TH1: Xóa nút đầu của danh sách
Cần xóa

30

list
pHead

25

41

pTail

pDel

15


78


Xoá node đầu của DSLK

 Input: DSLK list
 Output: list sau khi xố node đầu
 Algorithm:
 B1: Nếu list có pHead = pTail thì
pHead = pTail = null: Kết thúc

 B2: Cập nhật pHead là node sau của pHead

16


?
Cài đặt phương thức xoá node đầu DSLK

public void DeleteHead ()
{

}
17


Xóa một node trong danh sách

TH 2: Xóa node cuối của danh sách

Cần xóa
pPrev

30

list
pHead

25

41

pTail

18

pDel

78


Xoá node cuối trong danh sách

 Input: DSLK list
 Output: list sau khi xoá node cuối
 Algorithm:
 B1: Nếu list có pHead = pTail thì
pHead = pTail = null: Kết thúc

 B2: pTruoc = node trước pTail của list

pTail = null
pTail = pTruoc

19


?
Cài đặt phương thức xoá node cuối DSLK

public void DeleteTail ()
{

}
20


Xóa một node trong danh sách

TH cịn lại: Xóa node bên trong danh sách
Cần xóa

30

list
pHead

pPrev

pDel


25

41

96

pTail

21

78


Xoá node pDel bên trong DSLK

 Input: DSLK list, node pDel
 Output: list sau khi xoá node pDel
 Algorithm:
 B1: pTruoc = node trước node pDel
 B2: pTruoc nối với node sau của pDel
 B3: pDel = null

Đoạn code bằng C#?
22


Xoá 1 node pDel bất kỳ của DSLK

 Input: DSLK list, node pDel
 Output: list sau khi xoá node pDel

 Algorithm:
 B1: Nếu pDel là pHead của list thì gọi DeleteHead(), kết thúc
 B2: Ngược lại nếu pDel là pTail của list thì gọi DeleteTail(), kết thúc
 B3: Ngược lại tìm node pTruoc là node trước pDel
pTruoc nối với node sau của pDel
pDel = null

23


?
Cài đặt phương thức xoá 1 node pDel bất kỳ trong DSLK

public void DeleteNode (Node<T> pDel)
{

}
24


Bài tập tại lớp
Định nghĩa các phương thức theo yêu cầu sau:
1. Chèn node có giá trị x vào phía sau node có giá trị lớn nhất (giả sử danh sách khơng có
giá trị trùng nhau)
2. Xóa node có giá trị x xuất hiện đầu tiên trong danh sách (nếu có xóa: trả về true, ngược
lại trả về false)
3. Sắp DSLK theo thứ tự tăng dần (dùng phương pháp chọn trực tiếp)

25



×