Tải bản đầy đủ (.pdf) (121 trang)

Bài giảng kỹ thuật lập trình – chương 7 cấu trúc dữ liệu

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 (2.92 MB, 121 trang )

ng

.c

om

Trịnh Thành Trung (ThS)


cu

u

du
on
g

th
a

n

co

Bài 4
CẤU TRÚC DỮ LIỆU

CuuDuongThanCong.com

/>


n
th
a

cu

u

du
on
g

Phải xác định được
o Các dữ liệu liên quan
đến bài toán
o Các thao tác cần thiết
để giải quyết bài toán

co

ng

.c

om

Các bài toán thực
tế thường rất
phức tạp


CuuDuongThanCong.com

/>

Mô tả
 Các dữ liệu cấu thành
 Mối liên kết về mặt cấu
trúc giữa các dữ liệu
đó

cu

u

du
on
g

n

th
a

là cách tổ chức và thao tác
có hệ thống trên dữ liệu

co

ng


.c

om

Cấu trúc
dữ liệu

CuuDuongThanCong.com

Cung cấp các thao tác
trên dữ liệu đó

Đặc trưng cho 1 kiểu dữ
liệu

/>

.c

om

Dữ liệu, kiểu dữ liệu &
cấu trúc dữ liệu
Machine Level Data Storage

th
a

3.1415


28

du
on
g

Primitive Data Types

n

co

ng

0100110001101001010001

'A'

array

cu

u

Basic Data Structures

High-Level Data Structures

stack


queue

hash table
CuuDuongThanCong.com

/>
list
tree


.c

ng

co

n

▫C/C++: int, long, char, bool...
▫Thao tác trên các số nguyên:
+ - * / ...
CuuDuongThanCong.com

Kiểu dữ liệu có cấu trúc
(structured data type)
▪Được xây dựng từ các
kiểu dữ liệu (cơ bản, có
cấu trúc) khác
▪Có thể được các ngơn
ngữ lập trình định nghĩa

sẵn hoặc do lập trình viên
tự định nghĩa

th
a

cu

u

du
on
g

Kiểu dữ liệu cơ bản
(primitive data type)
▪Đại diện cho các dữ liệu
giống nhau, không thể
phân chia nhỏ hơn được
nữa
▪Thường được các ngơn
ngữ lập trình định nghĩa
sẵn
▪Ví dụ

om

Các
kiểu dữ liệu


/>

om
.c

cu

u

du
on
g

1. Mảng
2. Danh sách
3. Ngăn xếp
4. Hàng đợi
5. Cây

th
a

n

co

ng

Nội dung


CuuDuongThanCong.com

/>

om
.c
ng
n
th
a
du
on
g
u
cu

Array

co

1.
Mảng

CuuDuongThanCong.com

/>

.c

om


Mảng
Array

co

ng

▪ Dãy hữu hạn các phần tử liên tiếp có cùng kiểu và tên
▪ Một hay nhiều chiều
Cú pháp

du
on
g

th
a

n

▫ C không giới hạn số chiều của mảng

DataType ArrayName[size];

cu

u

mảng nhiều chiều


DataType ArrayName[size 1][size 2]...[size n];

CuuDuongThanCong.com

/>

.c

om

Khởi tạo giá trị
mảng

co

ng

▪ C1. Khi khai báo

cu

u

du
on
g

th
a


n

float y[5] = { 3.2, 1.2, 4.5, 6.0, 3.6 }
int m[6][2] = { { 1, 1 }, { 1, 2 }, { 2, 1 }, { 2, 2
}, { 3, 1 }, { 3, 2 } };
char s1[6] = { 'H', 'a', 'n', 'o', 'i', '\0' }; //hoặc
char s1[6] = "Hanoi";
char s1[] = "Dai hoc Bach Khoa Hanoi"; //L = 24
int m[][] = { { 1, 2, 3 }, { 4, 5, 6 } };

▪ C2. Khai báo rồi gán giá trị cho từng phần tử của mảng.
int m[4];
m[0] = 1; m[1] = 2; m[2] = 3; m[3] = 4;
CuuDuongThanCong.com

/>

om
.c
ng
co
n
th
a

u
cu

List


du
on
g

2.
Danh sách

CuuDuongThanCong.com

/>

.c

om

