Ôn tập struct và bộ nhớ động Linked Lists

Slides:



Advertisements
Các bản thuyết trình tương tự
HƯỚNG DẪN ĐĂNG KÝ HỌC PHẦN
Advertisements

Yêu sách chữ U của Trung Quốc
“QUẢN TRỊ DỰ ÁN VÀ DOANH NGHIỆP CÓ VỐN ĐẦU TƯ NƯỚC NGOÀI”
Các nguyên tắc làm việc với ASP
ỦY BAN NHÂN DÂN QUẬN GÒ VẤP TRƯỜNG BỒI DƯỠNG GIÁO DỤC
Thứ Hai Lễ Truyền Tin cho Đức Mẹ
CHỦ ĐỀ 1 MÁY TÍNH VÀ CHƯƠNG TRÌNH MÁY TÍNH
TỔ CHỨC, QUẢN LÝ CÁC HOẠT ĐỘNG CHUYÊN MÔN QUA MẠNG
ThS. Phạm Đức Thành Lập trình trên Windows ThS. Phạm Đức Thành
ASP Giáo viên: TS. Trương Diệu Linh Bộ môn Truyền thông & Mạng
Thẻ tham khảo nhanh (QRC)
Hướng dẫn lập trình trên
- Nhạc lí: Các kí hiệu ghi trường độ của âm thanh.
Kiểm thử và đảm bảo chất lượng phần mềm
Chúa Nhật 3 Mùa Chay A PÂ vắn: p 44…; PÂ dài 244
CHỦ ĐỀ 4 DỮ LIỆU VÀ BIẾN TRONG CHƯƠNG TRÌNH
Thứ Tư Thánh I-si-đo-rô
Chương 3 – Các kỹ thuật gỡ lỗi và kiểm thử chương trình
Chương 7 INTERFACE.
Giới thiệu môn học.
Hướng dẫn sử dụng Tôn Nữ Phương Mai Tháng 3/2013.
Hướng dẫn sử dụng hệ thống họp trực tuyến của Bộ GD&ĐT
Class & Struct II Lập trình nâng cao.
Con trỏ Lập trình nâng cao
Bài 3: Ngôn ngữ lập trình C#
Chương 02 CẤU TRÚC VÀ CÁC THÀNH PHẦN CHƯƠNG TRÌNH C/C++
Chương 06 KIỂU DỮ LIỆU NGƯỜI LẬP TRÌNH ĐỊNH NGHĨA
Automata hữu hạn & Biểu thức chính quy
17th Sunday in Ordinary Time - Year C Chúa Nhật 17 Thường Niên Năm C
MÔN : TIN HỌC Lớp: 3.
Chương 2 Đại cương về máy tính điện tử (MTĐT)
HƯỚNG DẪN Thủ tục tổ chức hội nghị - hội thảo quốc tế của các TCPCPNN
YÊU CẦU ĐẶT RA Tôi có một số đoạn phim / hình ảnh (vừa quay / chụp được hoặc sưu tầm được,…), tôi muốn lắp ghép nó để trở thành một đoạn phim trình.
Thành phố Santa Fé, tại New Mexico, Hoa Kỳ
Chương 03 TỔ CHỨC DỮ LIỆU TRONG CHƯƠNG TRÌNH
Korea-Vietnam Friendship IT College
NHẬP MÔN LẬP TRÌNH MẢNG MỘT CHIỀU.
Trainer: Bạch Ngọc Toàn Phát hành bởi: TEDU –
SẮP XẾP, TÌM KIẾM, LỌC DỮ LIỆU
Đề kiểm tra 15’ lớp K58B Cho đồ thị không gian trạng thái của bài toán như sau: Trạng thái đầu: A Trạng thái đích: P Và cho giải thuật tìm kiếm theo chiều.
Chính là con đứa con hoang đàng lỗi tội
Trainer: Bạch Ngọc Toàn Phát hành bởi: TEDU –
HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU SQL SERVER 2012
trong Word 5 cách mới để làm việc
CHÚA NHẬT 13 MÙA THƯỜNG NIÊN THIRTEENTH SUNDAY IN ORDINARY TIME
HƯỚNG DẪN TRÌNH BÀY Ý TƯỞNG KINH DOANH (Áp dụng cho các đề tài nộp tại vòng sơ loại) 10/8/2019.
HƯỚNG DẪN KÍCH HOẠT TÀI KHOẢN
KIỂM TRA TÌNH TRẠNG SAO CHÉP
Hệ thống quản lý và phát hành kho quỹ theo hướng tập trung - CMO
Hàm Lập trình nâng cao.
Bản ghi của bản thuyết trình:

