CHƯƠNG 1--- ------------------------------------------------------------------------------------------------------------ Cấu trúc dữ liệu – Trang 11 Chương 2: DANH SÁCH 2. Khái niệm: - Danh sách: là một dãy các phần tử a1, a2, a3,. an trong đó nếu biết được phần tử đứng trước thì sẽ biết được phần tử đứng sau. - n: là số phần tử của danh sách.
- Danh sách rỗng: là danh sách không có phần tử nào cả, tức n=0 - Danh sách là khái niệm thường gặp trong cuộc sống, như danh sách các sinh viên trong một lớp, danh sách các môn học trong một học kỳ. - Có 2 cách cơ bản biểu diễn danh sách: + Danh sách đặc: các phần tử được lưu trữ kế tiếp nhau trong bộ nhớ, phần tử thứ i được lưu trữ ngay trước phần tử thứ i+1 dưới hình thức một mảng. + Danh sách liên kết: các phần tử được lưu trữ tại những vùng nhớ khác nhau trong bộ nhớ, nhưng chúng được kết nối với nhau nhờ các vùng liên kết. - Các phép toán thường dùng trên danh sách: + Khởi tạo danh sách (tức là làm cho danh sách có, nhưng là danh sách rỗng).
+ Kiểm tra xem danh sách có rỗng không. + Liệt kê các phần tử có trong danh sách. + Tìm kiếm phần tử trong danh sách. + Thêm phần tử vào danh sách.
+ Xóa phần tử ra khỏi danh sách. + Sửa các thông tin của phần tử trong danh sách. + Thay thế một phần tử trong danh sách bằng một phần tử khác. + Sắp xếp thứ tự các phần tử trong danh sách.
+ Ghép một danh sách vào một danh sách khác. + Trộn các danh sách đã có thứ tự để được một danh sách mới cũng có thứ tự. + Tách một danh sách ra thành nhiều danh sách. - Trong thực tế một bài toán cụ thể chỉ dùng một số phép toán nào đó, nên ta phải biết cách biểu diễn danh sách cho phù hợp với bài toán.
Danh sách đặc: 2. Định nghĩa: Danh sách đặc là danh sách mà các phần tử được lưu trữ kế tiếp nhau trong bộ nhớ dưới hình thức một mảng. Biểu diễn danh sách đặc: Xét danh sách có tối đa 100 sinh viên gồm các thông tin: họ tên, chiều cao, cân nặng tiêu chuẩn, như : 1 LÊ LI 1.5 45 Trong đó cân nặng tiêu chuẩn được tính theo công thức: Cân nặng tiêu chuẩn (kg) = Chiều cao x 100 – 105 Khai báo: const int Nmax=100; typedef char infor1[15]; typedef float infor2; typedef int infor3; struct element { infor1 ht; infor2 cc; infor3 cntc; }; ------------------------------------------------------------------------------------------------------------ Cấu trúc dữ liệu – Trang 12 typedef element DS[Nmax]; DS A; int n; Hằng Nmax kiểu int chứa số phần tử tối đa có thể có của danh sách. Biến n kiểu int chứa số phần tử thực tế hiện nay của danh sách, ví dụ n=5.
Kiểu bản ghi element gồm các trường ht, cc, cntc lần lượt chứa họ tên, chiều cao, cân nặng tiêu chuẩn của một sinh viên. infor1, infor2, infor3 lần lượt là các kiểu dữ liệu của các trường ht, cc, cntc. DS là kiểu mảng gồm Nmax phần tử kiểu element. Biến A kiểu DS là biến mảng gồm Nmax phần tử kiểu element.
Các phép toán trên danh sách đặc: - Khởi tạo danh sách: Khi mới khởi tạo danh sách là rỗng, ta cho n nhận giá trị 0. void Create(DS A, int &n) { n=0; } - Liệt kê các phần tử trong danh sách: Ta liệt kê các phần tử từ phần tử đầu tiên trở đi. void Display(DS A, int n) { int i; for (i=1; i<=n; i++) printf("\n %15s %7.cntc); } - Tìm kiếm một phần tử trong danh sách: Tìm phần tử có họ tên x cho trước. Ta tìm bắt đầu từ phần tử đầu tiên trở đi, cho đến khi tìm được phần tử cần tìm hoặc đã kiểm tra xong phần tử cuối cùng mà không có thì dừng.
Hàm Search(A, n, x) tìm và trả về giá trị kiểu int, là số thứ tự của phần tử đầu tiên tìm được hoặc trả về giá trị -1 nếu tìm không có.ht,x)!=0) ) i++; if (i<=n) return i; else return -1; } - Thêm một phần tử có họ tên x, chiều cao y, cân nặng tiêu chuẩn z vào vị trí thứ t trong danh sách. Điều kiện: n<Nmax và 1 ≤ t ≤ n+1 Khi đó các phần tử từ thứ t đến thứ n được dời xuống 1 vị trí trong đó phần tử ở dưới thì dời trước, phần tử ở trên dời sau. Sau đó chèn phần tử mới vào vị trí thứ t, cuối cùng tăng giá trị n lên 1 đơn vị.cntc=z; n++; } } - Xóa phần tử thứ t trong danh sách, Điều kiện: 1 ≤ t ≤ n Khi đó các phần tử từ thứ t+1 đến thứ n được dời lên 1 vị trí, trong đó phần tử ở trên thì dời trước, phần tử ở dưới dời sau, cuối cùng giảm giá trị của n xuống 1 đơn vị. void DeleteElement(DS A, int &n, int t) { int i; if ( (t>=1) && (t<=n) ) { for (i=t+1; i<=n; i++) A[i-1]=A[i]; ------------------------------------------------------------------------------------------------------------ Cấu trúc dữ liệu – Trang 13 n--; } } 2.
Ưu nhược điểm của danh sách đặc: * Ưu điểm: - Dễ viết chương trình. - Tiết kiệm bộ nhớ cho mỗi phần tử. - Chỉ tiện lợi cho danh sách dùng ít bộ nhớ. * Khuyết điểm: - Không tiện lợi cho danh sách dùng nhiều bộ nhớ.
- Cần vùng nhớ liên tục. - Khai báo trước số lượng cụ thể số phần tử của danh sách. Danh sách liên kết (đơn): 2. Định nghĩa danh sách liên kết: Danh sách liên kết là danh sách mà các phần tử được kết nối với nhau nhờ các vùng liên kết.
Biểu diễn danh sách liên kết: Xét danh sách sinh viên gồm các thông tin: họ tên, chiều cao, cân nặng tiêu chuẩn.5 45 typedef char infor1[15]; typedef float infor2; typedef int infor3; struct element { infor1 ht; infor2 cc; infor3 cntc; element *next; }; typedef element *List; List F; // hoặc element *F; Hỏi F: 2002 ở đâu? int *F; Hỏi F: 1.7 ở đâu ? float *F; Hỏi F: LE LI 1.7 65 ở đâu ? element *F; Kiểu bản ghi element gồm các trường ht, cc, cntc dùng để chứa các thông tin của một phần tử trong danh sách, ngoài ra còn có thêm trường liên kết next chứa địa chỉ của phần tử tiếp theo trong danh sách. Kiểu con trỏ List dùng để chỉ đến một phần tử kiểu element. Biến con trỏ F luôn luôn chỉ đến phần tử đầu tiên trong danh sách liên kết. Bệnh nhân 271 mắc bệnh ngày 2/5 là chuyên gia người Anh.1, Bệnh viện Chợ Rẫy (TP.HCM) xác nhận 2 bệnh nhân số 1 và số 2 tại Việt Nam, là 2 cha con người Trung Quốc, người con làm việc tại Long An.
Xem tiếp trang 9.BÀI: TÌNH HÌNH COVID 19 VIỆT NAM: Dịch bệnh Covid-19 bắt đầu bùng phát từ tháng 12.2019 tại thành phố Vũ Hán, Trung Quốc. Đã lan ra 212 quốc gia với 2.703 ca nhiễm, và 184.325 người tử vong. Xem tiếp trang 20.1, có thêm 3 bệnh nhân là số 3, số 4, số 5 thuộc tỉnh Vĩnh Phúc. Các bệnh nhân này ở trong nhóm được một công ty Nhật cử sang Trung Quốc tập huấn.
Xem tiếp trang 3.Tại Việt Nam, ca nhiễm Covid-19 đầu tiên được phát hiện vào ngày 23.1, và tới nay đã có 268 trường hợp nhiễm bệnh. Xem tiếp trang 5.BÀI: TÌNH HÌNH COVID 19 VIỆT NAM: ------------------------------------------------------------------------------------------------------------ Cấu trúc dữ liệu – Trang 14 Dịch bệnh Covid-19 bắt đầu bùng phát từ tháng 12.2019 tại thành phố Vũ Hán, Trung Quốc. Đã lan ra 212 quốc gia với 2.703 ca nhiễm, và 184.325 người tử vong. Xem tiếp trang 20.Tại Việt Nam, ca nhiễm Covid-19 đầu tiên được phát hiện vào ngày 23.1, và tới nay đã có 271 trường hợp nhiễm bệnh.
Xem tiếp trang 5.1, Bệnh viện Chợ Rẫy (TP.HCM) xác nhận 2 bệnh nhân số 1 và số 2 tại Việt Nam, là 2 cha con người Trung Quốc, người con làm việc tại Long An. Xem tiếp trang 9.1, có thêm 3 bệnh nhân là số 3, số 4, số 5 thuộc tỉnh Vĩnh Phúc. Các bệnh nhân này ở trong nhóm được một công ty Nhật cử sang Trung Quốc tập huấn. Xem tiếp trang 3.
Bệnh nhân 271 mắc bệnh ngày 2/5 là chuyên gia người Anh. Các phép toán trên danh sách liên kết: - Khởi tạo danh sách: Khi mới khởi tạo danh sách là rỗng, ta cho F nhận giá trị NULL.next=NULL; thì p đang ở phần tử cuối cùng. p=NULL; thì p đang ở dưới phần tử cuối cùng.7 65 8NLB 2 LÊ BI 1.4 35 6NLB 4 LÊ NI 1.5 45 Thì dữ liệu của các phần tử được lưu trữ trong bộ nhớ RAM là: 5TĐT LÊ VI 1.4 35 9TDT F= 7TĐT LÊ LI 1.7 65 8NLB 9TĐT LÊ HI 1.5 45 NULL 6NLB LÊ NI 1.6 55 9TĐT 8NLB LÊ BI 1.next Before=after; after=(*after).next; - Liệt kê các phần tử trong danh sách: Ta liệt kê các phần tử kể từ phần tử đầu tiên được chỉ bởi biến con trỏ F và dựa vào trường liên kết next để lần lượt liệt kê các phần tử tiếp theo. Biến con trỏ p lần lượt chỉ đến từng phần tử trong danh sách bắt đầu từ phần tử đầu tiên chỉ bởi F trở đi.next; } } - Tìm kiếm một phần tử trong danh sách: Tìm phần tử có họ tên x trong danh sách.
Ta tìm bắt đầu từ phần tử đầu tiên được chỉ bởi F trở đi cho đến khi tìm được phần tử cần tìm hoặc đã kiểm tra xong phần tử cuối cùng mà không có thì dừng. Hàm Search(F, x) kiểu List, tìm và trả về địa chỉ của phần tử đầu tiên tìm được hoặc trả về giá trị NULL nếu tìm không có.ht,x) !=0 ) ------------------------------------------------------------------------------------------------------------ Cấu trúc dữ liệu – Trang 15 p= (*p).next; return p; } - Thêm một phần tử vào đầu danh sách: Thêm một phần tử có họ tên x, chiều cao y, cân nặng tiêu chuẩn z vào đầu danh sách. Biến con trỏ p chỉ đến phần tử mới cần thêm vào.next “chỉ đến phần tử giống” F “chỉ” F = p; // 2 } F=NULL; Nhập LI 1 LI Nhập BI 1 BI 2 LI Nhập VI 1 VI 2 BI 3 L1 - Thêm một phần tử vào danh sách đã có thứ tự: Thêm một phần tử có họ tên x, chiều cao y, cân nặng tiêu chuẩn z vào danh sách trước đó đã có thứ tự họ tên tăng dần. Biến con trỏ p chỉ đến phần tử mới cần thêm vào.
Các biến con trỏ before và after lần lượt chỉ đến phần tử đứng ngay trước và ngay sau phần tử mới. Để tìm after thì ta tìm bắt đầu từ phần tử đầu tiên chỉ bởi F trở đi cho đến khi gặp được phần tử đầu tiên có họ tên lớn hơn x thì dừng, rồi chèn phần tử mới vào giữa.cntc=z; after=F; while ( (after!=NULL) && ( strcmp((*after).ht , x)<0 ) ) { before=after; after=(*after).next=after; // 1 if (F==after) F=p; // 2’ else (*before).