Danh sách
List

ng

▪ Danh sách

n

du
on
g

▫ Danh sách tuyến tính:


th
a

▪ Phân loại

co

▫ Tập hợp các phần tử cùng kiểu
▫ Số lượng các phần tử của danh sách khơng cố định

cu

u

▸ Có phần tử đầu tiên, phần tử cuối cùng
▸ Thứ tự trước / sau của các phần tử được xác định rõ ràng, ví dụ
sắp theo thứ tự tăng dần, giảm dần hay thứ tự trong bảng chữ cái
▸ Các thao tác trên danh sách phải không làm ảnh hưởng đến trật
tự này

▫ Danh sách phi tuyến tính: các phần tử trong danh sách không
được sắp thứ tự

CuuDuongThanCong.com

/>

.c


om

Danh sách
List

ng

▪ Lưu trữ

du
on
g

th
a

n

co

▫ Sử dụng vùng các ô nhớ liên tiếp trong bộ nhớ  danh sách kế
tiếp
▫ Sử dụng vùng các ô nhớ không liên tiếp trong bộ nhớ  danh
sách móc nối

cu

u

▸ Danh sách nối đơn

▸ Danh sách nối kép

CuuDuongThanCong.com

/>

.c

om

Thao tác trên
danh sách

cu

u

du
on
g

th
a

n

co

ng


 Khởi tạo danh sách (create)
 Kiểm tra danh sách rỗng (isEmpty)
 Kiểm tra danh sách đầy (isFull)
 Tính kích thước (sizeOf)
 Xóa rỗng danh sách (clear)
 Thêm một phần tử vào danh sách tại một ví trí cụ thể (insert)
 Loại bỏ một phần tử tại một vị trí cụ thể khỏi danh sách
(remove)
 Lấy một phần tử tại một vị trí cụ thể (retrieve)
 Thay thế giá trị của một phần tử tại một vị trí cụ thể (replace)
 Duyệt danh sách và thực hiện một thao tác tại các vị trí trong
danh sách (traverse)

CuuDuongThanCong.com

/>

.c

om

Danh sách
kế tiếp

ng

▪ Sử dụng một vector lưu trữ gồm một số các ô nhớ liên tiếp

cu


u

du
on
g

th
a

n

co

▫ Các phần tử liền kề nhau được lưu trữ trong những ô nhớ liền
kề nhau
▫ Mỗi phần tử của danh sách cũng được gán một chỉ số chỉ thứ tự
được lưu trữ trong vector
▫ Tham chiếu đến các phần tử sử dụng địa chỉ được tính giống
như lưu trữ mảng.

0

1

2
CuuDuongThanCong.com

i

last


n-1
/>

.c

om

Danh sách
kế tiếp

ng

▪ Ưu điểm

n
th
a

▪ Nhược điểm

co

▫ Tốc độ truy cập vào các phần tử của danh sách nhanh

du
on
g

▫ Cần phải biết trước kích thước tối đa của danh sách


?

cu

u

▫ Thực hiện các phép toán bổ sung các phần tử mới và loại bỏ các
phần tử cũ khá tốn kém

CuuDuongThanCong.com

?

/>

.c

om

Thêm vào
danh sách kế tiếp

ng

▪ Điều kiện tiên quyết:

n

th

a

du
on
g

▪ Điều kiện hậu nghiệm:

co

▫ Danh sách phải được khởi tạo rồi
▫ Danh sách chưa đầy
▫ Phần tử thêm vào chưa có trong danh sách

z

insert(3, ‘z’)

0

cu

u

▫ Phần tử cần thêm vào có trong danh sách

1

2


3

4

5

6

7

a

b

c

d

e

f

g

h

8

9


count=9
count=8
CuuDuongThanCong.com

/>

.c

om

Thêm vào
danh sách kế tiếp

n

co

ng

Algorithm Insert
Input: index là vị trí cần thêm vào, element là giá trị cần thêm vào
Output: tình trạng danh sách

cu

u

du
on
g


th
a

if list đầy
return overflow
if index nằm ngồi khoảng [0..count]
return range_error
//Dời tất cả các phần tử từ index về sau 1 vị trí
for i = count-1 down to index
entry[i+1] = entry[i]
entry[index] = element // Gán element vào vị trí index
count++
// Tăng số phần tử lên 1
return success;

