1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Cấu trúc dữ liệu: Chương 3 - ThS. Võ Quang Hoàng Khang

68 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Chương 3 - Danh Sách Liên Kết
Tác giả Võ Quang Hoàng Khang
Trường học Trường Đại Học
Chuyên ngành Cấu trúc dữ liệu
Thể loại Bài giảng
Định dạng
Số trang 68
Dung lượng 1,89 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Chương 3 cung cấp kiến thức về danh sách liên kết. Chương này giúp người học nắm vững khái niệm về kiểu dữ liệu tĩnh và động, nắm vững cách tổ chức dữ liệu động bằng danh sách liên kết và minh họa được các thao tác xử lý trên danh sách liên kết đơn, cài đặt minh họa được các thao tác của danh sách đơn bằng ngôn ngữ C/C++. Mời các bạn cùng tham khảo.

Trang 1

CHƯƠNG 3

Võ Quang Hoàng Khang

Email: vqhkhang@gmail.com

Trang 2

Mục tiêu

 Nắm vững khái niệm về kiểu dữ liệu tĩnh

và động

 Nắm vững cách tổ chức dữ liệu động bằngdanh sách liên kết và minh họa được cácthao tác xử lý trên danh sách liên kết đơn

 Cài đặt minh họa được các thao tác của

Trang 5

Bài tập

một phần tử có giá trị x vào vị trí vt trongmảng số nguyên a, kích thước n, theo mẫu hàmnhư sau:

void ChenX(int a[], int &n, int x, int vt);

Trang 8

Bài tập

phần tử trong mảng không trùng nhau), theomẫu hàm như sau:

void XoaX (int a[], int &n, int x);

Trang 9

Vấn đề kiểu dữ liệu tĩnh

Độ phức tạp của chèn/ xóa trên mảng 1 chiều là O(n)

i

Trang 10

Vấn đề kiểu dữ liệu tĩnh

 Giải quyết vấn đề phức tạp khi chèn/ xóa?

 Giải quyết vấn đề giới hạn kích thước vùng

nhớ tối đa?

 Giải quyết vấn đề vùng nhớ không liên tục?

 Giải quyết vấn đề giải phóng vùng nhớ khi

không cần dùng đến?

Trang 11

Biến tĩnh và biến động trong C++

 Biến tĩnh

<kiểu dữ liệu> tên biến;

 Vd: int a; float y; char s[20];

 Tồn tại trong phạm vi khai báo

 Được cấp phát vùng nhớ trong vùng dữ liệu

 Kích thước cố định

Trang 12

Biến tĩnh và biến động trong C++

 Biến động

<kiểu dữ liệu> *tên biến;

 Vd: int *a; float *y;

 Chứa địa chỉ của một đối tượng dữ liệu

 Được cấp phát hoặc giải phóng bộ nhớ tùy

thuộc vào người lập trình

 Kích thước có thể thay đổi

Trang 13

Biến tĩnh và biến động trong C++

Trang 14

Danh sách liên kết (DSLK)

1

7 2 6

3 10 8 5 9

Các phần tử kết dính với nhau bằng

“sợi dây liên kết”

Trang 16

Đặc điểm DSLK

Một dãy tuần tự các nút (Node)

Giữa hai nút có con trỏ liên kết

Các nút không cần phải lưu trữ liên tiếp nhautrong bộ nhớ

Có thể mở rộng tuỳ ý (chỉ giới hạn bởi dunglượng bộ nhớ)

Trang 17

Đặc điểm DSLK

Thao tác Chèn/Xóa không cần phải dịchchuyển phần tử mà chỉ cần thay đổi mối liênkết

Quản lý phần tử đầu tiên bằng con trỏ pHead

Có thể truy xuất đến các phần tử khác thôngqua con trỏ liên kết

Trang 18

Cấu tạo của DSLK

pHead pTail

List

Trang 19

Cấu tạo của DSLK

Quản lý toàn bộ danh sách liên kết thông qua

pHead không phải là 1 nút, nó chỉ là “con trỏ

chỉ đến nút” mà thôi

Ta cũng có thể quản lý danh sách bằng cách

sử dụng thêm con trỏ cuối (pTail)

pTail không phải là 1 nút, nó chỉ là “con trỏ

