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