You are on page 1of 67

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Mã môn học: IT003


Buổi 3

Số tiết lý thuyết: 45
Số tiết thực hành: 30
Số tiết tự học: 90

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
1
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Chương 3. Cấu trúc dữ liệu động

3.1. Khái niệm, vai trò

3.2. Con trỏ - Biến động

3.3. Các hình thức tổ chức danh sách

3.4. Danh sách liên kết đơn

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
2
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.1. Khái niệm, vai trò của CTDL động
• Khái niệm:
Dữ liệu có hình thức, cấu trúc linh động về:
- dung lượng
- thời gian
ie, có thể thay đổi kích thước, cấu trúc trong suốt
thời gian sống.

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
3
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.1. Khái niệm, vai trò của CTDL động (tt)

CTDL động:
– Cấp phát động lúc chạy chương trình
– Các phần tử có thể lưu trữ ở nhiều nơi trong bộ nhớ
– Kích thước danh sách chỉ bị giới hạn do RAM
– Thao tác thêm xoá đơn giản

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
4
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.2. Con trỏ - Biến động

• Biến động:
– Biến không được khai báo tường minh.
– Có thể được cấp phát hoặc giải phóng bộ nhớ khi người
sử dụng yêu cầu.
– Các biến này không theo qui tắc phạm vi khai báo (tĩnh).
– Vùng nhớ của biến được cấp phát trong Heap.
– Kích thước có thể thay đổi trong quá trình sống.

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
5
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.2. Con trỏ - Biến động (tt)

• Biến động:
– Do không được khai báo tường minh, biến động không có
một định danh kết buộc với địa chỉ vùng nhớ được cấp phát
=> khó khăn khi truy xuất biến động.
– Để giải quyết vấn đề, biến con trỏ (là biến không động)
được sử dụng để trỏ đến biến động.
– Khi tạo ra một biến động, phải dùng một con trỏ để lưu địa
chỉ của biến này và sau đó, truy xuất đến biến động thông
qua biến con trỏ đã biết định danh.
– 2 thao tác cơ bản:
• Tạo ra một biến động và cho con trỏ ‘p’ chỉ đến nó
• Hủy một biến động do p chỉ đến

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
6
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.2. Con trỏ - Biến động (tt)
• Con trỏ:
– KDL dùng để lưu địa chỉ của một đối tượng dữ liệu khác.
– Giá trị của con trỏ là địa chỉ của một vùng nhớ ứng với
một biến kiểu dữ liệu T, hoặc là giá trị NULL.
– Định nghĩa: typedef <kiểu cơ sở> * < kiểu con trỏ>;
– Ví dụ : typedef int *intpointer;
intpointer p;
hoặc
int *p, x;
p = &x;
• Truy xuất nội dung của x thông qua con trỏ p => (*p)
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
7
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.2. Con trỏ - Biến động (tt)
int *p1, *p2;
// cấp phát vùng nhớ cho 1 biến động kiểu int
p1 = (int*)malloc(sizeof(int));
*p1 = 5; // đặt giá trị 5 cho biến động đang được p1 quản lý
// cấp phát biến động kiểu mảng gồm 10 phần tử kiểu int
p2 = (int*)calloc(10, sizeof(int));
*(p2+3) = 0; // đặt giá trị 0 cho phần tử thứ 4 của mảng p2
free(p1); free(p2);
p1 = new (int);
delete (p1);

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
8
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.3. Các hình thức tổ chức danh sách

• CTDL cho mỗi phần tử ?


• Thể hiện mối quan hệ của các phần tử ?
• Hai hình thức cơ bản :
▪ Liên kết ngầm : danh sách kề, danh sách đặc (mảng,
chuỗi,…)
▪ Liên kết tường minh : Danh sách liên kết đơn, kép,
vòng đơn, vòng kép, …

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
9
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.3.1 Danh sách liên kết ngầm (mảng)
• Mối liên hệ giữa các phần tử được thể hiện ngầm:
▪ xi : phần tử thứ i trong danh sách
x0 … xi xi+1
▪ xi , xi+1 là kế cận trong danh sách
• Phải lưu trữ liên tiếp các phần tử trong bộ nhớ:
address(i) = address(1) + (i-1)*sizeof(T)
• Ưu điểm : Truy xuất trực tiếp, nhanh chóng
• Nhược điểm:
▪ Sử dụng bộ nhớ kém hiệu quả
▪ Kích thước cố định
▪ Các thao tác thêm vào , loại bỏ không hiệu quả

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
10
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.3.2 Danh sách liên kết
• Danh sách liên kết đơn: mỗi phần tử liên kết với phần
tử đứng sau nó trong danh sách:

