KHÁI NIỆM DANH SÁCH NỐI ĐƠN Danh sách được tạo thành từ các phần tử gọi là nút Node Các node có thể nằm bất kỳ đâu trong bộ nhớ Mỗi node là một cấu trúc gồm 2 thành phần infor chứ
Trang 1Please purchase a personal
license.CHƯƠNG 3 (tiếp)
Trang 2KHÁI NIỆM DANH SÁCH NỐI ĐƠN
Danh sách được tạo thành từ các phần tử gọi là nút
(Node)
Các node có thể nằm bất kỳ đâu trong bộ nhớ
Mỗi node là một cấu trúc gồm 2 thành phần
infor chứa thông tin của 1 phần tử của danh sách L
next là một con trỏ, nó trỏ vào node đứng sau.
A
Một node trong danh sách
Trang 3KHÁI NIỆM DANH SÁCH NỐI ĐƠN
Một node trong danh sách sinh viên
1089 là địa chỉ vùng nhớ của node đứng sau
Trang 4KHÁI NIỆM DANH SÁCH NỐI ĐƠN
Để truy nhập vào các node trong
danh sách ta phải đi từ node đầu tiên
Cần một con trỏ, trỏ vào node đầu
trong danh sách
A B
Danh sách nối đơn
L trỏ vào node đầu tiên của danh sách khi đó
Để truy xuất vào thông tin của phần tử ta viết
L->infor
Để chỉ ra phần tử đứng sau ta viết
L->next
Trang 5Vu Lan Anh
32 7.8 2038
Ha Anh Lan
23 8.7 1089
Ta Bach Lan 1547
L=20381089
Vu Hoa Lan
23 8.7 3452
Bui Nhu Lan
23 8.7
NULL 1032
3452
1032
Trang 6ƯU VÀ NHƯỢC ĐIỂM CỦA DSNĐ
Trang 7KHAI BÁO CẤU TRÚC DỮ LIỆU
Khai báo Cấu trúc dữ liệu MẪU
struct Item {
Các thành phần dữ liệu ;
Khai báo kiểu dữ liệu phần tử
typedef Node * TRO ;
Khai báo kiểu con trỏ trỏ vào Node
L=NULL -> ds L rỗng
};
struct Node {
Item infor ; Node * next ; };
Khai báo kiểu dữ liệu Node
KB con trỏ trỏ vào Node đầu tiên
TRO L ;
Trang 8KHAI BÁO CẤU TRÚC DỮ LIỆU
Khai báo Cấu trúc dữ liệu sinh viên
float diemtb;
};
SINHVIEN infor ; Node * next ;
};
KB con trỏ trỏ vào Node đầu tiên TRO L ;
typedef Node * TRO ;
Khai báo kiểu con trỏ của Node
Trang 9Khởi tạo danh sách rỗng
Kiểm tra danh sách rỗng
Duyệt danh sách
Tìm kiếm một node trên danh sách
CÁC PHÉP TOÁN TRÊN DANH SÁCH
Tìm kiếm một node trên danh sách
Bổ sung node mới vào đầu danh sách
Bổ sung node mới vào sau một node
Xóa node đầu danh sách
Xóa node đứng sau một node trong danh sách
Sắp xếp danh sách
Trang 10CÁC PHÉP TOÁN TRÊN DANH SÁCH
Khởi tạo danh sách rỗng
Danh sách nối đơn rỗng
Kiểm tra danh sách rỗng
Trang 11L Q
Q Q Q Q
hiện yêu cầu) và chuyển Q
xuống node ngay sau nó:
Q=Q->next;
3 Lặp lại bước 2
Q = NULL
Trang 12DUYỆT DANH SÁCH
void travel ( TRO L ) {
TRO Q;
if (!empty(L)) {
Q = L;
while (Q != NULL ) {
//Statement
Q = Q->next; }
} }
Trang 13TÌM KIẾM MỘT NODE TRÊN DANH SÁCH
A B
L Q
Q
Tìm thấy và con
trỏ Q trỏ vào
node tìm được
Trang 14TÌM KIẾM MỘT NODE TRÊN DANH SÁCH
1 Nếu danh sách không rỗng, cho con trỏ
Q trỏ vào node đầu tiên: Q = L;
2 Nếu (Q != NULL) và (chưa trỏ vào node cần tìm) thì (có thể thực hiện yêu cầu) và chuyển Q xuống node ngay sau nó:
Q=Q->next;
3 Lặp lại bước 2
4 Trả về con trỏ Q: return Q;
Trang 15TÌM KIẾM MỘT NODE TRÊN DANH SÁCH
A B
L Q
Q Q Q
Hàm Search trả về NULL nếu
không tìm thấy, ngược lại trả
về con trỏ trỏ vào node tìm
được
Trang 16BỔ SUNG VÀO ĐẦU DANH SÁCH
P
B
L
Danh sách có phần tử đầu tiên
được trỏ bởi con trỏ L
C D E
Khai báo con trỏ P: TRO P;
Cấp phát bộ nhớ cho con trỏ P:
P = new Node;
next của node mới trỏ vào phần tử
đầu của danh sách: P->next = L;
L trỏ vào node mới: L = P;
Đưa dữ liệu vào node mới:
P ->infor = X;
Trang 17BỔ SUNG VÀO ĐẦU DANH SÁCH
Hàm thực hiện việc bổ sung
void First_Add ( TRO &L , Item X ) {
Trang 18BỔ SUNG VÀO SAU MỘT NODE
P Q
Danh sách có phần tử đầu tiên
được trỏ bởi con trỏ L
Dữ liệu lưu trong biến X
Khai báo con trỏ P: TRO P;
A B
L
Q trỏ vào node mà node mới
được bổ sung vào sau nó
P Q
next của node mới trỏ vào node đứng
sau node trỏ bởi Q: P->next = Q->next;
next của node trỏ bởi Q trỏ vào
node mới: Q->next = P;
Đưa dữ liệu vào node mới:
Trang 19BỔ SUNG VÀO SAU MỘT NODE
Hàm thực hiện việc bổ sung
void Insert ( TRO &L , TRO Q , Item X ) { TRO P;
Trang 20XÓA NODE ĐẦU DANH SÁCH
Q
A B
L
1 Khai báo con trỏ Q: TRO Q;
2 Cho Q trỏ vào node đầu tiên:
Q = L;
L
F
C E
3 Chuyển L xuống node thứ 2:
L = L->next;
4 Xóa node trỏ bởi con trỏ Q:
delete Q;
Trang 21XÓA NODE ĐẦU DANH SÁCH
void First_Delete ( TRO &L ) {
Trang 22XÓA NODE SAU NODE TRỎ BỞI M
A B
L
1 Khai báo con trỏ Q: TRO Q;
2 Cho Q trỏ vào node ở sau
node trỏ bởi M: Q = M->next;
M
C Q
F
C E
3 next của M trỏ vào node sau
Trang 23XÓA NODE SAU NODE TRỎ BỞI M
void M_Delete ( TRO &L, TRO M) {
Trang 24TẠO MỘT DANH SÁCH MỚI
L
1 Khai báo 2 con trỏ P, Q và
biến X: TRO P, Q; Item X;
2 Nhập dữ liệu cho biến X;
4 Nếu L=NULL thì L trỏ vào P
Ngược lại next của node trỏ
bởi Q trỏ vào node mới
A
C
6 Nếu thỏa mãn điều kiện
nhập tiếp thì lặp lại bước 2,
ngược lại kết thúc
5 Cho Q trỏ vào node mới
Trang 25TẠO MỘT DANH SÁCH MỚI
void input_List( TRO &L)
cout<<“Co nhap nua khong(C/K)?:”; cin>>tieptuc; } while (toupper(tieptuc) == ‘C’); //Bước 6
}
Trang 26Bài tập
Chương trình quản lý sinh viên (mã SV, họ tên, năm sinh, điểm tổng kết) bằng danh sách nối đơn với các chức năng
Tạo mới danh sách
Xác định chiều dài danh sách
Hiển thị danh sách
Hiển thị danh sách
Tìm kiếm sinh viên theo mã và hiển thị thông tin của sinh viên nếu tìm thấy
Xóa sinh viên khi biết mã
Thêm một sinh viên mới vào danh sách theo vị trí
Sắp xếp danh sách theo chiều tăng dần
Trang 27DANH SÁCH NỐI VÒNG
Là một danh sách nối đơn
A B
L
Có next của node cuối cùng trỏ
vào node đầu tiên
DS nối vòng có ưu điểm là xuất
phát từ một vị trí bất kỳ có thể
C D E
phát từ một vị trí bất kỳ có thể
duyệt hết danh sách
Về cấu trúc dữ liệu và các phép
toán tương tự như DS nối đơn
Sinh viên tự nghiên cứu trong tài
liệu
Trang 28DANH SÁCH MÓC NỐI HAI CHIỀU
Là một danh sách móc nối mà mỗi
node có ba thành phần
infor prev
B
Thành phần infor chứa dữ liệu
Con trỏ next trỏ vào node đứng sau
next
Con trỏ prev trỏ vào node đứng trước
B
Trang 29DANH SÁCH MÓC NỐI HAI CHIỀU
L1 A
B
Hình ảnh danh sách móc nối hai chiều
Để quản lý danh sách trong bộ nhớ
người ta dùng hai con trỏ
C D L2
Con trỏ L1 trỏ vào node đầu của danh
sách
Con trỏ L2 trỏ vào node cuối của danh
sách
Trang 30KHAI BÁO CẤU TRÚC DỮ LIỆU
Khai báo Cấu trúc dữ liệu MẪU
struct Item {
Các thành phần dữ liệu ;
Khai báo kiểu dữ liệu phần tử
typedef Node * TRO ;
Khai báo kiểu con trỏ trỏ vào Node
L1/L2=NULL -> ds L rỗng
};
struct Node {
Item infor ; Node * next ; Node * prev ; };
Khai báo kiểu dữ liệu Node
KB con trỏ trỏ vào Node đầu tiên
và node cuối
TRO L1, L2 ;
Trang 31Khởi tạo danh sách rỗng
Kiểm tra danh sách rỗng
Duyệt danh sách
Tìm kiếm một node trên danh sách
Bổ sung node mới vào đầu danh sách
CÁC PHÉP TOÁN TRÊN DANH SÁCH
Bổ sung node mới vào đầu danh sách
Bổ sung node mới vào trước/sau một node
Xóa node đầu danh sách
Xóa node đứng trước/sau một node trong danh sách
Sắp xếp danh sách
Trang 32Bổ sung node mới vào đầu danh sách
Trang 33Bổ sung node mới vào đầu danh sách
L1 B
Trang 34Bổ sung node mới vào đầu danh sách
void first_Add ( TRO &L1, TRO &L1, Item X )