chỉ đến nút” mà thôi

Trang 20

Cấu tạo của nút

Tạo lập bằng cách cấp phát bộ nhớ động

Mỗi nút có 2 thông tin:

Dữ liệu (data)

Con trỏ liên kết đến phần tử kế tiếp trong

danh sách (Next pointer link)

Nếu không trỏ đến phần tử nào thì con trỏ

Next = NULL

Trang 21

Thao tác chèn thêm node vào DSLK

“Kết nối” lại sợi dây liên kết theo trình tự

pHead pTail

List

Trang 22

Thao tác xóa node khỏi DSLK

Cần xóa

pHead pTail

List

Trang 23

Các loại DSLK

DSLK đơn: Các phần tử kết nối với nhau theohướng “chiều đi tới”

Trang 24

Các loại hình DSLK

DSLK đôi: Các phần tử kết nối với nhau theohướng “chiều đi tới và và đi lui”

Trang 25

Các loại hình DSLK

Danh sách liên kết vòng: Các phần tử kết nốivới nhau theo hướng “chiều đi tới” và phần tửcuối cùng có “đường đi vòng trở lại tới” phần

tử đầu danh sách

Trang 26

Phải dịch chuyển các

phần tử khi Thêm/Xóa

Chỉ cần thay đổi con trỏliên kết khi Thêm/Xóa

Trang 27

DSLK đơn

Cấu trúc 1 node

Data pNext

Data : Dữ liệu của node

pNext : Con trỏ đến node kế tiếp

pHead : Con trỏ đến node đầu

pHead pTail

List

Trang 28

Khai báo cấu trúc node

struct tNODE

{

<kiểu dữ liệu> Data;

struct tNODE *pNext;

};

Data

pNext

Trang 29

Khai báo cấu trúc node lưu số nguyên

Trang 30

Khai báo cấu trúc node lưu thông tin SV

typedef struct tSinhVien SINHVIEN;

ID, hoten, dtb pNext

Trang 31

Khai báo cấu trúc DSLK đơn

Trang 32

Khai báo cấu trúc DSLK đơn

Trang 33

Các thao tác trên DSLK đơn

 Thêm 1 nút vào danh sách: đầu, cuối, sau ptử q

 Duyệt danh sách

 Xóa 1 nút: đầu, cuối, nút có giá trị x

 Tìm 1 phần tử

 Sắp xếp danh sách

Trang 34

Tạo lập danh sách rỗng Nhập dữ liệu vào danh sách Các thao tác xử lý trên danh sách Hủy danh sách

}

4

Trang 35

Tạo lập danh sách rỗng

void CreateEmptyList(LIST &L)

