You are on page 1of 43

CẤU TRÚC DỮ LIỆU

& GIẢI THUẬT


ĐH HUTECH
KHOA CNTT
GV: TS. HUỲNH MINH TRÍ
Bài 2. Cấu Trúc Danh Sách
Sau khi học xong bài này, học viên có thể:

▪ Hiểu được cấu trúc danh sách.

▪ Cài đặt danh sách theo hai phương pháp: cài đặt danh sách
theo kiểu kế tiếp và kiểu liên kết.

▪ Hiện thực danh sách kề và danh sách liên kết, áp dụng vào
bài toán thực tế.

08/09/2023 2
Nội Dung
2.1 Khái Niệm
2.2 Cấu Trúc Danh Sách
2.3 Phương Pháp Cài Đặt Danh Sách
2.4 Hiện Thực Danh Sách Kề
2.5 Hiện Thực Danh Sách Liên Kết Đơn
2.6 Các Loại Danh Sách Liên Kết Khác
Tóm Tắt
Câu Hỏi Ôn Tập
08/09/2023 3
2.1 Khái Niệm (1)
Danh sách (List) là một trong những cấu trúc cơ bản nhất được
cài đặt trong hầu hết các chương trình ứng dụng.

Danh sách là một kiểu dữ liệu trừu tượng gồm nhiều nút
cùng kiểu dữ liệu, các nút trong danh sách có thứ tự.

Có hai cách cài đặt danh sách:

- Cài đặt theo kiểu kế tiếp, ta có danh sách kề.

- Cài đặt theo kiểu liên kết, ta có danh sách liên kết.

08/09/2023 4
2.1 Khái Niệm (2)
2 cách cài đặt

Kiểu kế tiếp Kiểu liên kết

Danh sách liên kết


-DSLK đơn
Mảng 1 chiều
-DSLK kép
-DSLK vòng

08/09/2023 5
2.1 Khái Niệm (3)
• Các thao tác cơ bản

– Khởi tạo (init)

– Kiểm tra danh sách có rỗng không (isEmpty)

– Kiểm tra danh sách có đầy không (isFull)

– Kích thước của danh sách (ListSize)

– Truy xuất nút tại vị trí position trong danh sách (Retrieve)

– Thêm nút vào vị trí pos của danh sách (Insert)


08/09/2023 6
2.1 Khái Niệm (4)
• Các thao tác cơ bản (tt)
– Xóa nút tại vị trí pos của danh sách (Remove)
– thay thế nút tại vị trí pos của danh sách bằng nút khác
(Replace)
– Duyệt tất cả các nút của danh sách (ShowList)
– Sắp xếp lại danh sách theo một khoá sắp xếp (Sort)
– Tìm kiếm một nút trong danh sách theo một khoá tìm kiếm
(Search)
– Xoá danh sách (Clearlist)
08/09/2023 7
2.3 Phương pháp cài đặt danh sách (1)
• Có hai cách cài đặt danh sách:

1. Cài đặt theo kiểu danh sách kế tiếp (mảng,


chuỗi ký tự, stack, queue,…) và

2. Cài đặt theo kiểu danh sách liên kết

08/09/2023 8
2.3 Phương pháp cài đặt danh sách (2)
▪ Mảng 1 chiều (danh sách kế tiếp)
• Kích thước cố định (fixed size)
• Các phần tử tuần tự theo chỉ số 0  n-1
• Truy cập ngẫu nhiên (random access)
• Chèn, xóa 1 phần tử vào mảng rất khó
• Cài đặt mảng Chèn, xóa Chậm!!!
1 chiều (SV
tự cài đặt)

0 1 2 3 4 n-2 n-1

08/09/2023 9
2.3 Phương pháp cài đặt danh sách (3)
▪ Danh sách liên kết
• Cấp phát động lúc chạy chương trình
• Các phần tử nằm rải rác ở 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
Insert, Nhanh,
• SV sẽ được Delete đơn giản
học cách cài
đặt

08/09/2023 10
2.4 Hiện Thực Danh Sách Liên Kết Đơn

• 2.4.1. Định nghĩa

• 2.4.2. Các thao tác cơ bản

08/09/2023 11
2.4.1. DSLK Đơn - định nghĩa (1)
• DSLK đơn là một danh sách các node, mỗi node
gồm 2 thành phần:

✓ Phần chứa dữ liệu: Info

✓ Phần chỉ vị trí (địa chỉ) của phần tử tiếp theo