End Insert
CuuDuongThanCong.com

/>

co

ng

.c

om

Xóa khỏi

danh sách kế tiếp

1

2

a

b

c

3

4

5

6

7

d

e

f

g


h

8

9

cu

u

0

du
on
g

th
a

n

remove(3, ‘d’)

CuuDuongThanCong.com

count=7

/>

.c


om

Xóa khỏi
danh sách kế tiếp

co

ng

Algorithm Remove
Input: index là vị trí cần xóa bỏ, element là giá trị lấy ra được
Output: danh sách đã xóa bỏ phần tử tại index

cu

u

du
on
g

th
a

n

if list rỗng
return underflow
if index nằm ngoài khoảng [0..count-1]

return range_error
element = entry[index] //Lấy element tại vị trí index ra
count-//Giảm số phần tử đi 1
//Dời tất cả các phần tử từ index về trước 1 vị trí
for i = index to count-1
entry[i] = entry[i+1]
return success;

End Remove
CuuDuongThanCong.com

/>

.c

om

Duyệt
danh sách kế tiếp

n

co

ng

Algorithm Traverse
Input: hàm visit dùng để tác động vào từng phần tử
Output: danh sách được cập nhật bằng hàm visit


u
cu

End Traverse

du
on
g

th
a

//Quét qua tất cả các phần tử trong list
for index = 0 to count-1
Thi hành hàm visit để duyệt phần tử entry[index]

CuuDuongThanCong.com

/>

th
a

n

co

ng

.c


N
E
X
T

cu

u

du
on
g

▪ Một phần tử trong danh
sách bằng một nút
▪ Thành phần một nút:
▫ INFO: chứa thông tin
(nội dung, giá trị) ứng
với phần tử
▫ NEXT: chứa địa chỉ
của nút tiếp theo

INFO

L

om

Danh sách

nối đơn

▪ Cần nắm được địa chỉ
của nút đầu tiên trong
danh sách

?

CuuDuongThanCong.com

/>

Node

.c
ng
co

th
a

du
on
g

struct node {
hoso data;
node *next; } Node;

cu


▪ Tạo nút mới:

struct hoso

u

typedef
{ ……
};
typedef
struct
struct

n

▪ Nút = dữ liệu + móc nối
▪ Định nghĩa:

om

Danh sách
nối đơn

*p = malloc(sizeof(Node))

▪ Giải phóng nút:
free(p);

CuuDuongThanCong.com


/>

.c

om

Khởi tạo và
truy cập

co

ng

▪ Khai báo một con trỏ
Node *Head;

u

Thêm một nút mới tại vị trí cụ thể
Tìm nút có giá trị cho trước
Xóa một nút có giá trị cho trước
Ghép 2 danh sách nối đơn
Hủy danh sách nối đơn

cu

1.
2.
3.

4.
5.

du
on
g

th
a

n

▪ Head là con trỏ trỏ đến nút đầu của danh sách. Khi danh
sách rỗng thì Head = NULL.
▪ Một số thao tác với danh sách nối đơn

CuuDuongThanCong.com

/>

.c

om

Truyền danh sách
móc nối vào hàm

co

ng


▪ Khi truyền danh sách móc nối vào hàm, chỉ cần truyền Head.
▪ Sử dụng Head để truy cập toàn bộ danh sách

cu

u

du
on
g

th
a

n

▫ Note: nếu hàm thay đổi vị trí nút đầu của danh sách (thêm hoặc
xóa nút đầu) thì Head sẽ khơng cịn trỏ đến đầu danh sách
▫ Do đó nên truyền Head theo tham biến (hoặc trả lại một con trỏ
mới)

CuuDuongThanCong.com

/>

.c

om


Tìm
nút

ng

int FindNode(int x)

n

co

▪ Tìm nút có giá trị x trong danh sách.
▪ Nếu tìm được trả lại vị trí của nút.Nếu không, trả lại 0.

cu

u

du
on
g

th
a

int FindNode(Node *head, int x) {
Node *currNode = head;
int currIndex = 1;
while (currNode && currNode->data != x) {
currNode = currNode->next;

currIndex++;
}
if (currNode) return currIndex;
else return 0;
}
CuuDuongThanCong.com

/>

×