TRƯỜNG ĐẠI HỌC PHENIKAA KHOA KHOA HỌC CƠ BẢN BÀI TẬP LỚN KẾT THÚC HỌC PHẦN Môn Cấu trúc dữ liệu và thuật toán Lớp Cấu trúc dữ liệu và thuật toán 1 1(13 14FS) 2 LT Sinh viên Đỗ Minh Quân Lớp K14 CNTT3[.]
TRƯỜNG ĐẠI HỌC PHENIKAA KHOA KHOA HỌC CƠ BẢN BÀI TẬP LỚN KẾT THÚC HỌC PHẦN Môn Cấu trúc liệu thuật toán Lớp Cấu trúc liệu thuật toán_1.1(13.14FS).2_LT Sinh viên : Đỗ Minh Quân Lớp : K14-CNTT3 Mã SV : 20010879 1.1 Các thao tác danh sách liên kết Danh sách liên kết cấu trúc liệu có kiểu tuần tự, phần tử danh sách liên kết có chứa thơng tin, qua ta truy cập tới phần tử Danh sách liên kết xem bố trí phần tử tập Bắt đầu từ nút, ta coi phần tử danh sách Từ nút này, theo liên kết mà trỏ tới, ta có nút thứ 2, coi phần tử thứ danh sách, v.v tiếp tục hết danh sách Nút cuối có liên kết liên kết null, tức khơng trỏ tới nút nào, trỏ nút để tạo thành vịng • Các thao tác danh sách liên kết - Tạo, cấp phát, giải phóng nhớ cho nút listnode p; // Khai báo biến p p = (listnode)malloc(sizeof(struct node));//cấp phát nhớ cho p free(p); //giải phóng nhớ cấp phát cho nút p; - Chèn nút vào đầu danh sách B1 Tạo cấp phát nhớ cho nút ,đc trỏ tới q B2 Sau gán giá trị thích hợp cho phần tử nút mới, cho trỏ tiếp nút trỏ đến phần tử nút B3 Để p trỏ đến đầu nút danh sách ,ta cần cho p trỏ đến nút tạo void Insert_Begin(listnode *p, int x) { listnode q; q = (listnode)malloc(sizeof(struct node)); q-> item = x; q-> next = *p; *p = q; } - Chèn nút vào cuối danh sách B1 Dịch chuyển trỏ tới nút cuối danh sách Để làm việc này, ta phải khai báo biến trỏ r Ban đầu, biến này, với p, trỏ đến đầu danh sách Lần lượt dịch chuyển r theo nút đến cuối danh sách B2 Cho trỏ tiếp nút cuối (được trỏ tới r) trỏ đến nút tạo q, trỏ tiếp q trỏ tới null void Insert_End(listnode *p, int x){ listnode q, r; q = (listnode)malloc(sizeof(struct node)); q-> item = x; q->next = NULL; if (*p==NULL) *p = q; else{ r = *p; while (r->next != NULL) r = r>next; r->next = q; } } - Chèn nút vào trước nút r danh sách B1 Cho trỏ tiếp nút trỏ đến nút nút r B2 Cho trỏ tiếp nút r trỏ đến q void Insert_Middle(listnode *p, int position, int x){ int count=1, found=0; listnode q, r; r = *p; while ((r != NULL)&&(found==0)) { if (count == position){ q = (listnode)malloc(sizeof(struct node)); q-> item = x; q-> next = r-> next; r-> next = q; found = 1; } count ++; r = r-> next; } if (found==0) printf(“Khong tim thay vi tri can chen !”); } - Xóa nút đầu danh sách B1 Dùng trỏ tạm q trỏ đến đầu danh sách B2 Dịch chuyển trỏ p qua phần tử đến phần tử B3 Ngắt liên kết biến tạm q với nút tiếp theo, giải phóng nhớ Cho q void Remove_Begin(listnode *p){ listnode q; if (*p == NULL) return; q = *p; *p = (*p)-> next; q-> next = NULL; free(q); } - Xóa nút cuối danh sách B1 Dịch chuyển trỏ tới nút gần cuối danh sách Để làm việc này, ta phải dùng biến tạm q r Lần lượt dịch chuyển q r từ đầu danh sách tới cuối danh sách, q ln dịch chuyển sau r nút Khi r tới nút cuối q nút gần cuối B2 Cho trỏ tiếp nút gần cuối (đang trỏ q) trỏ tới null Giải phóng nhớ cho nút cuối (đang trỏ r) void Remove_End(listnode *p){ listnode q, r; if (*p == NULL) return; if ((*p)-> next == NULL){ Remove_Begin(*p); return; } r = *p; while (r-> next != NULL){ q = r; r = r-> next; } q-> next = NULL; free(r); } - Xóa nút trước nút r danh sách B1 Sử dụng biến tạm q trỏ đến nút đứng trước nút r B2 Cho trỏ nút r trỏ tới nút đứng sau nút q B3 Ngắt liên kết nút q giải phóng nhớ cho q void Remove_Middle(listnode *p, int position){ int count=1, found=0; listnode q, r; r = *p; while ((r != NULL)&&(found==0)) { if (count == position){ q = r-> next; r-> next = q-> next; q-> next = NULL; free (q); found = 1; } count ++; r = r-> next;