Cấu trúc dữ liệu
1EE3490: Kỹ thut lập trình – HK1 2011/2012
Đào Trung Kiên ĐHch khoa Ni
Mở đầu: mảng động
Mảng trong C số phần tử cố định từ khi khai báo
Mảng động mảng số phần tử thay đổi: bản chất
một con trỏ một biến cho biết số phần tử
int n = 5;
int* arr = (int*)malloc(n*sizeof(int));
Bài toán chèn phần tử vào mảng động:
pos = 2; val = 25;
arr1 = (int*)malloc((n+1)*sizeof(int));
memcpy(arr1, arr, pos*sizeof(int));
memcpy(arr1+pos+1, arr+pos, (n-pos)*sizeof(int));
arr1[pos] = val;
free(arr);
arr = arr1;
Tương tự khi x phần tử
2EE3490: Kỹ thut lp trình HK1 2011/2012
Đào Trung Kiên ĐHch khoa Ni
10
20
30
40
50
25
10
20
25
30
40
50
Khái niệm
dụ trên cho thấy mảng động khá kém hiệu quả trong
việc thêm/bớt phần tử cần di chuyển các vùng nhớ,
nhất khi mảng nhiều phần tử cần các cấu tc dữ
liệu linh hoạt hơn
Các cấu trúc dữ liệu phổ biến, ứng dụng tuỳ bài toán:
Ngăn xếp (stack)
Hàng đợi (queue)
Danh sách liên kết (linked list)
Mảng động (vector, dynamic array)
Ánh xạ (map), từ điển (dictionary), bảng băm (hash table)
Tập hợp (set)
Cây (tree)
Đồ thị (graph)
3EE3490: Kỹ thut lập trình – HK1 2011/2012
Đào Trung Kiên ĐHch khoa Ni
Danh sách liên kết (DSLK)
tập hợp các phần tử được móc nối với nhau bằng con tr:
Một con trỏ tr đến phần tử đầu tiên (hoặc NULL nếu chưa phần tử nào)
Mỗi phần tử bao gồm 2 thành phần: dữ liệu, con trỏ next tới phần tử tiếp theo
Con trỏ next của phần tử cuối cùng trỏ đến NULL
4EE3490: Kỹ thut lập trình – HK1 2011/2012
Đào Trung Kiên ĐHch khoa Hà Nội
data
next
data
next
data
next
list
Khai báo DSLK
dụ với dữ liệu kiểu int:
struct SELEM;
typedef struct SELEM ELEM, *PELEM, *LLIST;
struct SELEM {
int data;
PELEM next;
};
Thư viện DSLK:
llist.h
llist.c
5EE3490: Kỹ thut lập trình – HK1 2011/2012
Đào Trung Kiên ĐHch khoa Hà Nội