Dưới đây là Bài giảng Kỹ thuật lập trình - Bài 5: Cấu trúc dữ liệu do Trịnh Thành Trung biên soạn. Việc tham khảo bài giảng này sẽ cung cấp cho các bạn những kiến thức về cấu trúc dữ liệu, kiểu dữ liệu và một số kiến thức khác.
Bài CẤU TRÚC DỮ LIỆU Trịnh Thành Trung trungtt@soict.hust.edu.vn MỞ ĐẦU • Các tốn thực tế thường phức tạp • Hiểu tốn đặt = để giải tốn, cần làm gì, khơng cần làm Do đó, phải xác định được: Các liệu liên quan đến toán Các thao tác cần thiết để giải tốn - Ví dụ: Bài tốn quản lý nhân viên quan • Cần quản lý thông tin ? – Thông tin nhân viên: tên, ngày sinh, số bảo hiểm xã hội, phòng ban làm việc, … nhân viên ảo – … • Cần thực thao tác quản lý ? – Tạo hồ sơ cho nhân viên vào làm – Cập nhật số thơng tin hồ sơ – Tìm kiếm thơng tin nhân viên – … • Ai phép thực thao tác nào? Cấu trúc liệu • cách tổ chức thao tác có hệ thống liệu • Cấu trúc liệu: – Mơ tả • Các liệu cấu thành • Mối liên kết mặt cấu trúc liệu – Cung cấp thao tác liệu – Đặc trưng cho kiểu liệu Kiểu liệu • Kiểu liệu (primitive • Kiểu liệu có cấu trúc data type) (structured data type) – Đại diện cho liệu giống nhau, phân chia nhỏ – Thường ngơn ngữ lập trình định nghĩa sẵn – Ví dụ: • C/C++: int, long, char, boolean, v.v • Thao tác số nguyên: + - * / – Được xây dựng từ kiểu liệu (cơ bản, có cấu trúc) khác – Có thể ngơn ngữ lập trình định nghĩa sẵn lập trình viên tự định nghĩa Dữ liệu, kiểu liệu, cấu trúc liệu Machine Level Data Storage Primitive Data Types 0100110001101001010001 3.1415 28 array Basic Data Structures High-Level Data Structures 'A' stack queue hash table list tree CẤU TRÚC DỮ LIỆU Mảng Danh sách Ngăn xếp Hàng đợi Cây - DANH SÁCH - Danh sách • Danh sách : – Tập hợp phần tử kiểu – Số lượng phần tử danh sách khơng cố định • Phân loại: – Danh sách tuyến tính: • Có phần tử đầu tiên, phần tử cuối • Thứ tự trước / sau phần tử xác định rõ ràng, ví dụ theo thứ tự tăng dần, giảm dần hay thứ tự bảng chữ • Các thao tác danh sách phải không làm ảnh hưởng đến trật tự – Danh sách khơng tuyến tính: phần tử danh sách khơng thứ tự • Có nhiều hình thức lưu trữ danh sách – Sử dụng vùng ô nhớ liên tiếp nhớ danh sách – Sử dụng vùng ô nhớ không liên tiếp nhớ danh sách móc nối • Danh sách nối đơn • Danh sách nối kép Danh sách • Thao tác danh sách tuyến tính – – – – – – – – – – Khởi tạo danh sách (create) Kiểm tra danh sách rỗng (isEmpty) Kiểm tra danh sách đầy (isFull) Tính kích thước (sizeOf) Xóa rỗng danh sách (clear) Thêm phần tử vào danh sách ví trí cụ thể (insert) Loại bỏ phần tử vị trí cụ thể khỏi danh sách (remove) Lấy phần tử vị trí cụ thể (retrieve) Thay giá trị phần tử vị trí cụ thể (replace) Duyệt danh sách thực thao tác vị trí danh sách (traverse) Ứng dụng nhị phân • Cây biểu diễn biểu thức – Tính giá trị biểu thức – Tính đạo hàm • Cây định Cây biểu diễn biểu thức • loại nhị phân đặc biệt, đó: Mỗi nút chứa tốn hạng Mỗi nút chứa toán tử Cây trái phải nút toán tử thể biểu thức cần đánh giá trước thực toán tử nút gốc Cây biểu diễn biểu thức Cây biểu diễn biểu thức • Các mức thứ tự ưu tiên – Các mức (độ sâu) nút thứ tự ưu tiên tương đối chúng biểu thức (không cần dùng ngoặc để thể thứ tự ưu tiên) – Các phép toán mức cao tính sau các phép tốn có mức thấp – Phép tốn gốc ln thực cuối Cây biểu diễn biểu thức • Dễ dàng để tạo biểu thức tiền tố, trung tố, hậu tố • Trung tố: ( ( -5 ) * ( ( + ) / ) ) • Tiền tố: * -8 / + • Hậu tố: -4 + / * (thực chất phép duyệt theo tt giữa, trước sau) Cài đặt biểu thức • Mỗi nút có trỏ struct TreeNode { InfoNode info ;// Dữ liệu TreeNode *left ;// Trỏ tới nút trái TreeNode *right ; // Trỏ tới nút phải }; • InfoNode có dạng enum OpType { OPERATOR, OPERAND } ; struct InfoNode { OpType whichType; union // ANONYMOUS { char operator; int operand ; } }; union int Eval(TreeNode* ptr){ switch(ptr->info.whichType) { case OPERAND : returnptr->info.operand ; case OPERATOR : switch ( tree->info.operation case ‘+’: return ( Eval( ptr->left case ‘-’: return ( Eval( ptr->left case ‘*’: return ( Eval( ptr->left case ‘/’: return ( Eval( ptr->left } } } ){ ) + Eval( ptr->right ) ) ; ) -Eval( ptr->right ) ) ; ) * Eval( ptr->right ) ) ; ) / Eval( ptr->right ) ) ; Cây tổng quát Biểu diễn tổng quát • Biểu diễn giống nhị phân? – Mỗi nút chứa giá trị trỏ trỏ đến nút nó? – Bao nhiêu trỏ cho nút? -> Khơng hợp lý • Mỗi nút chứa giá trị trỏ trỏ đến “tập” nút – Xây dựng “tập” nào? • Sử dụng trỏ mở rộng hơn: – Mỗi nút có trỏ: trỏ trỏ đến nút nó, trỏ trỏ đến nút anh em kề với – Cách cho phép quản lý số lượng tùy ý nút Biểu diễn tổng qt Ví dụ Duyệt tổng qt • Thứ tự trước: Thăm gốc Duyệt thứ theo thứ tự trước Duyệt cịn lại theo thứ tự trước • Thứ tự Duyệt thứ theo thứ tự Thăm gốc Duyệt lại theo thứ tự • Thứ tự sau: Duyệt thứ theo thứ tự sau Duyệt lại theo thứ tự sau Thăm gốc Cây định • Dùng để biểu diễn lời giải toán cần định lựa chọn • Bài tốn đồng tiền vàng: – Có đồng tiền vàng a, b, c, d, e, f, g, h – Có đồng có trọng lượng khơng chuẩn – Sử dụng cân Roberval (2 đĩa) – Output: • Đồng tiền k chuẩn nặng hay nhẹ • Số phép cân Cây định void EightCoins(a, b, c, d, e, f, g, h) { if (a+b+c == d+e+f) { if (g > h) Compare(g, h, a); else Compare(h, g, a); } else if (a+b+c > d+e+f){ if (a+d == b+e) Compare(c, f, a); else if (a+d > b+e) Compare(a, e, b); else Compare(b, d, a); } else{ if (a+d == b+e) Compare(f,c,a); else if (a+d > b+e) Compare(d, b, a); else Compare(e, a, b); } } // so sánh x với đồng tiền chuẩn z void Compare(x,y,z){ if(x>y) printf(“x nặng”); else printf(“y nhẹ”); } ... Cấu trúc liệu • cách tổ chức thao tác có hệ thống liệu • Cấu trúc liệu: – Mơ tả • Các liệu cấu thành • Mối liên kết mặt cấu trúc liệu – Cung cấp thao tác liệu – Đặc trưng cho kiểu liệu Kiểu liệu. .. số nguyên: + - * / – Được xây dựng từ kiểu liệu (cơ bản, có cấu trúc) khác – Có thể ngơn ngữ lập trình định nghĩa sẵn lập trình viên tự định nghĩa Dữ liệu, kiểu liệu, cấu trúc liệu Machine Level... sách) New->next = Cur; New->prev= Cur->prev; Cur->prev= New; (New->prev )-> next = New; • Xóa nút Cur(khơng phải nút đầu cuối danh sách) (Cur->prev )-> next = Cur->next; (Cur->next )-> prev = Cur->prev;