Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 64 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
64
Dung lượng
1,97 MB
Nội dung
CTDL động Danh sách liên kết Nguyễn Đỗ Thái Nguyên nguyenndt@hcmue.edu.vn Nội dung 9/11/2019 Đặt vấn đề - ctdl động, sao? Con trỏ kiểu liệu động Cấu trúc trỏ Danh sách liên kết Sắp xếp danh sách Các cấu trúc đặc biệt dslk đơn Chuyển biểu thức trung tố sang biểu thức hậu tố Định trị biểu thức hậu tố CTDL1-N.Đ.T.Nguyên Đặt vấn đề - ctdl động, sao? Nhu cầu thực tế kiểu liệu: typedef struct NGUOI { CTDL động giải char hoten[30]; vấn đề Nó giải nào? int soCMND; NGUOI cha,me; }NGUOI; Khi khai báo kiểu liệu NNLT thường yêu cầu kiểu liệu phải xác định kích thước rõ ràng Với nhu cầu tính kích thước rõ ràng cho kiểu liệu người 9/11/2019 CTDL1-N.Đ.T.Nguyên Đặt vấn đề - ctdl động, sao? Vấn đề hiệu sử dụng nhớ Nhu cầu thực tế Biến tĩnh NNLT Vùng nhớ kiểu liệu tĩnh sinh ta khai báo biến khỏi phạm vi khai báo chương trình kết thúc biến tồn cục Có nhiều biến tĩnh khơng cần sử dụng tồn chiếm nhớ chương trình hủy theo chế biến tỉnh gây lãng phí nhớ Biến tĩnh chương trình khơng thay đổi cấu trúc hay độ lớn thực thi Trong chu kỳ sống số đối tượng liệu thay đổi cấu trúc, độ lớn như: danh sách học viên tăng lên giảm xuống bất hợp lý 9/11/2019 CTDL động giải vấn đề Nó giải CTDL1-N.Đ.T.Nguyên nào? Đặt vấn đề - ctdl động, sao? Hạn chế kích thước nhớ cho biến tĩnh Tổng kích thước vùng nhớ dành cho tất biến tĩnh 64kb (1 segment nhớ) Nhu cầu thực tế: cần nhiều nhớ CTDL động giải vấn đề Nó giải nào? 9/11/2019 CTDL1-N.Đ.T.Nguyên Con trỏ kiểu liệu động Biến không động Kiểu trỏ Biến động 9/11/2019 CTDL1-N.Đ.T.Nguyên Con trỏ kiểu liệu động 9/11/2019 CTDL1-N.Đ.T.Nguyên Con trỏ kiểu liệu động Biến không động Được khai báo tường minh Tồn vào phạm vi khai báo khỏi phạm vi Đuợc cấp phát vùng nhớ vùng liệu (data segment) Stack (đối với biến tĩnh – biến cục bộ) Kích thước khơng thay đổi suốt q trình sống 9/11/2019 CTDL1-N.Đ.T.Nguyên Con trỏ kiểu liệu động Kiểu trỏ Một kiểu liệu T xác định Ví dụ: kiểu int (16) Kiểu trỏ (của kiểu liệu T) gồm: Ví dụ: trỏ số nguyên khai báo sau Tập giá trị mà lưu trữ Tập thao tác (phép tốn) xử lý thi hành tập giá trị Tập giá trị [-32768, 32767] Tập thao tác: +, -, *, /, % Tập giá trị tập địa kiểu liệu T tương ứng Tập thao tác: tạo trỏ đến đối tượng có kiểu T int *p; // có kích thước cố định hay byte tùy vào NNLT, loại trỏ //Con trỏ kiểu int lưu địa biến kiểu int 9/11/2019 CTDL1-N.Đ.T.Nguyên Con trỏ kiểu liệu động Biến động Biến động Không khai báo tường minh Có thể cấp phát giải phóng nhớ người sử dụng yêu cầu Các biến không theo quy tắc phạm vi (tĩnh) Vùng nhớ biến cấp phát Heap Kích thước thay đổi q trình sống Con trỏ làm nhiệm vụ quản lý biến cách lưu địa vùng nhớ chúng Ví dụ: int *p,*q; p=new int; //xin cấp phát vùng nhớ kiểu int q=new int[10]; //xin cấp phát 10 vùng kiểu int … //sử dụng biến động delete p; //trả lại vùng nhớ cho hệ thống delete [ ]q; //trả lại vùng nhớ cho hệ thống 9/11/2019 CTDL1-N.Đ.T.Nguyên 10 Danh sách liên kết đơn void Remove (LIST &l, int k) { NODE* p=l.pHead,*q=NULL; while((p!=NULL)&&(p->data!=k)) { q=p; p=p->next; } if(p==NULL) return; if(q!=NULL) { if(p==l.pTail) { l.pTail=q; l.pTail->next=NULL; } q->next=p->next; delete p; } else // p phần tử (pHead) RemoveHead(l); } 9/11/2019 Hủy phần CTDL1-N.Đ.T.Nguyên tử có khóa k cho trước 50 Danh sách liên kết đơn Cách 1: void RemoveList (LIST &l, int k) { while(l.pHead!=NULL) RemoveHead(l); } Cách 2: void RemoveList (LIST &l) { while(l.pHead!=NULL) { p=l.pHead; l.pHead=l.pHead->next; delete p; } l.pTail=NULL; } 9/11/2019 Hủy toànCTDL1-N.Đ.T.Nguyên danh sách liên kết 51 Sắp xếp danh sách liên kết void ListSelectionSort (LIST &l) { NODE* min; //trỏ đến pt có data NODE* i,*j; for(i = l.pHead;i->next!=NULL;i=i->next) { min=i; for(j=i->next;j!=NULL;j=j->next) if(j->datadata) min=j; HoanVi(min->data,i->data); } } 9/11/2019 Selection Sort – Hoán vị nội dung phần liệu (data) CTDL1-N.Đ.T.Nguyên 52 Sắp xếp danh sách liên kết void ListSelectionSort (LIST &l) { NODE *i,*j,*min, *minpre=NULL; LIST lresult;KhoiTao(lresult); while(l.pHead!=NULL) //danh dách chưa hết { min=l.pHead;minpre=NULL; for(j=min,i=min->next;i!=NULL;j=i,i=i->next) if(i->datadata) { min=i; minpre=j; } if(minpre==NULL) { l.pHead=l.pHead->next;if(min==l.pTail) l.pTail=NULL; } else { if(min==l.pTail) l.pTail=minpre;minpre->next=min->next; } min->next=NULL; AddTail(lresult,min); } l=lresult; Tìm pt có data nhỏ } Tách khỏi danh sách Thêm vào đầu ds 9/11/2019 CTDL1-N.Đ.T.Nguyên Selection Sort – Thay đổi mối liên kết 53 Các cấu trúc đặc biệt dslk đơn Stack Là vật chứa (container) đối tượng làm việc theo chế LIFO (last in first out) Các thao tác stack: Push(o): thêm đối tượng vào đâu stack Pop(): lấy đối tượng đầu stack khỏi stack trả đối tượng đó, stack rỗng trả NULL isEmpty(): Kiểm tra stack có rỗng hay khơng Top(): trả phần tử nằm đầu stack mà không lấy phần tử khỏi stack Stack sử dụng để: khử đệ quy, tổ chức lưu vết trình tìm kiếm theo chiều sâu quay lui, vét cạn, định trị biểu thức, … SV tự cài đặt stack mảng dslk đơn 9/11/2019 CTDL1-N.Đ.T.Nguyên 54 Các cấu trúc đặc biệt dslk đơn Hàng đợi Là vật chứa (container) đối tượng làm việc theo chế FIFO (first in first out) Các thao tác hàng đợi EnQueue(o): thêm đối tượng vào hàng đợi DeQueue(): Lấy đối tượng khỏi hàng đợi trả đối tượng IsEmpty(): Kiểm tra hàng đợi có rỗng khơng Front(): Trả đối tượng nằm đầu hàng đợi mà khơng hủy SV tự cài đặt hàng đợi mảng dslk đơn 9/11/2019 CTDL1-N.Đ.T.Nguyên 55 Các cấu trúc đặc biệt dslk đơn Hàng đợi 9/11/2019 CTDL1-N.Đ.T.Nguyên 56 Chuyển từ trung tố sang hậu tố Biểu thức trung tố: Có phép tốn Ví dụ: a+b Biểu thức hậu tố: Có phép tốn để đằng sau Ví dụ: a b + Biểu thức tiền tố: Có phép tốn đằng trước Ví dụ: + a b 9/11/2019 CTDL1-N.Đ.T.Nguyên 57 Chuyển từ trung tố sang hậu tố Duyệt từ trái sang phải Gặp (: đưa vào stack Gặp số: ghi Gặp phép toán: 9/11/2019 Lấy ghi tất phép toán đỉnh stack mà có độ ưu tiên >= phép tốn Đưa phép toán vào stack Gặp ): Độ ưu tiên Bậc 2: *,/ Bậc 1: +, Bậc 0: (,) Lấy ghi tất phép toán đỉnh gặp ( Lấy ( khỏi stack Sau duyệt hết dãy lấy ghi cịn stack CTDL1-N.Đ.T.Ngun 58 Chuyển từ trung tố sang hậu tố A+B*C-D/E a) b) c) d) e) f) g) h) i) j) k) Infix A+B*C-D/E +B*C-D/E B*C-D/E *C-D/E C-D/E -D/E D/E /E E 9/11/2019 Stack(bot->top) Postfix + + +* +* -/ -/ A A AB AB ABC A B C *+ A B C *+D A B C *+D A B C *+D E A B C *+D E / - CTDL1-N.Đ.T.Nguyên 59 Chuyển từ trung tố sang hậu tố A * B - ( C + D ) + E Infix a) b) c) d) e) f) g) h) i) j) k) l) m) n) o) 9/11/2019 A * B * B B - Stack(bot->top) ( ( ( ( ( ( C C C C C C C + + + + + + + D D D D D D D D D ) ) ) ) ) ) ) ) ) ) + + + + + + + + + + + + E E E E E E E E E E E E E empty empty * * empty - ( - ( - ( + - ( + empty + + empty CTDL1-N.Đ.T.Nguyên Postfix empty A A A B A B * A B * A B * A B * A B * A B * A B * A B * A B * A B * A B * C C C C C C C C D D D D D D + + + + + - E - E + 60 Định trị biểu thức hậu tố Duyệt từ trái sang phải Gặp số: đưa vào stack Gặp phép toán: Lưu ý thứ tự a, b, phép toán Lấy số gán vào a Lấy số gán vào b Thực c=b a; Đưa c vào stack 9/11/2019 Sau duyệt hết lấy kết từ stack CTDL1-N.Đ.T.Nguyên 61 Định trị biểu thức hậu tố 1*(2+3) + * Postfix a) + * b) + * c) + * d) + * e) * f) 9/11/2019 Stack( bot -> top ) 1 2 // from + // from * CTDL1-N.Đ.T.Nguyên 62 HẾT 9/11/2019 CTDL1-N.Đ.T.Nguyên 63 Kiểm tra điều kiện 45’ Hãy xếp phương pháp MergeSort (trộn tự nhiên) dãy số sau 2 Sắp xếp dãy sau phương pháp HeapSort 9 ShakerSort có cải tiến so với BubleSort 9/11/2019 CTDL1-N.Đ.T.Nguyên 64