{

Sau khi tạo lập

Trang 36

Kiểm tra danh sách rỗng

Trang 37

Thêm một nút vào danh sách

Trang 38

Thêm một nút vào danh sách

TH danh sách đã có phần tử

pHead pTail

pNew

Có 2 trường hợp để thêm pNew

1.Thêm pNew vào đầu (AddHead)

2.Thêm pNew vào cuối (AddTail)

Trang 39

TH Thêm một nút vào đầu danh sách

pHead pTail

pNew

1 2

Trang 40

TH Thêm một nút vào đầu danh sách

pHead pTail

Vẽ lại

Trang 41

TH Thêm một nút vào đầu danh sách

Trang 42

TH Thêm một nút vào đầu danh sách

pNew->pNext = list.pHeadlist.pHead = pNew

1

2

Trang 43

TH Thêm một nút vào đầu danh sách

Hãy viết hàm thêm phần tử pNew vàođầu danh sách (bằng ngôn ngữ C/C++), theo mẫu sau:

void AddHead(LIST &L, NODE *pNew)

?

Trang 44

TH Thêm một nút vào cuối danh sách

Trang 45

TH Thêm một nút vào cuối danh sách

Trang 46

TH Thêm một nút vào cuối danh sách

Hãy viết hàm thêm phần tử pNew vàocuối danh sách (bằng ngôn ngữ C/C++), theo mẫu sau:

void AddTail (LIST &list, NODE *pNew)

?

Trang 47

Nhập dữ liệu vào danh sách

Nhập dữ liệu cho node

Tạo con trỏ node

Trang 48

Nhập dữ liệu vào danh sách

Để tạo node mới từ dữ liệu x có sẵn

Đưa dữ liệu có giá trị x vào phần Data

Data

pNew

pNew->pNext = NULL

Trang 49

Nhập dữ liệu vào danh sách

VD hàm tạo và trả về con trỏ node có chứa giátrị nguyên x bằng ngôn ngữ C++

NODE *CreateNode (int x)

{

NODE *p;

p = new NODE;

if(p == NULL) {

cout<<“Loi cap phat duoc vung nho!";

exit(0);

} p->Data = x;

p->pNext=NULL;

Trang 50

Nhập dữ liệu vào danh sách

VD hàm nhập dữ liệu cho danh sách số nguyên

và đưa vào đầu danh sách

void Input(LIST &list)

Trang 51

Xuất dslk

pHead pTail

List

p

Trang 52

Chèn node vào DSLK đơn

Chèn vào sau node p

pNew p

Trang 53

Chèn node vào sau node p

pNew p

Trang 54

Các thao tác trên DSLK (tt)

 …

 Xóa phần tử trong danh sách (đầu, cuối, giữa)

 Sắp xếp danh sách

Trang 55

Chèn node vào trước node p – Cách 1

pNew p

pPrev

Trang 56

Chèn node vào trước node p – Cách 1

Hãy viết hàm tìm và trả về con trỏ node đứng trước con trỏ node p (bằng ngônngữ C/C++), theo mẫu sau:

NODE *PrevNode (LIST list, NODE *p)

?

Trang 57

Chèn node vào trước node p – Cách 2

pNew q

Bước 1 Chèn pNew vào sau q

Bước 2 Hoán vị giá trị pNew và q

Trang 58

Xóa một nút trong danh sách

Xóa nút đầu của danh sách  Ảnh hưởng

Trang 59

Xóa một nút trong danh sách

Xóa nút đầu của danh sách

Trang 60

Xóa một nút trong danh sách

Hãy viết hàm xóa nút đầu của danh sách(bằng ngôn ngữ C/C++), theo mẫu sau:

void DeleteHead (LIST &list)

(lưu ý trường hợp danh sách chỉ còn 1 node

trước khi xóa)

?

Trang 61

Xóa một nút trong danh sách

Xóa nút cuối của danh sách

pHead pTail

Cần xóa

pDel

NODE *pDel = list.pTail

NODE *pPrev = “Tìm node trước pTail”

pPrev

pPrev->pNext = NULL

Trang 62

Xóa một nút trong danh sách

Hãy viết hàm xóa nút cuối của danh sách(bằng ngôn ngữ C/C++), theo mẫu sau:

void DeleteTail (LIST &list)

(lưu ý trường hợp danh sách chỉ còn 1 node

trước khi xóa)

?

Trang 63

Xóa một nút trong danh sách

Xóa nút giữa của danh sách

Trang 64

Xóa một nút trong danh sách

Hãy viết hàm xóa một node bất kỳ trongdanh sách (bằng ngôn ngữ C/C++),

theo mẫu sau:

void DeleteNode (LIST &L, NODE *pDel)

?

Trang 65

Xóa một nút trong danh sách

Hãy viết hàm hủy toàn bộ danh sách(bằng ngôn ngữ C/C++), theo mẫu sau:

void DestroyList (LIST &list)

?

Trang 66

Bài tập

Cài đặt các hàm sau trên dslk đơn số nguyên:

1 Đếm số lượng node trong dslk

int DemSL(LIST list);

void InChan(LIST list);

5 Tính giá trị trung bình các node lẻ

Trang 67

6 Chèn node có giá trị x vào phía sau node cógiá trị lớn nhất

void ChenXSauMax(LIST &list, int x);

7 Xóa node có giá trị x

bool XoaX(LIST &list, int x);

8 Sắp tăng dslk

void SapTang(LIST &list);

Trang 68

Sắp xếp

void Doichotructiep ( LIST &L )

{

Node *p,*q;

for (p=L.DAU ; p!= L.CUOI ; p=p->tiep )

for (q=p->tiep; q!= NULL ; q=q->tiep)

if ( p->dulieu > q->dulieu)

Hoanvi ( p->dulieu , q->dulieu );

}

Ngày đăng: 11/05/2021, 19:40

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm