Bài giảng Kỹ thuật lập trình: Bài 7 do TS. Đào Trung Kiên biên soạn trình bày các nội dung sau: Khái niệm cấu trúc dữ liệu, danh sách liên kết, khai báo danh sách liên kết, thao tác với danh sách liên kết, khởi tạo danh sách liên kết,. | Bài 7: Cấu trúc dữ liệu (Data structures) 1 EE3490: Kỹ thuật lập trình – HK1 2017/2018 TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội Mở đầu: mảng động Mảng trong C có số phần tử cố định từ khi khai báo Mảng động là mảng có số phần tử thay đổi: bản chất là một con trỏ và 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; 10 20 30 40 50 free(arr); 25 arr = arr1; Tương tự khi xoá phần tử 2 10 EE3490: Kỹ thuật lập trình – HK1 2017/2018 20 25 30 40 50 TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội Khái niệm Ví 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ử vì cần di chuyển các vùng nhớ, nhất là khi mảng có nhiều phần tử cần các cấu trúc 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: 3 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) EE3490: Kỹ thuật lập trình – HK1 2017/2018 TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội Danh sách liên kết (DSLK) Là 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 có 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 list data next data next data next 4 EE3490: Kỹ thuật lập trình – HK1 2017/2018 TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội Khai báo DSLK Ví dụ với dữ liệu là kiểu int: struct SELEM; typedef struct SELEM ELEM, *PELEM, *LLIST; struct SELEM { int data; PELEM next; }; Thư viện DSLK: 5 EE3490: Kỹ thuật lập trình – HK1 2017/2018 TS. Đào Trung Kiên – ĐH Bách khoa Hà .