CÂU TRÚC DỮ LIỆU VÀ GIẢI THUẬT - CHƯƠNG 3 (tiếp) DANH SÁCH NỐI ĐƠN - Pdf 12

DANH SÁCH NỐI ĐƠN
CHƯƠNG 3 (tiếp)
KHÁI NIỆM DANH SÁCH NỐI ĐƠN

Nguyên tắc tạo thành danh sách

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
infor next
Một node trong danh sách
KHÁI NIỆM DANH SÁCH NỐI ĐƠN

Ví dụ
Tran Lan Anh
32
7.8
1089
infor

2038
Ha Anh Lan
23
8.7
1089
Ta Bach Lan
23
8.7
1547
Vu Hoa Lan
23
8.7
3452
L=2038
Bui Nhu Lan
23
8.7
NULL
1032
1089
1547
3452
1032
Ví dụ
ƯU VÀ NHƯỢC ĐIỂM CỦA DSNĐ

Ưu điểm:

Tiết kiệm bộ nhớ



Khai báo Cấu trúc dữ liệu sinh viên
struct SINHVIEN {
char hoten[30];
int tuoi;
float diemtb;
};
Khai báo kiểu dữ liệu SV
struct Node {
SINHVIEN infor;
Node *next;
};
Khai báo kiểu dữ liệu Node
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

Khở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

Bổ sung node mới vào sau một node


B
C
E
L
Q
Q
Q
Q
Q
2. Nếu Q != NULL 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
Q
Q = NULL
DUYỆT DANH SÁCH

Hàm duyệt danh sách như sau
void travel(TRO L)
{
TRO Q;
if (!empty(L))
{
Q = L;
while (Q != NULL)
{
//Statement
Q = Q->next;
}

C
E
L
Q
Q
Q
Q
Q
3. Giả sử cần tìm node có
infor là K trong danh sách
Q
Không tìm thấy
TRO Search(TRO L) {
Q = L;
while (Q != NULL && (ĐKTK chưa thỏa))
Q = Q->next;
return 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
BỔ SUNG VÀO ĐẦU DANH SÁCH
P
B
C
D
E
L
Danh sách có phần tử đầu tiên

được trỏ bởi con trỏ L
E
X
Dữ liệu lưu trong biến X
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 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:
P ->infor = X;
A
H
B
C
F
L
E
C
Q trỏ vào node mà node mới
được bổ sung vào sau nó
BỔ 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;
P = new Node;
P->infor = X;

}
C
XÓA NODE SAU NODE TRỎ BỞI M
Q
A
F
B
C
E
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;
3. next của M trỏ vào node sau
node trỏ bởi Q:
M->next = Q->next;
4. Xóa node trỏ bởi con trỏ Q:
delete Q;
M
XÓA NODE SAU NODE TRỎ BỞI M

Hàm xóa node sau con trỏ M
void M_Delete(TRO &L, TRO M)
{
TRO Q;
Q = M->next;
M->next = Q->next;
delete Q;
}
TẠO MỘT DANH SÁCH MỚI

TRO P, Q; Item X; char tieptuc; //Bước 1
L = NULL;
do{
nhap(X); //Bước 2
P = new Node;
P->infor = X; P->next = NULL; //Bước 3
if (L==NULL) L = P; //Bước 4
else Q->next = P;
Q = P; //Bước 5
cout<<“Co nhap nua khong(C/K)?:”; cin>>tieptuc;
}while (toupper(tieptuc) == ‘C’); //Bước 6
}


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status