Professional Documents
Culture Documents
CH 2
CH 2
DANH SÁCH
• Danh sách: là một dãy các phần tử
• n: số phần tử của danh sách
• Danh sách rỗng: danh sách không có
phần tử nào cả, tức n=0
Danh sách là khái niệm thường gặp trong
thực tế, như danh sách sinh viên trong một
lớp, danh sách nhân viên của một công ty…
Chương 2
DANH SÁCH
Có 2 cách cơ bản biểu diễn danh sách:
• Danh sách đặc: các phần tử được lưu trữ
kế tiếp nhau trong bộ nhớ, phần tử thứ i
được lưu trữ ngay trước phần tử thứ i+1
được khai báo bởi một mảng
• Danh sách liên kết: các phần tử được lưu
trữ tại những vùng nhớ khác nhau trong
bộ nhớ, nhưng được kết nối với nhau
Chương 2
DANH SÁCH
Các thao tác thường dùng trên danh sách:
• Khởi tạo danh sách: tức là làm cho có
danh sách, nhưng là danh sách rỗng
• Kiểm tra xem danh sách có rỗng không
• Liệt kê các phần tử có trong danh sách
• Tìm kiếm phần tử trong danh sách
• Thêm phần tử vào danh sách
• Xóa phần tử ra khỏi danh sách
Chương 2
DANH SÁCH
• Sửa các thông tin của một phần tử
• Thay thế một phần tử bằng phần tử khác
• Sắp xếp thứ tự các phần tử trong danh sách
• Ghép một danh sách vào danh sách khác
• Trộn các danh sách đã có thứ tự để được một
danh sách mới cũng có thứ tự
• Tách một danh sách ra thành nhiều danh sách
Chương 2
DANH SÁCH
9
2.1. Danh sách đặc
2.1.4. Tìm kiếm phần tử
Trả về chỉ số của phần tử x đầu tiên, không có
thì trả về -1
int Search (int x, LIST A, int n)
{
int i=0;
while (i<n && A[i]!=x) i++;
if (i == n) i = -1;
return i;
} 10
2.1. Danh sách đặc
2.1.5. Thêm phần tử
Thêm phần tử x vào vị trí thứ i trong danh sách
int Insert (int x, int i, LIST A, int &n)
{
int j;
for (j=n; j>i; j--) A[j]=A[j-1];
A[i]=x;
n++;
}
11
2.1. Danh sách đặc
2.1.6. Xóa phần tử
Xóa phần tử thứ i bằng cách loại ra khỏi danh
sách
int Remove(int i, LIST A, int &n)
{
int j=0;
for (j=i; j<n-1; j++) A[j]=A[j+1];
n--;
}
12
2.1. Danh sách đặc
2.1.7. Sắp xếp danh sách
Sắp xếp danh sách theo thứ tự tăng dần
void Sort (LIST A, int n)
{
int i, j, temp;
for (i=0; i<n-1; i++)
for (j=i+1; j<n; j++)
if ( A[j] < A[i]){
temp= A[i]; A[i]=A[j]; A[j]=temp;
} 13
2.2. Danh sách liên kết
14
2.2.1 Danh sách liên kết đơn
• Khai báo
• Khởi tạo danh sách rỗng
• Kiểm tra danh sách rỗng
• Xuất danh sách
• Thêm phần tử vào đầu danh sách
• Nối hai danh sách
• Tìm phần tử trong danh sách
• Xóa phần tử 15
2.2.1.Danh sách liên kết đơn
• Khai báo
16
2.2.1.Danh sách liên kết đơn
• Khởi tạo và kiểm tra danh sách rỗng
int setEmpty(phantu *L)
{
L=NULL;
}
19
2.2.1.Danh sách liên kết đơn
• Thêm phần tử x vào đầu danh sách
void Insert (int x, phantu *L)
{
phantu *p;
p=(phantu *) malloc(sizeof(phantu));
p->data=x;
p->next=L;
L=p;
20
2.2.1.Danh sách liên kết đơn
21
2.2.1.Danh sách liên kết đơn
• Thêm phần tử x vào sau q
void Insert (int x, phantu *q, phantu *L)
{
phantu *p;
p=(phantu *) malloc(sizeof(phantu));
p->data=x;
p->next=q->next;
q->next=p;
22
2.2.1.Danh sách liên kết đơn
• Nối hai danh sách thành một danh sách mới
void Concatenate (phantu *L1 phantu *L2,
phantu *L)
{
phantu *p;
L=L1;
p=L; while (p->next!=NULL) p=p->next;
p->next=L2;
23
}
2.2.1.Danh sách liên kết đơn
• Tìm phần tử x và trả về con trỏ chỉ đến nó
phantu * Search(int x, phantu *L)
{
phantu *p;
p=L;
while (p!=NULL && p->data!=x)
p=p->next;
return p;
24
2.2.1.Danh sách liên kết đơn
• Loại phần tử sau p ra khỏi danh sách