Lecture 08 linked lists(cont ) tài liệu Kỹ thuật Lập trình

21 455 0
Lecture 08   linked lists(cont )  tài liệu Kỹ thuật Lập trình

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Lecture – Linked Lists 8.1 Khái niệm danh sách 8.2 Các phép toán danh sách 8.3 Cài đặt danh sách sử dụng mảng 8.4 Danh sách liên kết đơn 8.5 Danh sách liên kết dạng vòng 8.6 Danh sách liên kết kép 8.7 Ứng dụng danh sách liên kết 8.8 Bài tập thực hành 8/28/14 8.6 Double linked List  Khái niệm danh sách liên kết kép:  Với danh sách liên kết đơn, số vấn đề xuất hiện:  Với danh sách liên kết đơn, cho phép duyệt danh sách theo chiều  Để xóa node cần lưu node đứng trước  Nếu liên kết chuỗi bị hỏng, phần tử sau không dùng  Để giải vấn đề trên, thêm cho phần tử liên kết nữa, liên kết có chiều ngược lại Khi thêm node liên kết vậy, danh sách liên kết gọi có liên kết kép 8/28/14 8.6 Double linked List v NULL v … first  Khái niệm: Danh sách liên kết kép danh sách liên kết sử dụng trỏ cho phần tử, trỏ để trỏ đến phần tử danh sách, trỏ để trỏ đến phần tử liền trước danh sách v NULL last typedef int DataType; // kiểu liệu dùng danh sách typedef struct Node{ DataType data;// Dùng để chứa liệu kiểu DataType Node *previos; // Con trỏ trỏ đến nhớ liền trước nó; Node *next; tiếp // Con trỏ tới ô nhớ Node kế }; 8/28/14 8.6 Double linked List NULL v Node previous - Con trỏ first đến node liền trước v v … data - Dữ liệu node v NULL next - Con trỏ đến last node liền sau  Để quản lý danh sách liên kết kép, thông thường cần:  first trỏ đến phần tử danh sách liên kết kép;  last trỏ đến phần tử cuối danh sách liên kết kép;  Thơng thường, phần tử cuối có liên kết next trỏ tới NULL;  Bằng cách sử dụng hợp lý liên kết previos hay next, duyệt danh sách theo chiều, trước hay sau  Lưu ý: thêm hay bớt phần tử danh sách cần đảm bảo sau thao tác giữ tính liên kết vịng 8/28/14 8.6 Double linked List v NULL v … first v NULL last  Khai báo kiểu phần tử ds liên kết kép C: typedef int DataType; // kiểu liệu dùng danh sách typedef struct Node { DataType data; // Dùng để chứa liệu kiểu DataType; Node *previous; // Con trỏ tới ô nhớ Node liền trước Node *next; // Con trỏ tới ô nhớ Node }; 8/28/14 8.6 Double linked List v NULL v … first v NULL last  Các thao tác danh sách liên kết kép:  Khởi tạo danh sách;  insertAtFirst(*list, v): Thêm node vào đầu danh sách;  insertAtPos(*list, v, p): Chèn node vào danh sách;  insertAtLast(*list, v): Thêm node vào cuối danh sách;  deleteAtFirst(*list): Xóa node từ đầu danh sách;  deleteAtLast(*list): Xóa node cuối danh sách;  deleteAtPos(*list, pos) : Xóa node danh sách 8/28/14 8.6 Double linked List NULL first last  isEmptyList(*list): Kiểm tra danh sách rỗng;  makEmptyList(*list): Làm rỗng danh sách;  searchList(*list, v): Tìm giá trị danh sách  Khởi tạo danh sách:  Có thể dùng biến để quản lý đầu vào danh sách cách tạo trỏ first last, ban đầu, gán cho chúng rỗng; int main(){ Node* first = NULL; Node* last = NULL; 8/28/14 8.6 Double linked List NULL NULL v NULL temp v v first  Thêm phần tử vào đầu danh sách:  Trường hợp – ds rỗng: Tạo node temp chứa liệu cần đưa vào; Cho trỏ previous next temp trỏ đến NULL; Cho first, last trỏ đến temp … v NULL last NULL last  Trường hợp – ds không rỗng: Tạo node temp chứa liệu cần đưa vào; Cho trỏ previous temp trỏ đến NULL; Cho trỏ next temp trỏ đến first; Cho trỏ previous first trỏ đến temp; Cho first trỏ đến temp 8/28/14 8.6 Double linked List v NULL … first  Thêm phần tử vào cuối danh sách:  Trường hợp – ds rỗng: Tạo node temp chứa liệu cần đưa vào; Cho trỏ previous next temp trỏ đến NULL; v NULL v last NULL temp  Trường hợp – ds không rỗng: Tạo node temp chứa liệu cần đưa vào; Cho trỏ next last trỏ đến temp; Cho trỏ next temp trỏ đến NULL; Cho trỏ previous temp trỏ đến last; Cho last trỏ đến temp Cho first, last trỏ đến temp 8/28/14 8.6 Double linked List … v curr v … v  Thêm phần tử vào sau vị trí cho trước: Tìm kiếm phần tử curr liền trước vị trí cần thêm vào; Tạo node temp chứa liệu nhập vào; Cho trỏ previous phần tử liền sau curr trỏ đến temp; Cho trỏ next temp trỏ đến phần tử liền sau curr; Cho trỏ previous temp trỏ đến curr; Cho trỏ next curr trỏ đến temp 10 8/28/14 8.6 Double linked List v NULL temp v … v NULL first  Xóa phần tử từ đầu danh sách:  Trường hợp tổng quát:  Trường hợp – ds có phần tử: Tạo trỏ temp trỏ đến Tạo trỏ temp trỏ đến first; first; Gán first last NULL; Gán first first->next; Gọi lệnh giải phóng nhớ cho Gán first->previous NULL; temp Gọi lệnh giải phóng nhớ cho temp 11 8/28/14 8.6 Double linked List NULL v … v v last NULL temp  Xóa phần tử cuối danh sách Trường hợp tổng quát: Tạo trỏ temp trỏ đến last; Gán last last->previous; Gán last->next NULL; Gọi lệnh giải phóng nhớ cho temp 12 8/28/14 8.6 Double linked List … v curr v v … temp  Xóa phần tử vị trí sau (trước) vị trí cho trước: Tìm phần tử liền trước curr (hoặc liền sau) phần tử cần xóa; Tạo trỏ temp trỏ đến phần tử cần xóa; Gán ((curr->next)->next)->previous curr; Gán curr->next ((curr->next)->next); Gọi lệnh giải phóng nhớ cho temp 13 8/28/14 8.6 Double linked List first v v … v last  Trong thực tế, tổ chức thành danh sách liên kết kép vòng, liên kết next phần tử cuối last trỏ vào phần tử (do first quản lý), liên kết previous phần tử (first) trỏ tới phần tử cuối 14 8/28/14 8.6 Double linked List  Đánh giá cài đặt danh sách trỏ động: Do phần tử ds khơng nằm liên tiếp nhớ, dẫn đến:  Nhược điểm:  Sử dụng nhớ không tối ưu;  Việc truy xuất đến phần tử tính nhiều thời gian, thời gian tìm kiếm O(n), với n số phần tử danh sách phải duyệt qua phần tử khác;  Ưu điểm:  Tận dụng không gian rỗng nhớ mà ko chứa mảng lớn, liệu phần tử lớn cách tỏ hiệu quả, ngược lại, lãng phí nhớ dành cho trỏ;  Việc thêm bớt phần tử dễ dàng, việc thay đổi mối liên kết trỏ; 15 8/28/14 Lecture – Linked Lists 8.1 Khái niệm danh sách 8.2 Các phép toán danh sách 8.3 Cài đặt danh sách sử dụng mảng 8.4 Danh sách liên kết đơn 8.5 Danh sách liên kết dạng vòng 8.6 Danh sách liên kết kép 8.7 Ứng dụng danh sách liên kết 8.8 Bài tập thực hành 16 8/28/14 8.7 Ứng dụng Linked lists  Trong thực tế, danh sách liên kết sử dụng rộng rãi chương trình máy tính, ví dụ:  Sử dụng danh sách liên kết xây dựng Stack Queue;  Biểu diễn cây, đồ thị danh sách liên kết;  Biểu diễn ma trận thưa danh sách liên kết;  Bài toán đa thức sử dụng danh sách liên kết;  Bài toán số lớn sử dụng danh sách liên kết;  Xây dựng bảng băm;  … 17 8/28/14 Lecture – Linked Lists 8.1 Khái niệm danh sách 8.2 Các phép toán danh sách 8.3 Cài đặt danh sách sử dụng mảng 8.4 Danh sách liên kết đơn 8.5 Danh sách liên kết dạng vòng 8.6 Danh sách liên kết kép 8.7 Ứng dụng danh sách liên kết 8.8 Bài tập thực hành 18 8/28/14 8.8 Bài tập thực hành Viết chương trình thêm phần tử danh sách liên kết có thứ tự cho ta có danh sách có thứ tự Viết chương trình tìm kiếm xóa phần tử danh sách liên kết có thứ tự Viết chương trình loại bỏ phần tử trùng (giữ lại phần tử) danh sách liên kết có thứ tự khơng giảm Viết chương trình đảo ngược danh sách liên kết Viết chương trình xóa khỏi danh sách liên kết lưu trữ số nguyên phần tử số nguyên lẻ Viết chương trình tách danh sách liên kết chứa số nguyên thành hai danh sách: danh sách gồm số chẳn chứa số lẻ 19 8/28/14 8.8 Bài tập thực hành Ðể lưu trữ số nguyên lớn, ta dùng danh sách liên kết chứa chữ số Hãy tìm cách lưu trữ chữ số số nguyên lớn theo ý tưởng cho việc cộng hai số nguyên lớn dễ dàng thực Viết chương trình cộng hai số nguyên lớn Ða thức P(x)= anxn+ an-1xn-1+ + a1x + a0 lưu trữ máy tính dạng danh sách liên kết mà phần tử danh sách ghi có ba trường lưu giữ hệ số, số mũ, trưòng trỏ để trỏ đến phần tử Chú ý cách lưu trữ đảm bảo thứ tự giảm dần theo số mũ hạng tử đa thức:  Hãy viết khai báo thực lưu trữ  Dựa vào cài đặt trên, viết chương trình thực việc cộng hai đa thức  Viết chương trình tính giá trị lấy đạo hàm đa thức 20 8/28/14 8.8 Bài tập thực hành Ða thức P(x)= anxn+ an-1xn-1+ + a1x + a0 lưu trữ máy tính dạng mảng theo nguyên theo cách sau:  Cách 1: Phần tử mảng lưu trữ bậc n đa thức n + phần tử lưu hệ số từ an đến a0;  Cách 2: Phần tử mảng lưu trữ k số hệ số khác 2k phần tử lưu trữ k cặp {hệ số, mũ} tương ứng  Viết chương trình thực việc cộng hai đa thức  Viết chương trình tính giá trị lấy đạo hàm đa thức 21 8/28/14 ... đến phần tử cần xóa; Gán ((curr->next)->next)->previous curr; Gán curr->next ((curr->next)->next); Gọi lệnh giải phóng nhớ cho temp 13 8/28/14 8.6 Double linked List first v v … v last  Trong... danh sách 8/28/14 8.6 Double linked List NULL first last  isEmptyList(*list): Kiểm tra danh sách rỗng;  makEmptyList(*list): Làm rỗng danh sách;  searchList(*list, v): Tìm giá trị danh sách ... insertAtLast(*list, v): Thêm node vào cuối danh sách;  deleteAtFirst(*list): Xóa node từ đầu danh sách;  deleteAtLast(*list): Xóa node cuối danh sách;  deleteAtPos(*list, pos) : Xóa node danh

Ngày đăng: 28/08/2014, 21:58

Từ khóa liên quan

Mục lục

  • Lecture 8 – Linked Lists

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • 8.6. Double linked List

  • Lecture 8 – Linked Lists

  • 8.7. Ứng dụng của Linked lists

  • Lecture 8 – Linked Lists

  • 8.8. Bài tập thực hành

  • 8.8. Bài tập thực hành

Tài liệu cùng người dùng

Tài liệu liên quan