Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 6 - Châu Thị Bảo Hà

99 8 0
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 6 - Châu Thị Bảo Hà

Đ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

Chương 6 của bài giảng Cấu trúc dữ liệu và giải thuật giới thiệu về danh sách liên kết (Linked lists) trong cấu trúc dữ liệu. Trong chương này chúng ta sẽ cùng tìm hiểu về danh sách liên kết đơn (Single Linked List), danh sách liên kết đôi (Double Linked List) và danh sách liên kết vòng (Circular Linked List).

CHAPTER 6: DANH SÁCH LIÊN KẾT (LINKED LISTS) NỘI DUNG Giới thiệu  Danh sách liên kết đơn (Single Linked List)  Danh sách liên kết đôi (Double Linked List)  Danh sách liên kết vòng (Circular Linked List)  Chương 6: Danh sách liên kết CẤU TRÚC DỮ LIỆU TĨNH  Cấu trúc liệu tĩnh:   Khái niệm: Các đối tượng liệu khai báo tường minh khơng thể thay đổi kích thước suốt trình sống thuộc kiểu liệu tĩnh Ví dụ: int a; char b[10]; Chương 6: Danh sách liên kết VÍ DỤ CẤU TRÚC DỮ LIỆU TĨNH  Cấu trúc liệu tĩnh: Ví dụ: Mảng chiều     Kích thước cố định (fixed size) Các phần tử nằm kề nhớ Truy cập ngẫu nhiên (random access) Chèn phần tử vào mảng, xóa phần tử khỏi mảng tốn nhiều chi phí chèn Chương 6: Danh sách liên kết n-2 n-1 CẤU TRÚC DỮ LIỆU ĐỘNG  Cần xây dựng cấu trúc liệu đáp ứng yêu cầu:    Linh động Có thể thay đổi kích thước suốt thời gian sống Có thể cấp phát giải phóng nhớ người sử dụng yêu cầu  Cấu trúc liệu động Chương 6: Danh sách liên kết VÍ DỤ CẤU TRÚC DỮ LIỆU ĐỘNG  Cấu trúc liệu động: Ví dụ: Danh sách liên kết,       Cấp phát động lúc chạy chương trình Các phần tử nằm rải rác nhiều nơi nhớ Kích thước danh sách bị giới hạn RAM Tốn nhớ (vì phải chứa thêm vùng liên kết) Khó truy cập ngẫu nhiên Thao tác thêm, xoá đơn giản Insert, Delete Chương 6: Danh sách liên kết GIỚI THIỆU DANH SÁCH LIÊN KẾT  Danh sách liên kết:    Mỗi phần tử danh sách gọi nút (node) Mỗi nút có thành phần: phần liệu phần liên kết (phần liên kết chứa địa nút hay nút trước nó) Các thao tác danh sách liên kết: Thêm phần tử  Xóa phần tử  Tìm kiếm  …  A Chương 6: Danh sách liên kết B X Z Y GIỚI THIỆU DANH SÁCH LIÊN KẾT  Có nhiều kiểu tổ chức liên kết phần tử danh sách như:    Danh sách liên kết đơn Danh sách liên kết kép Danh sách liên kết vòng Chương 6: Danh sách liên kết GIỚI THIỆU - DANH SÁCH LIÊN KẾT  Danh sách liên kết đơn: phần tử liên kết với phần tử đứng sau danh sách: A  B X Z Y Danh sách liên kết kép: phần tử liên kết với phần tử đứng trước sau danh sách: A B C D Chương 6: Danh sách liên kết GIỚI THIỆU - DANH SÁCH LIÊN KẾT  Danh sách liên kết vòng : phần tử cuối danh sách liên kết với phần tử đầu danh sách: A B A X B Z C Y D 10 Chương 6: Danh sách liên kết DSLK ĐÔI – HỦY PHẦN TỬ SAU Q int removeAfter ( DList &l, DNode *q ) { if ( q == NULL ) return 0; DNode *p = q ->pNext ; if ( p == NULL ) return 0; q->pNext = p->pNext; if ( p == l.pTail ) l.pTail = q; else p->pNext->pPrev = q; delete p; pHead return 1; q } A B Chương 6: Danh sách liên kết pTail 85 C D DSLK ĐÔI – HỦY PHẦN TỬ TRƯỚC Q int removeBefore ( DList &l, DNode *q ) { if ( q == NULL ) return 0; DNode *p = q ->pPrev; if ( p == NULL ) return 0; q->pPrev = p->pPrev; if ( p == l.pHead ) l.pHead = q; else p->pPrev->pNext = q; delete p; pHead return 1; } A B Chương 6: Danh sách liên kết pTail q C 86 D DSLK ĐƠI – HỦY PHẦN TỬ CĨ KHĨA K int removeNode ( DList &l, int k ) { DNode *p = l.pHead; while ( p != NULL ) { if ( p->data== k ) break; p = p->pNext; } pHead pTail 87 A Chương 6: Danh sách liên kết B C D DSLK ĐƠI – HỦY PHẦN TỬ CĨ KHĨA K if ( p == NULL ) return 0; // Khơng tìm thấy k DNode *q = p->pPrev; if ( q != NULL ) // Xóa sau q return removeAfter ( l, q ); else // Xóa nút đầu ds return removeHead ( l ); } pHead pTail 88 A Chương 6: Danh sách liên kết B C D DSLK ĐƠI – NHẬN XÉT  DSLK đơi mặt có tính chất giống DSLK đơn  Tuy nhiên DSLK đơi có mối liên kết hai chiều nên từ phần tử truy xuất phần tử khác  Trong DSLK đơn ta truy xuất đến phần tử đứng sau phần tử cho trước  Điều dẫn đến việc ta dễ dàng hủy phần tử cuối DSLK đơi, cịn DSLK đơn thao tác tốn chi phí O(n)  Bù lại, xâu đơi tốn chi phí gấp đơi so với xâu đơn cho việc lưu trữ mối liên kết Điều khiến việc cập nhật nặng nề số trường hợp Như ta cần cân nhắc lựa89 chọn CTDL hợp lý cài đặt cho ứng dụng cụ thể Chương 6: Danh sách liên kết BÀI TẬP  Tạo menu thực chức sau DSLK đôi chứa số nguyên: Thêm số pt vào cuối ds Thêm pt vào trước pt In ds In ds theo thứ tự ngược Tìm GTNN, GTLN ds Tính tổng số âm, tổng số dương ds Tính tích số ds Tính tổng bình phương số ds Nhập x, xuất số bội số x 10 Nhập x, xuất số ước số x 11 Nhập x, tìm giá trị ds mà >x 90 Chương 6: Danh sách liên kết BÀI TẬP (TT) 12 13 14 15 16 17 18 Xuất số nguyên tố cuối ds Đếm số nguyên tố Kiểm tra xem ds có phải tăng khơng Kiểm tra xem ds có pt đối xứng hay khơng Xóa pt cuối Xóa pt đầu Hủy toàn ds 91 Chương 6: Danh sách liên kết NỘI DUNG Giới thiệu  Danh sách liên kết đơn (Single Linked List)  Danh sách liên kết đơi (Double Linked List)  Danh sách liên kết vịng (Circular Linked List)  92 Chương 6: Danh sách liên kết DANH SÁCH LIÊN KẾT VÒNG (DSLK VÒNG)  Là danh sách liên kết đơn (hoặc đôi) mà nút cuối danh sách, thay trỏ đến NULL, trỏ tới nút đầu danh sách  Đối với danh sách vịng, xuất phát từ phần tử để duyệt toàn danh sách Tail Head A B X Z Y Tail Head A Chương 6: Danh sách liên kết B C D 93 DSLK VÒNG – THÊM VÀO ĐẦU DS void addHead (List &l, Node *new_node) { if (l.pHead == NULL) { l.pHead = l.pTail = new_node; l.pTail->pNext = l.pHead; } else{ new_node->pNext = l.pHead; l.pTail->pNext = new_node; l.pHead = new_node; } } Tail Head A Chương 6: Danh sách liên kết B X Z Y 94 DSLK VÒNG – THÊM VÀO CUỐI DS void addTail (List &l, Node *new_node) { if (l.pHead == NULL) { l.pHead = l.pTail = new_node; l.pTail->pNext = l.pHead; } else{ l.pTail->pNext = new_node; new_node->pNext = l.pHead; l.pTail = new_node; } } Tail Head A Chương 6: Danh sách liên kết B X Z Y 95 DSLK VÒNG – HỦY NÚT ĐẦU DS int removeHead (List &l){ Node *p = l.pHead; if ( p == NULL ) return 0; if ( l.pHead == l.pTail ) l.pHead = l.pTail = NULL; else{ l.pHead = p->pNext; l.pTail->pNext = l.pHead; } delete p; return 1; } Tail Head A Chương 6: Danh sách liên kết B X Z 96 Y DSLK VÒNG – HỦY PHẦN TỬ SAU Q int removeAfter (List &l, Node *q) { if ( q == NULL ) return 0; Node *p = q ->pNext ; if ( p == q ) l.pHead = l.pTail = NULL; else{ q->Next = p->pNext; if (p == l.pTail) l.pTail = q; } delete p; return 1; } q pTail A pHead Chương 6: Danh sách liên kết B X Z 97 Y DSLK VÒNG – DUYỆT DANH SÁCH  Danh sách vịng khơng có phần tử đầu danh sách rõ rệt, ta đánh dấu phần tử danh sách xem phần tử đầu xâu để kiểm tra việc duyệt qua hết phần tử danh sách hay chưa Node *p = l.pHead; do{ // something with p p = p->pNext; } while (p != l.pHead); // chưa giáp vòng 98 Chương 6: Danh sách liên kết VÍ DỤ: TÌM KIẾM Node* Search ( List &l, int x ) { Node *p = l.pHead; do{ if ( p->data== x ) return p; p = p->pNext; } while ( p != l.pHead ); // chưa giáp vòng return NULL; } Tail Head A Chương 6: Danh sách liên kết B X Z Y 99 ... suốt thời gian sống Có thể cấp phát giải phóng nhớ người sử dụng yêu cầu  Cấu trúc liệu động Chương 6: Danh sách liên kết VÍ DỤ CẤU TRÚC DỮ LIỆU ĐỘNG  Cấu trúc liệu động: Ví dụ: Danh sách liên... (random access) Chèn phần tử vào mảng, xóa phần tử khỏi mảng tốn nhiều chi phí chèn Chương 6: Danh sách liên kết n-2 n-1 CẤU TRÚC DỮ LIỆU ĐỘNG  Cần xây dựng cấu trúc liệu đáp ứng yêu cầu:   ... List)  Chương 6: Danh sách liên kết CẤU TRÚC DỮ LIỆU TĨNH  Cấu trúc liệu tĩnh:   Khái niệm: Các đối tượng liệu khai báo tường minh khơng thể thay đổi kích thước suốt trình sống thuộc kiểu liệu

Ngày đăng: 09/05/2021, 18:23

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

  • Đang cập nhật ...

Tài liệu liên quan