Tải bản đầy đủ (.pdf) (69 trang)

Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 7 - Trường ĐH Văn Lang

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 (5.89 MB, 69 trang )


A

B

C

D

A

B

C

D

KHOA CÔNG NGHỆ THÔNG TIN

2


A

B

C

D

A



B

C

D

KHOA CÔNG NGHỆ THÔNG TIN

3


DANH SÁCH LIÊN KẾT ĐƠN (LIST)


KHOA CÔNG NGHỆ THÔNG TIN

5


x0

KHOA CÔNG NGHỆ THÔNG TIN

x2

x1

x3
6



pNext

Info

KHOA CÔNG NGHỆ THÔNG TIN

7


pHead

pTail
4f

3f

4

4f

7

5f

5f

6


NULL

Trong ví dụ trên thành phần dữ liệu là 1 số nguyên

KHOA CÔNG NGHỆ THÔNG TIN

8


 Tạo 1 danh sách liên kết đơn rỗng
 Tạo 1 nút có trường Info bằng x
 Tìm một phần tử có Info bằng x
 Thêm một phần tử có khóa x vào danh sách
 Hủy một phần tử trong danh sách
 Duyệt danh sách
 Sắp xếp danh sách liên kết đơn

KHOA CÔNG NGHỆ THÔNG TIN

9


Đầu tiên thiết lập Node
class Node
{
public int iData;
public Node pNext;
public Node(int value)
{
this.iData = value;

this.pNext = null;
}
}
KHOA CÔNG NGHỆ THÔNG TIN

10


Khai báo thông tin danh sách
class MyLinkedList
{
Node pHead, pTail;

public MyLinkedList()
{
pHead = null;
pTail = null;
}
}
KHOA CÔNG NGHỆ THÔNG TIN

11


 Nguyên tắc thêm: Khi thêm 1 phần tử vào
List thì có làm cho pHead, pTail thay đổi?
 Các vị trí cần thêm 1 phần tử vào List:

‐ Thêm vào đầu List
‐ Thêm vào cuối List

‐ Thêm vào sau 1 phần tử q trong list

KHOA CÔNG NGHỆ THÔNG TIN

13


Thêm nút p vào đầu danh sách liên kết đơn
Bắt đầu:
Nếu List rỗng thì
+ pHead = p;
+ pTail = pHead;
Ngược lại

+ p.pNext = pHead;
+ pHead = p

KHOA CÔNG NGHỆ THÔNG TIN

14


pHead

2
f3 3f

9f
pHead=P


N
10 2f

P

KHOA CÔNG NGHỆ THÔNG TIN

3
f 4 4f

4
f8…

P.pNext=pHead

15


public void AddHead(Node p)
{
if (pHead == null) // kiểm tra nếu danh sách đang rỗng (pHead == null)
{
pHead = pTail = p; // Node p vừa là đầu, vừa là cuối
}
else // nếu danh sách không rỗng
{
p.pNext = pHead; // Nếu xem Node p đứng ở đầu danh sách
pHead = p; // Node p giờ đây được cập nhật là Node đầu danh sách
}
}

KHOA CÔNG NGHỆ THÔNG TIN

16


Ta cần thêm nút p vào cuối list đơn
Bắt đầu:
Nếu List rỗng thì
+ pHead = p;
+ pTail = pHead;
Ngược lại
+ pTail.pNext=p;
+ pTail=p

KHOA CÔNG NGHỆ THÔNG TIN

17


3
f 4 4f

4f

8 5f

pTail

5f


5N
9f
pTail=P

pTail.pNext

9f

6N
P

KHOA CÔNG NGHỆ THÔNG TIN

18


public void AddTail(Node p)
{
if (pHead == null) // kiểm tra nếu danh sách đang rỗng
{
pHead = pTail = p; // Node p vừa là đầu, vừa là cuối
}
else // nếu danh sách không rỗng
{
pTail.pNext = p; // Nếu xem Node p đứng ở cuối danh sách
pTail = p; // Node p giờ đây được cập nhật là Node cuối danh sách
}
}
KHOA CÔNG NGHỆ THÔNG TIN


19


Ta cần thêm nút p vào sau nút q trong list đơn
Bắt đầu:
Nếu (q!=null) thì
B1: p.pNext = q.pNext
B2:
+ q.pNext = p
+ nếu q = pTail thì
pTail=p

KHOA CƠNG NGHỆ THƠNG TIN

20


3
f 4 4f

4 q
f 8 59
f

q.pNext=P

9
f7 N
5
f


5
f 5 ..
P.pNext = q.pNext

P

KHOA CÔNG NGHỆ THÔNG TIN

21


void AddAfterQ(Node q, Node p)
{
if(q != null)
{
p.pNext = q.pNext; //B1
q.pNext = p; //B2
if(q == pTail){ pTail = p;}
}
else //chèn vào đầu danh sách
AddHead(p);// thêm p vào đầu list
}
KHOA CÔNG NGHỆ THÔNG TIN

22


 Nguyên tắc: Phải cô lập phần tử cần hủy trước hủy.
 Các vị trị cần hủy:

‐ Hủy phần tử đứng đầu List
‐ Hủy phần tử có khố bằng x
‐ Hủy phần tử đứng sau q trong danh sách liên kết đơn
 Ở phần trên, các phần tử trong DSLK đơn được cấp phát
vùng nhớ động bằng hàm new, thì sẽ được giải phóng vùng
nhớ bằng hàm delete.

KHOA CƠNG NGHỆ THÔNG TIN

23


Bắt đầu:
Nếu (pHead!=NULL) thì
 B1: p=pHead //p là phần tử cần hủy
 B2:
+ pHead = pHead.pNext //tách p ra khỏi ds
+ p = null // Hủy biến động do p trỏ đến

 B3:
Nếu pHead==NULL thì pTail=NULL

KHOA CƠNG NGHỆ THƠNG TIN

24


pHead = pHead.pNext

pHead


2f

1f

7 2f
P

KHOA CÔNG NGHỆ THÔNG TIN

3f

6 3f

4f

3 4f

8 …

P = pHead

25


void RemoveHead()
{
if (pHead != null)
{
Node p = pHead; //B1

pHead = pHead.pNext; // B2
p = null;
if(pHead == null) {pTail = null;} //B3
}
}

KHOA CÔNG NGHỆ THÔNG TIN

26


×