trong danh sách: Next
Info Next
✓ Phần next là con trỏ,
Node
trỏ đến node kế tiếp
08/09/2023 12
2.4.1. DSLK Đơn - định nghĩa (2)
• Khai báo 1 node
typedef struct node
{
DataType info;
struct node * next;
}Node;

info next

08/09/2023 13
2.4.1. DSLK Đơn - định nghĩa (3)
Header Node Tail Node

NULL
Next Next Next Next
pHead
A B C D
Data Data Data Data

Con trỏ đến node đầu tiên


(giữ địa chỉ của node đầu tiên)

08/09/2023 14
2.4.1. DSLK Đơn - định nghĩa (4)
Địa chỉ
Ví dụ:
800 200 500 100
800 200 500 100 NULL
Next Next Next
pHead
‘X’ ‘Y’ ‘U’ ‘V’
Data Data Data Data

Con trỏ đến node đầu tiên


(giữ địa chỉ của node đầu tiên)
08/09/2023 15
2.4.2. DSLK đơn – Thao tác cơ bản
• Các thao tác cơ bản
Phần minh
1. Init hoạ sẽ dùng
2. IsEmpty DataType là
3. InsertFirst int
4. InsertAfter typedef struct node
5. DeleteFirst {
6. DeleteAfter int info;
7. DeleteAll struct node * next;
8. ShowList }Node;
9. Search
10.Sort Node* pHead;
08/09/2023 16
2.4.2. DSLK đơn – Thao tác tạo nút
•Tạo nút chứa dữ liệu X
new
Node* CreateNode(int X){
p X
Node* p=new Node;
p=new Node;
p->info=X;
p->info=X;
p->next=NULL; p->next=NULL;
return p;
}

08/09/2023 17
2.4.2.khởi tao &Kiểm tra danh sách rỗng

•Khởi tạo 1 ds liên kết •Kiểm tra ds liên kết có rỗng ?


void Init(Node* &pHead) int IsEmpty (Node* pHead)
{ {
pHead = NULL; return (pHead == NULL);
} }

08/09/2023 18
2.4.2. DSLK đơn – Thêm đầu
•void InsertFirst(Node* &pHead, int x){…}
p new
pHead X
pHead
1
p p

pHead
pHead

22 33 pHead=p
p→next=pHead
08/09/2023 19
2.4.2. DSLK đơn – Thêm đầu
void InsertFirst(Node* &pHead, int x)
{
Node* p = CreateNode(x);
p->next = pHead;
pHead = p;
}

08/09/2023 20
2.4.2. DSLK đơn – Thêm sau 1 nút
void InsertAfter(Node* p, int x){…}
p tam
p new

1
tam tam
p 2 p
3

P->next P->next
P→next = tam
2 tam→next = p→next 3
08/09/2023 21
2.4.2. DSLK đơn – Thêm sau 1 nút
void InsertAfter(Node* p, int x)
{
Node* q;
if (p!=NULL){
q = createNode(x);
q->next = p->next;
p->next = q
}
}

08/09/2023 22
2.4.2. DSLK đơn – Xóa đầu
void DeleteFirst(Node* &pHead){…}
pHead pHead

p p = pHead 1
pHead pHead->next pHead

pHead = pHead→next 2 p delete p; 3


08/09/2023 23
2.4.2. DSLK đơn – Xóa đầu
void DeleteFirst(Node* &pHead){
Node* p;
if (IsEmpty(pHead))
printf(“List is empty!”);
else {
p = pHead;
pHead = pHead->next;
delete p;
}
}
08/09/2023 24
2.4.2. DSLK đơn – Xóa sau
• Xoá node q sau node p trong danh sách
p q q->next

1
1 q = p->next
p q q->next
2
2 p->next = q->next
p q q->next

3
3 delete q
08/09/2023 25
2.4.2. DSLK đơn – Xóa sau
void DeleteAfter(Node* p)
{ Node* q;
if (p==NULL || p->next ==NULL)
//kiem tra nut sau p co ton tai ko
printf(“Khong the xoa nut nay!”);
else
{ q = p->next;
p->next = q->next;
delete q;
}
08/09/2023 } 26
2.4.2. DSLK đơn –Xóa toàn bộ
pHead pHead

p p
p = pHead; pHead = pHead->next;
1 delete p; 2
pHead
pHead