A B X Z Y

• Danh sách liên kết kép: mỗi phần tử liên kết với các
phần tử đứng trước và sau nó trong danh sách:

A B C D

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
11
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.3.2 Danh sách liên kết

• Danh sách liên kết vòng : phần tử cuối danh sách liên
kết với phần tử đầu danh sách:

A B X Z Y

A B C D

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
12
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.4 Danh sách liên kết đơn
x2
x0 x3
x1

➢ Mỗi phần tử liên kết với phần tử đứng liền sau trong danh sách
➢ Mỗi phần tử trong danh sách liên kết đơn là một cấu trúc có hai
thành phần
▪ Thành phần dữ liệu: Lưu trữ thông tin về bản thân
phần tử
▪ Thành phần liên kết: Lưu địa chỉ phần tử đứng sau
trong danh sách hoặc bằng NULL nếu là phần tử cuối
danh sách.

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
13
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.4.1 CTDL của DSLK đơn

➢ CTDL của 1 nút trong DSLK đơn pNext


typedef struct tagNode Info
{ Data Info; // Lưu thông tin
struct tagNode *pNext; //Lưu địa chỉ của Node đứng sau
}Node;

➢ CTDL của một DSLK đơn


typedef struct tagList
{ Node *pHead; //Lưu địa chỉ Node đầu tiên trong List
Node *pTail; //Lưu địa chỉ của Node cuối cùng trong List
}LIST; // kiểu danh sách liên kết đơn

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
14
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Địa chỉ
3.4.1 CTDL của DSLK đơn (tt) 000

Ví dụ: danh sách theo dạng bảng sau: Joe 100


140
Address Name Age Link
Bill 110
100 Joe 20 140 500

110 Bill 42 500 Marta 140


NULL
140 Marta 27 110
Sahra 230
230 Sahra 25 NULL
NULL
… … …
Kock 500
500 Koch 31 230 230


TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
15
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.4.1 CTDL của DSLK đơn (tt)
Minh họa DSLK đơn:
Địa chỉ
pHead 100 140
100 ‘Joe’ 140 ‘Marta’ 110

110 500
‘Bill’ 500 ‘Koch’ 230

pTail 230
230 ‘Sahra’ NULL

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
16
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.4.2 Các thao tác cơ bản trên DSLK đơn

a. Tạo 1 danh sách liên kết đơn rỗng


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

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
17
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
a. Tạo 1 danh sách liên kết đơn rỗng

