Tải bản đầy đủ (.ppt) (85 trang)

CẤU TRÚC DỮ LIỆU - Chương 6: DANH SÁCH (LIST) pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.13 MB, 85 trang )

Môn: CẤU TRÚC DỮ LIỆU
Môn: CẤU TRÚC DỮ LIỆU
Chương 6: DANH SÁCH (LIST)
4.
4.
Danh sách liên kết (Linked
Danh sách liên kết (Linked
List)
List)
4.1. Định nghĩa
4.2. Danh sách liên kết đơn (Simply Linked List)
4.3. Danh sách liên kết kép (Doubly Linked List)
4.4. Danh sách liên kết vòng
4.5. Ưu nhược điểm của danh sách liên kết
4.
4.
Danh sách liên kết (tt)
Danh sách liên kết (tt)
4.1. Định nghĩa

Là tập hợp các phần tử mà giữa chúng có một sự nối kết
với nhau thông qua vùng liên kết của chúng.

Tùy cách liên kết giữa các phần tử, danh sách liên kết
chia thành các loại khác nhau:

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

Danh sách liên kết đôi/kép

Danh sách đa liên kết



Danh sách liên kết vòng (vòng đơn, vòng đôi)

Mỗi loại danh sách có cách biểu diễn theo các cấu trúc
dữ liệu và thao tác trên dữ liệu khác nhau.
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(SLL)
(SLL)
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(SLL)
(SLL)
4.2.1. Cấu trúc dữ liệu

Nội dung mỗi phần tử (nút) trong danh sách liên kết gồm
2 vùng Vùng dữ liệu và Vùng liên kết
struct node
{
int data;
node *link; // liên kết đến vùng của phần tử kế tiếp
};
data link
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(SLL)
(SLL)
4.2.1. Cấu trúc dữ liệu
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn

(tt)
(tt)
4.2.1. Cấu trúc dữ liệu (tt)

Để quản lý danh sách liên kết có thể dùng nhiều phương
pháp khác nhau, mỗi phương pháp sẽ có cấu trúc dữ liệu
cụ thể.

Quản lý địa chỉ phần đầu và cuối danh sách
struct List
{
Node *pHead;
Node *pTail;
};
info pNext pTail
pHead
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.1. Cấu trúc dữ liệu (tt)
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2. Các thao tác trên danh sách liên kết đơn
a. Khởi tạo danh sách SLL
b. Tạo mới 1 phần tử (nút) trong danh sách SLL
c. Thêm 1 phần tử vào danh sách SLL


Thêm vào đầu | cuối | giữa danh sách liên kết đơn
d. Duyệt qua các nút trong danh sách
e. Tìm kiếm phần tử trong danh sách
f. Hủy bỏ 1 phần tử trong danh sách
g. Hủy danh sách
h. Tạo mới danh sách/Nhập danh sách
i. Tách 1 danh sách thành nhiều danh sách
j. Nhập nhiều danh sách thành 1 danh sách
k. Sắp xếp thứ tự các phần tử trong danh sách
h. Sao chép 1 danh sách
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2. Các thao tác trên danh sách liên kết đơn:
Giả sử ta có các định nghĩa sau:

struct node{
int data;
node *link;
};

struct List{
node *pHead;
node *pTail;
};

node *p;

List l;

4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2.a. Khởi tạo danh sách SLL

Thao tác khởi tạo danh sách liên kết đơn là cho giá trị con
trỏ quản lý địa chỉ đầu của danh sách về con trỏ NULL.

Hàm khởi tạo danh sách liên kết đơn:
void Init(node *pHead)
{
pHead = NULL;
return;
}
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2. b. Tạo mới 1 phần tử (nút) trong danh sách SLL
Giả sử tạo mới 1 phần tử có thành phần dữ liệu =x
Thuật toán
B1: p = new node //cấp phát bộ nhớ cho con trỏ p
B2: IF(p == NULL) // cấp phát không thành công
Thực hiện BKT
B3: p->data=x;
B4: p->link=NULL
BKT: Kết thúc
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn

(tt)
(tt)
(Hàm tạo node)
node* get_node(int n){
Node *p;
p=new node; //p=(struct node *)malloc(sizeof(struct node));
if (p==NULL)
{ cout<<“Error";
exit(1);
}
cout<<"\n Input n = ";
cin>>n;
p->data=n;
p->link=NULL;
return p;
}
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2.c. Thêm 1 phần tử vào danh sách SLL (Thêm đầu DS)
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2.c. Thêm 1 phần tử vào danh sách SLL (Thêm đầu DS)
Thuật toán
Gỉa sử ta muốn thêm phần tử p vào đầu DS:
Nếu DS rỗng thì:
pHead=p;

pTail=pHead; // pTail=new_element
Ngược lại:
p->link=pHead;
pHead=p;
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
Cài đặt
voidinsert_head(list &l, node *p){
if (l.pHead==NULL){
l.pHead=p;
l.pTail=p;
}
else{
p->link=l.pHead;
l.pHead=p;
}
}
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
Như vậy một danh sách bằng cách chèn đầu ta có thể viết hàm
như sau:
void create_list_head(list &l, int n)
{
node *p;
for (int i=1;i<10;i++) // nen dung vong lap do while de viet
{

p=get_node(n);
insert_head(l,p);
}
}
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2.c. Thêm 1 phần tử vào danh sách SLL
(tt) (Thêm giữa DS)
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2.c. Thêm 1 phần tử vào danh sách SLL
(tt) (Thêm giữa DS)
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2.c. Thêm 1 phần tử vào danh sách SLL
(tt) (Thêm giữa DS)

Thêm phần tử mới vào ngay sau phần tử q
Thuật toán
Nếu q!=NULL;
B1: p->link=q->link;
B2: q->link=p
Ngược lại: thêm vào đầu DS
4.2. Danh sách liên kết đơn

4.2. Danh sách liên kết đơn
(tt)
(tt)
void insert_after(List &l, node *q, int n){
node *p=get_node(n);
if (p==NULL) exit(1);
if (q!=NULL){
p->link=q->link;
q->link=p;
if (q==l.pTail)
l.pTail=p;
}
else
insert_head(l, p);
}
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2.c. Thêm 1 phần tử vào danh sách SLL (Thêm cuối DS)
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2.c. Thêm 1 phần tử vào danh sách SLL (Thêm cuối DS)
Thuật toán:
Nếu DS rỗng thì:
B1: pHead=p;
B2: pTail=pHead;
Ngược lại:

pTail->link=p;
pTail=p;
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
voidinsert_tail(List &l, node *p){
if (l.pHead==NULL){
l.pHead=p;
l.pTail=p;
}
else{
l.pTail->link=p;
l.pTail=p;
}
}
4.2. Danh sách liên kết đơn
4.2. Danh sách liên kết đơn
(tt)
(tt)
4.2.2.d. Duyệt qua các nút trong danh sách liên kết đơn

Là thao tác thường dùng trong các loại danh sách.

Tùy theo từng trường hợp cụ thể để xử lý trong khi duyệt
DS.
Thuật toán:
B1: p = pHead //cho con trỏ p trỏ đến phần tử đầu danh sách
B2: Trong khi danh sách chưa hết thì thực hiện
B21: Xử lý phần tử p

B22: p = p->link //cho p trỏ đến phần tử kế tiếp

×