p p
3 4
08/09/2023 27
2.4.2. DSLK đơn –Xóa toàn bộ
void ClearList(Node* &phead)
{ Node* p;
while (pHead!=NULL)
{ p = pHead;
pHead = p->next;
delete p;
}
}
08/09/2023 28
2.4.2. Duyệt 1 ds liên kết
//dùng while void ShowList(Node* pHead)
{ Node* p = pHead;
if(p == NULL)
printf(“\n Danh sach bi rong”);
while(p != NULL)
{ printf(“%d \t”,p->info);
p = p->next;
}
08/09/2023
} 29
2.4.2. Duyệt 1 ds liên kết
//dùng for void ShowList(Node* pHead)
{
if(pHead == NULL)
printf(“\n Danh sach bi rong”);
else
for (Node* p = pHead; p!=NULL; p = p->next)
printf(“%d \t”,p->info);
}
08/09/2023 30
2.4.2.Tìm kiếm 1 nút trong dslk có giá trị x
//dùng while
Node* Search(Node* pHead, int x)
{ Node* p = pHead;
while(p->info !=x && p!=NULL)
p = p->next;
return p;
}

08/09/2023 31
2.4.2.Tìm kiếm 1 nút trong dslk có giá trị x
//dùng for Node* Search(Node* pHead, int x)

{ Node* p;
for(p = pHead; p!=NULL; p = p->next)
if (p->info ==x ) return p;
return NULL;
}

08/09/2023 32
2.4.2. DSLK đơn – sắp xếp theo selection sort
void Sort(Node * &pHead) 1
{ Node * p, *q, *pmin;
int min;
for(p = phead; p->next != NULL; p = p->next)
{ min = p->info;
pmin = p;
for(q = p->next;q != NULL;q = q->next)
{ if (q->info < min) {
08/09/2023 33
2.4.2. DSLK đơn – sắp xếp theo selection sort
min = q->info; 2
pmin = q;
} // hết if (q->info < min)
} // hết for(q ….)
pmin->info = p->info;
p->info = min
} // hết for (p …)
} // hết void Sort(..)
08/09/2023 34
2.5. Các loại DSLK khác

2.5.1. DSLK vòng

2.5.2. DSLK kép

08/09/2023 35
2.5.1. DSLK vòng
• Tương tự như danh sách liên kết đơn.
• Trường next của nút cuối chỉ đến đầu danh sách

Header Node Tail Node Trường


Next của
nút cuối ko
Next Next Next Next còn trỏ đến
pHead
NULL, mà
A B C D
Data Data Data Data
trỏ đến nút
đầu
08/09/2023 36
2.5.1. DSLK vòng
• Mô tả
– Sử dụng pList trỏ đến phần tử cuối của danh sách

Tail Node

Next Next Next


pList
Next

A B C D
Data Data Data Data

08/09/2023 37
2.5.1. DSLK vòng
• Khai báo & khởi tạo
typedef struct node
{
DataType info;
struct node *next;
}Node;

Node* pList; pList trỏ nút cuối ds


pList = NULL; Khởi tạo dslk
08/09/2023 38
2.5.2. DSLK kép
▪ Cho phép di chuyển 2 chiều đến nút trước và sau.
– Liên kết nút trước là: prev
– Liên kết nút sau là: next
▪ Nút đầu có prev là NULL
▪ Nút cuối có next là NULL
prev prev prev
NULL NULL
next next
next

pHead A Data C Data


B Data
08/09/2023 39
2.5.2. DSLK kép
• Khai báo typedef struct node
{
DataType info;
struct node * prev; trỏ đến nút trước
struct node * next; trỏ đến nút sau
}Node;

pHead quản lý ds kép Node* pHead;


Khởi tạo dslk pHead = NULL;
08/09/2023 40
Câu Hỏi Ôn Tập Bài 4
1. Nhập 1 dãy số nguyên
– Tạo danh sách liên kết đơn, mỗi phần tử là một số
nguyên.
– Xuất dãy số
– Cài đặt các thao tác thêm, xóa trên dãy số
2. Viết chương trình quản lý danh sách sinh viên (sử
dụng DS Liên Kết Đơn).

08/09/2023 41
Câu Hỏi Ôn Tập Bài 4
Thông tin mỗi sv gồm: mã sv, họ tên, điểm trung bình.
Chương trình có các chức năng sau:
– Tạo 1 danh sách gồm n SV (n nhập từ bàn phím,
thông tin của mỗi sv nhập từ bàn phím)
– Xuất danh sách sinh viên
– Xuất thông tin các sv có ĐTB>5
– Tìm sinh viên có tên là X
– Sắp xếp danh sách tăng theo ĐTB
08/09/2023 42
Câu Hỏi Ôn Tập Bài 4
3. Viết chương trình hiện thực danh sách liên kết đôi.

4. Viết chương trình hiện thực danh sách liên kết


vòng.

08/09/2023 43

You might also like