Ôn tập struct và bộ nhớ động Linked Lists Sequences 7/25/2019 1:22 AM Ôn tập struct và bộ nhớ động Linked Lists Lập trình nâng cao

Singly Linked Lists Danh sách liên kết đơn Sequences 7/25/2019 1:22 AM Singly Linked Lists Danh sách liên kết đơn next dữ liệu nút – node Danh sách liên kết đơn là một cấu trúc dữ liệu chứa một chuỗi các nút (node) Mỗi nút chứa dữ liệu của nút đó Con trỏ tới nút tiếp theo A B C D  Linked Lists

Node chứa xâu kí tự struct Node { // Instance variables Sequences 7/25/2019 1:22 AM Node chứa xâu kí tự next element node struct Node { // Instance variables const char* element; Node* next; // Initialize a node Node(const char* e = NULL, Node* n = NULL) { element = e; next = n; } }; Trong ví dụ này, các nút chỉ dùng để móc nối dữ liệu chứ không để sửa dữ liệu, do đó dùng const cho element Linked Lists

Singly linked list struct SLinkedList { Sequences 7/25/2019 1:22 AM Singly linked list struct SLinkedList { Node* head; // con trỏ tới nút đầu danh sách long size; // số nút trong danh sách, nếu cần /* Constructor mặc định tạo danh sách rỗng */ SLinkedList() { head = NULL; size = 0; } // ... các hàm update và tìm kiếm ... bool isEmpty() { return head == NULL; } void insertAfter(Node * node, char* element) {...} ... }; Linked Lists

Thêm vào đầu danh sách Sử dụng: struct SLinkedList { Node* head; ... Sequences 7/25/2019 1:22 AM Thêm vào đầu danh sách  Rome Seattle Toronto head struct SLinkedList { Node* head; ... Sử dụng: SLinkedList list; list.addFirst(“Vienna”);  Rome Seattle Toronto head Vienna Vienna  Rome Seattle Toronto head Linked Lists

SLinkedList.addFirst – thuật toán Sequences 7/25/2019 1:22 AM SLinkedList.addFirst – thuật toán  Rome Seattle Toronto head list.addFirst(“Vienna”); Cấp phát nút mới Đưa dữ liệu vào nút mới Cho nút mới trỏ tới head cũ Sửa head để trỏ tới nút mới  Rome Seattle Toronto head Vienna Vienna  Rome Seattle Toronto head Linked Lists

SLinkedList.addFirst – cài đặt Sequences 7/25/2019 1:22 AM SLinkedList.addFirst – cài đặt  Rome Seattle Toronto head list.addFirst(“Vienna”); … void addFirst(const char* s) { Node* newNode = new Node; newNode->element = s; newNode->next = head; head = newNode; } Vienna Cấp phát nút mới Đưa dữ liệu vào nút mới Cho nút mới trỏ tới head cũ Sửa head để trỏ tới nút mới Linked Lists

SLinkedList.addFirst – cài đặt Sequences 7/25/2019 1:22 AM SLinkedList.addFirst – cài đặt  Rome Seattle Toronto head list.addFirst(“Vienna”); … void addFirst(const char* s) { Node* newNode = new Node(s, head); head = newNode; } Vienna Cấp phát nút mới Đưa dữ liệu vào nút mới Cho nút mới trỏ tới head cũ Sửa head để trỏ tới nút mới Linked Lists

Câu hỏi … void addFirst(const char* s) { Sequences 7/25/2019 1:22 AM Câu hỏi  Rome Seattle Toronto head … void addFirst(const char* s) { Node* newNode = new Node(s, head); head = newNode; } Vienna Tại sao không thể thay bằng lệnh sau? Node newNode(s, head); Linked Lists

SLinkedList.addFirst – cài đặt Sequences 7/25/2019 1:22 AM SLinkedList.addFirst – cài đặt  Rome Seattle Toronto head list.addFirst(“Vienna”); … void addFirst(const char* s) { head = new Node(s, head); } Vienna Cấp phát nút mới Đưa dữ liệu vào nút mới Cho nút mới trỏ tới head cũ Sửa head để trỏ tới nút mới Linked Lists

Duyệt danh sách liên kết P bắt đầu từ head Nếu p không null thì Xử lý dữ liệu tại p Đẩy p tới nút tiếp theo Quay lại 2 p p p p  Rome Seattle Toronto head done Rome Seattle Toronto list.print(); // in danh sách … void print() { for (Node *p = head; p != NULL; p = p->next) { cout << p->element << "."; } Linked Lists

Câu hỏi Tại sao lại cần p? Sao không dùng chính head để chạy con trỏ?  Rome Seattle Toronto head Rome Seattle Toronto list.print(); // in danh sách … void print() { for (Node *p = head; p != NULL; p = p->next) { cout << p->element << "."; } Linked Lists

Xóa nút đứng đầu danh sách Sequences 7/25/2019 1:22 AM Xóa nút đứng đầu danh sách Vienna  Rome Seattle Toronto head SLinkedList list;…. const char* s = list.removeFirst(); //Vienna Vienna  Rome Seattle Toronto head Sửa head để trỏ tới nút thứ hai trong danh sách Node* old = head; const char* old_element = old.element; head = head.next; Giải phóng nút đứng đầu delete old; return old_element;  Rome Seattle Toronto head Linked Lists

DS liên kết với con trỏ chặn cuối Sequences 7/25/2019 1:22 AM DS liên kết với con trỏ chặn cuối  Rome Seattle Toronto head tail struct SLinkedListWithTail { Node* head; // head node Node* tail; // tail node of the list /* Default constructor that creates an empty list */ SLinkedListWithTail() { head = null; tail = null; } // ... update and search methods would go here ... Linked Lists

Thêm vào cuối danh sách Cấp phát nút mới Lắp dữ liệu Sequences 7/25/2019 1:22 AM Thêm vào cuối danh sách  Rome Seattle Toronto head tail Cấp phát nút mới Lắp dữ liệu Cho nút mới trỏ tới null Cho nút cuối trỏ tới nút mới Sửa tail để trỏ tới nút mới – đuôi mới  Rome Seattle Toronto head Zurich tail Rome  Seattle Toronto Zurich head tail Linked Lists

addLast(const char* s) Sequences 7/25/2019 1:22 AM addLast(const char* s) Cấp phát nút mới Lắp dữ liệu Cho nút mới trỏ tới null Cho nút cuối trỏ tới nút mới Sửa tail để trỏ tới nút mới – đuôi mới  Rome Seattle Toronto head Zurich tail struct SLinkedListWithTail { Node* head; // head node Node* tail; // tail node of the list void addLast(const char *s) { Node* newNode = new Node(s, NULL); //1,2,3 tail->next = newNode; //4 tail = newNode; //5 } ... Linked Lists

addLast(const char* s) Sequences 7/25/2019 1:22 AM addLast(const char* s) head tail Cấp phát nút mới Lắp dữ liệu Cho nút mới trỏ tới null Cho nút cuối trỏ tới nút mới Sửa tail để trỏ tới nút mới – đuôi mới   ??? Zurich  Zurich head tail struct SLinkedListWithTail { Node* head; // head node Node* tail; // tail node of the list void addLast(const char *s) { Node* newNode = new Node(s, NULL); //1,2,3 tail->next = newNode; //4 tail = newNode; //5 } ... Linked Lists

addLast(const char* s) Sequences 7/25/2019 1:22 AM addLast(const char* s) head tail Cấp phát nút mới Lắp dữ liệu Cho nút mới trỏ tới null Nếu list rỗng thì trỏ head tới nút mới nếu không, cho nút cuối trỏ tới nút mới Sửa tail để trỏ tới nút mới – đuôi mới   ??? Zurich  Zurich head tail struct SLinkedListWithTail { Node* head; // head node Node* tail; // tail node of the list void addLast(const char *s) { Node* newNode = new Node(s, NULL); //1,2,3 if (head == NULL) head = newNode; //4 else tail->next = newNode; tail = newNode; //5 } ... Linked Lists

Sequences 7/25/2019 1:22 AM Xóa ở cuối danh sách Đối với danh sách liên kết đơn, không có cách nào ngoài việc lấy con trỏ chạy từ đầu đến nút ngay trước tail Không hiệu quả! Rome  Seattle Toronto Zurich head tail Linked Lists

Danh sách liên kết đôi Doubly Linked List Sequences 7/25/2019 1:22 AM Danh sách liên kết đôi Doubly Linked List prev next elem một nút Thuận tiện hơn! Mỗi nút chứa: Dữ liệu Con trỏ tới nút liền trước Con trỏ tới nút liền sau Danh sách liên kết chứa: header và trailer trỏ tới nút đặc biệt chặn đầu và cuối danh sách trailer header các nút trong danh sách dữ liệu Linked Lists

DNode struct prev next elem node Sequences 7/25/2019 1:22 AM DNode struct prev next elem node /* Node of a doubly linked list of strings */ struct DNode { const char* element; DNode *next, *prev; // Pointers to next and previous node /* Initialize a node. */ DNode(const char* e = NULL, DNode* p = NULL, DNode *n = NULL) { element = e; prev = p; next = n; } }; Linked Lists

Cài đặt doubly linked list DList Sequences 7/25/2019 1:22 AM Cài đặt doubly linked list DList struct DList { DNode header, trailer; // sentinels /* Default constructor that creates an empty list */ DList() { header.next = &trailer; trailer.prev = &header; } void addFirst(const char *s) { insertAfter(&header, s); void addLast(const char *s) { insertAfter(trailer.prev, s); ... trailer header ?? ?? Linked Lists

insertAfter – chèn vào giữa Sequences 7/25/2019 1:22 AM insertAfter – chèn vào giữa hàm insertAfter(p, X), chèn X vào sau p và trả về địa chỉ nút mới q p A B C p q A B C X p q A B X C Linked Lists

insertAfter – cài đặt hàm insertAfter(p, X): Tạo nút mới q Sequences 7/25/2019 1:22 AM insertAfter – cài đặt hàm insertAfter(p, X): Tạo nút mới q Lắp dữ liệu, nối prev và next của q Nối prev của nút sau p với q Nối next của p với q A B C p X q DNode insertAfter(DNode* p, const char* s) { DNode* newNode = new DNode(s, p, p->next); p->next->prev = newNode; p->next = newNode; return newNode; } Linked Lists

Câu hỏi Trường hợp danh sách rỗng, thêm vào đầu, thêm vào cuối danh sách thì sao? DNode insertAfter(DNode* p, const char* s) { DNode* newNode = new DNode(s, p, p->next); p->next->prev = newNode; p->next = newNode; return newNode; } trailer header Do luôn có hai nút header chặn đầu và trailer chặn cuối, nên danh sách thực tế không bao giờ rỗng, không bao giờ cho phép chèn vào trước header hoặc sau trailer  Không cần xử lý trường hợp đặc biệt cho thiết kế này Linked Lists

Xóa A B C D p remove(p) xóa nút mà p trỏ tới Linked Lists Sequences 7/25/2019 1:22 AM Xóa remove(p) xóa nút mà p trỏ tới A B C D p Linked Lists

Destructor Destructor của List: Destructor của Node: Phải giải phóng các nút hiện nằm trong danh sách Destructor của Node: Không được giải phóng dữ liệu (elements) Ai cấp phát cái gì thì có trách nhiệm giải phóng cái đó List cấp phát các Node, do đó List phải tự giải phóng các Node Lập trình viên nào delete một list, sau đó lại truy nhập vào một node trong list đó thì tự chịu hậu quả. Node không cấp phát element, nó không thể biết dữ liệu đó có phải dữ liệu động hay không và hiện có còn ai đang dùng đến  không được giải phóng element Linked Lists