➢ Địa chỉ của nút đầu tiên, địa chỉ của nút cuối cùng đều
không có
void CreateList(LIST &l)
{
l.pHead = NULL;
l.pTail = NULL;
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
18
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
b. Tạo 1 nút có trường Infor bằng x
➢ Hàm trả về địa chỉ phần tử mới tạo
Node* CreateNode(Data x)
{ Node *p;
p = new Node; //Cấp phát vùng nhớ cho phần tử
if ( p == NULL) exit(1);
p ->Info = x; //gán dữ liệu cho nút

p->pNext = NULL;
return p;
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
19
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
c. Duyệt danh sách

➢ Duyệt danh sách là thao tác thường được thực hiện khi có
nhu cầu cần xử lý các phần tử trong danh sách như:
▪ Đếm các phần tử trong danh sách.
▪ Tìm các phần tử trong danh sách thoả điều kiện.
▪ Sắp xếp các phần tử trong danh sách.
▪ Hủy toàn bộ danh sách.
▪ ….

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
20
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
c. Duyệt danh sách (tt)
Thuật toán:
• Bước 1:
p = pHead; // p lưu địa chỉ của phần tử đầu trong List

• Bước 2:
Trong khi (danh sách chưa hết) thực hiện:
+ xử lý phần tử p
+ p = p->pNext; // qua phần tử kế

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
21
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
In ra màn hình các phần tử trong DSLK

void PrintList(LIST l)
{
Node *p;
p = l.pHead;
while (p != NULL)
{ cout<< p->Info;
p = p->pNext;
}
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
22
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
d. Tìm một phần tử có Info bằng x
➢ Các bước của thuật toán tìm nút có Info bằng x trong list đơn
(thuật toán tìm tuyến tính)
Bước 1: p=pHead;// địa chỉ của phần tử đầu trong list đơn
Bước 2:
Trong khi p!=NULL và p->Info!=x
p=p->pNext;// xét phần tử kế
Bước 3:
+ Nếu p!=NULL thì p lưu địa chỉ của nút có
Info = x
+ Ngược lại : Không có phần tử cần tìm

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
23
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
d. Tìm một phần tử có Info bằng x (tt)

➢ Hàm tìm phần tử có Info = x, hàm trả về địa chỉ của nút được
tìm thấy, ngược lại hàm trả về NULL.
Node *Search(LIST l, Data x)
{
Node *p;
p = l.pHead;
while ((p!= NULL) && (p->Info != x))
p = p->pNext;
return p;
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
24
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
d. Tìm một phần tử có Info bằng x (tt)

pHead 1f 2f 3f 4f 5f
34 3 4 8 56
P

X = 8 Tìm thấy, hàm trả


về địa chỉ của nút
tìm thấy là 4f

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
25
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
e. Thêm một phần tử có khóa x vào danh sách

➢ 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
▪ Thêm vào cuối
▪ Thêm vào sau 1 phần tử q cho trước

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
26
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thêm một phần tử vào đầu DSLK
➢ 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;

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
27
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thêm một phần tử vào đầu DSLK (tt)
void AddHead(LIST &l, Node* p)
{
if (l.pHead==NULL)
{
l.pHead = p;
l.pTail = l.pHead;
}
else
{
p->pNext = l.pHead;
l.pHead = p;
}
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
28
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Minh họa thêm một phần tử vào đầu DSLK

pHead 2f 3f 4f
3 3f 4 4f 8…
9f
10 2f
N
pHead=P P->pNext=pHead
P

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
29
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thêm một phần tử vào cuối DSLK

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

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
30
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thêm một phần tử vào cuối DSLK (tt)
void AddTail(LIST &l, Node *p)
{
if (l.pHead == NULL)
{ l.pHead = p;
l.pTail = l.pHead;
}
else
{ l.pTail->Next = p;
l.pTail = p;
}
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
31
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Minh họa thêm một phần tử vào cuối DSLK

pTail
3f 4f 5f
4 4f 8 5f 5 N9f
pTail=P
pTail->pNext = p 9f
6N
P

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
32
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thêm một phần tử p vào sau phần tử q

Bắt đầu:
Nếu (q != NULL) thì
B1: p->pNext = q->pNext;
B2:
+ q->pNext = p ;
+ nếu q = pTail thì pTail=p;

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
33
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thêm một phần tử p vào sau phần tử q (tt)

void InsertAfterQ(List &l, Node *p, Node *q)


{
if (q != NULL)
{
p->pNext = q->Next;
q->pNext = p;
if (l.pTail == q) l.Tail=p;
}
else
AddHead(l,q); // hàm thêm q vào đầu list
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
34
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Minh họa thêm một phần tử p vào sau phần tử q

3f 4f q 5f
4 4f 8 5f
9f 5 ..
9f
7 N5f
q->pNext=P
P->pNext=q->pNext
P
f. Hủy một phần tử trong DSLK
➢ Nguyên tắc: Phải “cô lập” phần tử cần hủy trước khi hủy.
➢ Các vị trí có thể hủy:

▪ Hủy phần tử đứng đầu List

▪ Hủy phần tử có khoá bằng x

▪ Huỷ phần tử đứng sau q trong List

➢ Ở 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.

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
36
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hủy một phần tử đứng đầu DSLK

➢ Bắt đầu:
▪ Nếu (pHead != NULL) thì
▪ B1: p = pHead;
▪ B2:
+ pHead = pHead->pNext ;
+ delete (p);
▪ B3:
Nếu (pHead == NULL) thì pTail=NULL;

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
37
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hủy một phần tử đứng đầu DSLK (tt)
➢ Hàm trả về 1 nếu hủy được, ngược lại, hàm trả về 0.
int RemoveHead(List &l, int &x)
{ Node *p;
if (l.pHead != NULL)
{ p = l.pHead;
x = p->Info; // lưu dữ liệu của nút cần hủy
l.pHead = l.pHead->pNext;
delete p;
if (l.pHead == NULL) l.pTail=NULL;
return 1;
}
return 0;
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
38
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hủy một phần tử đứng đầu DSLK (tt)

pHead=pHead->pNext
pHead 2f 3f
1f 4f

7 2f 6 3f 3 4f 8 …
P=pHead
P

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
39
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hủy phần tử p sau phần tử q trong DSLK

➢ Bắt đầu
Nếu (q != NULL) thì
▪ B1: p = q->pNext;
▪ B2: Nếu (p != NULL) thì
+ q->pNext = p->pNext;
+ nếu (p == pTail) pTail = q;
+ delete p;

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
40
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hủy phần tử p sau phần tử q trong DSLK (tt)
int RemoveAfterQ(LIST &l,Node *q, int &x)
{ Node *p;
if(q != NULL) //q tồn tại trong List
{ p = q->pNext; //p là nút cần hủy
if (p != NULL) // q không phải là nút cuối
{ if (p == l.pTail) //nút cần hủy là nút cuối cùng
l.pTail = q; // cập nhật lại pTail
q->pNext = p->pNext; // tách p ra khỏi xâu
x = p->Info; // lưu dữ liệu nút hủy
delete p; // hủy nút p
}
return 1;
}
else return 0; }
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
41
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hủy phần tử p sau phần tử q trong DSLK (tt)

p-=q->pNext
q p
2f 3f
pHead 1f 4f

7 2f 6 4f
3f 3 4f 8 …

q->pNext=p->pNext

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
42
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hủy phần tử có khóa x trong DSLK

Bước 1:
Tìm phần tử p có khoá bằng x, và q đứng trước p
Bước 2:
Nếu (p!=NULL) thì //tìm thấy phần tử có khoá bằng x
Hủy p ra khỏi List bằng cách hủy phần tử
đứng sau q
Ngược lại
Báo không tìm thấy phần tử có khoá bằng x

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
43
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hủy phần tử có khóa x trong DSLK (tt)
int RemoveX(LIST &l, int x)
{ Node *p,*q = NULL; p=l.Head;
while((p != NULL) && (p->Info != x)) // tìm x
{ q = p;
p = p->Next;
}
if (p == NULL) //không tìm thấy phần tử có khoá bằng x
return 0;
if (q != NULL) // tìm thấy phần tử có khoá bằng x
DeleteAfterQ(l,q,x);
else RemoveHead(l,x); //phần tử cần hủy nằm đầu List
return 1;
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
44
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
g. Hủy DSLK đơn

▪ Bước 1:
Trong khi (danh sách chưa hết) thực hiện
• B11:
p = pHead;
pHead = pHead->pNext; // cập nhật pHead
• B12:
Hủy p
▪ Bước 2:
pTail = NULL; // bảo toàn tính nhất quán khi DS rỗng

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
45
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
g. Hủy DSLK đơn (tt)

void RemoveList(LIST &l)


{ Node *p;
while (l.pHead!=NULL) //còn phần tử trong List
{ p = l.pHead;
l.pHead = p->pNext;
delete p;
}
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
46
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
g. Hủy DSLK đơn (tt)

pHead pTail

2f 3f
1f 4f 5f

7 2f 6 3f 3 4f 8 5f 9 N

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
47
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
h. Sắp xếp DSLK đơn
Có hai cách tiếp cận
➢ Cách 1: Thay đổi thành phần Info
pHead pTail

3f 4f 5f
4 4f 7 5f 6 N

pHead pTail

3f 4f 5f
4 4f 6 5f 7 N

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
48
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
h. Sắp xếp DSLK đơn (tt)
➢Cách 2: Thay đổi thành phần pNext (thay đổi trình tự liên kết
của các phần tử sao cho tạo lập nên được thứ tự mong muốn)

pHead pTail

3f 4f 5f
4 4f 7 5f 6 N
pHead
pTail
3f 4f 5f

4 5f 7 N 6 4f

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
49
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
h. Sắp xếp DSLK đơn (tt)
➢ Thay đổi thành phần Info (dữ liệu)
▪ Ưu: Cài đặt đơn giản, tương tự như sắp xếp mảng
▪ Nhược:
• Đòi hỏi thêm vùng nhớ khi hoán vị nội dung của 2 phần tử -> chỉ
phù hợp với những xâu có kích thước Info nhỏ
• Khi kích thước Info (dữ liệu) lớn chi phí cho việc hoán vị thành
phần Info lớn
✓Làm cho thao tác sắp xếp chậm
➢ Thay đổi thành phần pNext
▪ Ưu:
• Kích thước của trường này không thay đổi, do đó không phụ thuộc
vào kích thước bản chất dữ liệu lưu tại mỗi nút.
✓Thao tác sắp xếp nhanh
▪ Nhược: Cài đặt phức tạp

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
50
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
h. Sắp xếp DSLK đơn (tt)
void SelectionSort(LIST &l)
{
Node *p, *q, *min; while (q != NULL)
p = l.pHead; {
while (p != l.pTail) if (q->Info < p->Info)
{ min = q;
min = p; q = q->Next;
q = p->Next; }
Swap(min->Info, p->Info);
p = p->Next;
}
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
51
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
h. Sắp xếp DSLK đơn (tt)

➢ Các thuật toán sắp xếp danh sách bằng các thay đổi
thành phần pNext (thành phần liên kết) có hiệu quả
cao như:
▪ Thuật toán sắp xếp Quick Sort
▪ Thuật toán sắp xếp Merge Sort
▪ Thuật toán sắp xếp Radix Sort

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
52
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thuật toán sắp xếp Quick Sort

• Bước 1: Chọn X là phần tử đầu danh sách L làm phần tử cầm canh.
Loại X ra khỏi L.
• Bước 2: Tách danh sách L ra làm 2:
– L1 (gồm các phần tử nhỏ hơn hoặc bằng x)
– L2 (gồm các phần tử lớn hơn X)
• Bước 3: Nếu (L1 != NULL) thì QuickSort(L1)
• Bước 4: Nếu (L2 != NULL) thì QuickSort(L2)
• Bước 5: Nối L1, X, L2 lại theo thứ tự ta có danh sách L đã được sắp xếp

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
53
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thuật toán sắp xếp Quick Sort (tt)
➢Cho danh sách liên kết gồm các phần tử sau:
pTail
pHead
4 6 5 1 8 2

X= 4
pTail
pHead
L1 (X) 1 2
pTail
pHead
L2 (>X) 6 5 8
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
54
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thuật toán sắp xếp Quick Sort (tt)
➢Sắp xếp L1
➢Sắp xếp L2
▪ Chọn x=6 cầm canh, và tách L2 thành L21 và L22
X2 = 6

pTail
pHead
L21 (X) 2

pTail
pHead
L22 (>X) 8
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
55
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thuật toán sắp xếp Quick Sort (tt)
➢ Nối L21, X2, L22 thành L2
pTail
pHead
L2 6 6 8

➢Nối L1, X, L2 thành L

pTail
pHead
1 2 4 5 6 8

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
56
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thuật toán sắp xếp Quick Sort (tt)
void QuickSort(LIST &l)
{ Node *p,*X; //X lưu địa chỉ của phần tử cầm canh
LIST l1,l2;
if (l.pHead == l.pTail) return; //đã có thứ tự
CreateList(l1);
CreateList(l2);
X = l.pHead;
l.pHead = X->pNext;
while (l.pHead != NULL) //tách L = L1 va L2
{ p = l.pHead;
l.pHead = p->pNext;
p->pNext = NULL;
if (p->Info <= X->Info)
AddHead(l1,p);
else
AddHead(l2,p);
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
57
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Thuật toán sắp xếp Quick Sort (tt)
QuickSort(l1); //Gọi đệ quy sắp xếp L1
QuickSort(l2); //Gọi đệ quy sắp xếp L2
if (l1.pHead != NULL) //nối l1, l2 va X vao l
{
l.pHead = l1.pHead;
l1.pTail->pNext = X; //nối X vào
}
else
l.pHead = X;
X->pNext = l2.pHead;
if (l2.pHead != NULL) //l2 có trên một phần tử
l.pTail = l2.pTail;
else //l2 không có phần tử nào
l.pTail = X;
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
58
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Bài tập
Yêu cầu: Viết chương trình tạo một DSLK đơn, trong đó thành
phần dữ liệu của mỗi nút là số nguyên dương.
1. Liệt kê tất cả thành phần dữ liệu của các nút.
2. Tìm 1 phần tử có khoá bằng x ?
3. Xoá 1 phần tử đầu ?
4. Xoá 1 phần tử có khoá bằng x ?
5. Sắp xếp tăng dần theo thành phần dữ liệu (Info).
6. Chèn 1 phần tử vào DSLK, sao cho sau khi chèn DSLK vẫn
tăng dần theo thành phần dữ liệu.
..........

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
59
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hàm main
void main()
{ LIST l1; Node *p; int x;
CreateList(l1);
do {
cout<<“ Nhap x= ”); cin>>x;
if (x>0)
{ p = CreateNode(x);
AddHead(l1,x);
}
} while (x>0);
cout<<“Danh sách mới thành lập là:”;
PrintList(l1);
cout<<“Nhập số cần tìm x =”); cin>>x;

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
60
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hàm main (tt)

p = Search(l1,x);
if (p==NULL) cout<<“không tìm thấy”;
else cout<<“tìm thấy”;
RemoveHead(l1,x);
cout<<“danh sách sau khi xóa: ”;
PrintList(l1);
cout<<“Nhập khoá cần xoá: ”;
cin>>x;
RemoveX(l1,x);

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
61
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Hàm main (tt)

cout<<“Danh sách sau khi xoá:”;


PrintfList(l1);
SelectionSort(l1);
cout<<“Danh sách sau khi sắp xếp:”;
PrintfList(l1);
RemoveList(l1);
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
62
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Vài ứng dụng DSLK

• Dùng để lưu trữ danh sách các học viên trong lớp học.
• Dùng để quản lý danh sách nhân viên trong một công
ty, trong cơ quan.
• Dùng để quản lý danh sách các nguồn tài liệu trong thư
viện (giáo trình, TLTK, chuyên khảo, …)
• Dùng để quản lý các băng đĩa trong tiệm cho thuê đĩa.
• …..

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
63
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Quản lý danh sách lớp

Yêu cầu: Thông tin của một sinh viên gồm: mã số sinh viên
MSSV, tên sinh viên TEN, điểm trung bình DTB .
1. Hãy khai báo cấu trúc dữ liệu dạng DSLK đơn để lưu danh sách
sinh viên nói trên.
2. Nhập danh sách các sinh viên, và thêm từng sinh viên vào đầu danh
sách (việc nhập kết thúc khi tên của một sinh viên bằng khoảng
trắng)
3. Tìm một sinh viên có trong lớp học hay không ?
4. Xoá một sinh viên có MSSV bằng x (x nhập từ bàn phím).
5. Liệt kê thông tin của các sinh viên có điểm trung bình lớn hơn hay
bằng 5.

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
64
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Quản lý danh sách lớp (tt)
6. Xếp loại và in ra thông tin của từng sinh viên, biết rằng cách xếp
loại như sau:
ĐTB <=3.6 : Loại yếu
ĐTB>=50 và ĐTB<6.5 : Loại trung bình
ĐTB>=6.5 và ĐTB < 7.0: Loại trung bình khá
ĐTB>=7.0 và ĐTB <8.0: Loại khá
ĐTB>=8.0 và ĐTB < 9.0: Loại giỏi.
ĐTB>=9.0 : Loại xuất sắc
7. Sắp xếp và in ra danh sách sinh viên tăng theo điểm trung
bình.
8. Chèn một sinh viên vào danh sách sinh viên tăng theo điểm
trung bình nói trên, sao cho sau khi chèn danh sách sinh viên
vẫn tăng theo điểm trung bình
...
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
65
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
CTDL cho bài toán

• Cấu trúc dữ liệu của một sinh viên


typedef struct
{ char TEN[40];
char MSSV[40];
float ĐTB;
}SV
• Cấu trúc dữ liệu của 1 nút trong DSLK
typedef struct tagNode
{ SV Info;
struct tagNode *pNext;
}Node;
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
66
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Câu hỏi và bài tập

1. Nêu các bước để thêm một nút vào đầu, giữa và cuối danh
sách liên kết đơn.
2. Nêu các bước để xóa một nút ở đầu, giữa và cuối danh
sách liên kết đơn.
3. Viết thủ tục để in ra tất cả các phần tử của 1 danh sách liên
kết đơn.
4. Viết chương trình thực hiện việc sắp xếp 1 danh sách liên
kết đơn bao gồm các phần tử là số nguyên.
5. Viết chương trình cộng 2 đa thức được biểu diễn thông qua
danh sách liên kết đơn.
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
67
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn

You might also like