Bài giảng cấu trúc dữ liệu và thuật toán chương 6 danh sách liên kết

149 385 0
Bài giảng cấu trúc dữ liệu và thuật toán   chương 6  danh sách liên kết

Đ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

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 Giới thiệu  Kiểu liệu tĩnh  Khái niệm: Một số đối tượng liệu không thay thay đổi kích thước, cấu trúc, … suốt trình sống Các đối tượng liệu thuộc kiểu liệu gọi kiểu liệu tĩnh  Một số kiểu liệu tĩnh: cấu trúc liệu xây dựng từ kiểu sở như: kiểu thực, kiểu nguyên, kiểu ký tự từ cấu trúc đơn giản mẩu tin, tập hợp, mảng  Các đối tượng liệu xác định thuộc kiểu liệu thường cứng ngắt, gò bó  khó diễn tả thực tế vốn sinh động, phong phú Chương 6: Danh sách liên kết Giới thiệu  Một số hạn chế CTDL tĩnh  Một số đối tượng liệu chu kỳ sống thay đổi cấu trúc, độ lớn, danh sách học viên lớp học tăng thêm, giảm Nếu dùng cấu trúc liệu tĩnh biết mảng để biểu diễn  Những thao tác phức tạp, tự nhiên  chương trình khó đọc, khó bảo trì khó sử dụng nhớ cách có hiệu  Dữ liệu tĩnh chiếm vùng nhớ dành cho chúng suốt trình hoạt động chương trình  sử dụng nhớ hiệu Chương 6: Danh sách liên kết Giới thiệu  Cấu trúc liệu tĩnh: Ví dụ: Mảng chiều  Kích thước cố định (fixed size)  Chèn phần tử vào mảng khó  Các phần tử theo số  n-1  Truy cập ngẫu nhiên (random access) chèn Chương 6: Danh sách liên kết n-2 n-1 Giới thiệu  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  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:  Mỗi phần tử danh sách gọi node (nút)  Mỗi node có thành phần: phần liệu phần liên kết chứa địa node hay node trước  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  … Chương 6: 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 đơ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 đôi: phần tử liên kết với phần tử đứng trước sau danh sách: A Chương 6: Danh sách liên kết B C D Giới thiệu 10  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 Chương 6: Danh sách liên kết X B Z C Y D DSLK đôi – Hủy phần tử trước q 135 int removeBefore (DList &l, DNode *q) { if (q == NULL) return 0; DNode *p = q ->pPrev; if (p != NULL) { q->pPrev = p->pPrev; if (p == l.pHead) l.pHead = q; else p->pPrev->pNext = q; delete p; return 1; } else return 0; } Chương 6: Danh sách liên kết DSLK đôi – Hủy phần tử có khóa k 136 int removeNode (DList &l, int k) { DNode *p = l.pHead; while (p != NULL) { if (p->data== k) break; p = p->pNext; } Chương 6: Danh sách liên kết DSLK đôi – Hủy phần tử có khóa k 137 if (p == NULL) return 0; // Không tìm thấy k DNode *q = p->pPrev; if (q != NULL) // Xóa nút p sau q return removeAfter (l, q); else // Xóa p nút đầu ds return removeHead (l);  } Chương 6: Danh sách liên kết DSLK đôi – Nhận xét 138  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, DSLK đơn thao tác tốn chi phí O(n) Chương 6: Danh sách liên kết DSLK đôi – Nhận xét 139  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ựa 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 Nội dung 140     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 Danh sách liên kết vòng (DSLK vòng) 141  Là danh sách liên kết đơn (hoặc đôi) mà phần tử cuối danh sách, thay mang giá trị NULL, trỏ tới phầ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 Chương 6: Danh sách liên kết DSLK vòng 142  Để biểu diễn, sử dụng kỹ thuật biểu diễn danh sách đơn (hoặc đôi) Tail Head A B X Z Y Tail Head A Chương 6: Danh sách liên kết B C D DSLK vòng – Tìm kiếm 143  Danh sách vòng 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 Chương 6: Danh sách liên kết DSLK vòng – Tìm kiếm 144 Node* Search (List &l, int x) { Node *p = l.pHead; do{ if (p->data== x) return p; p = p->pNext; } while (p != l.pHead); return p; } Chương 6: Danh sách liên kết // chưa giáp vòng DSLK vòng – Thêm vào đầu ds 145 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; } } Chương 6: Danh sách liên kết DSLK vòng – Thêm vào cuối ds 146 void { addTail (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.pTail = new_node; } } Chương 6: Danh sách liên kết DSLK vòng – Thêm sau nút q 147 void addAfter (List &l, Node *q, Node *new_node) { if (l.pHead == NULL) { l.pHead = l.pTail = new_node; l.pTail->pNext = l.pHead; } else { new_node->pNext = q->pNext; q->pNext = new_node; if (q == l.pTail) l.pTail = new_node; } } Chương 6: Danh sách liên kết DSLK vòng – Hủy nút đầu ds 148 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; if (p == l.pTail) l.pTail->pNext = l.pHead; } delete p; return 1; } Chương 6: Danh sách liên kết DSLK vòng – Hủy phần tử sau q 149 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; } Chương 6: Danh sách liên kết [...]... tạo Chương 6: Danh sách liên kết Danh sách liên kết đơn (DSLK đơn) 29    Khai báo Các thao tác cơ bản trên DSLK đơn Sắp xếp trên DSLK đơn Chương 6: Danh sách liên kết DSLK đơn 30  Các thao tác cơ bản  Tạo danh sách rỗng  Thêm một phần tử vào danh sách  Duyệt danh sách  Tìm kiếm một giá trị trên danh sách  Xóa một phần tử ra khỏi danh sách  Hủy toàn bộ danh sách  … Chương 6: Danh sách liên kết. .. thiệu Danh sách liên kết đơn (Single Linked List) Danh sách liên kết kép (Doule Linked List) Danh sách liên kết vòng (Circular Linked List) Chương 6: Danh sách liên kết Danh sách liên kết đơn (DSLK đơn) 22    Khai báo Các thao tác cơ bản trên DSLK đơn Sắp xếp trên DSLK đơn Chương 6: Danh sách liên kết DSLK đơn – Khai báo 23  Là danh sách các node mà mỗi node có 2 thành phần:  Thành phần dữ liệu: lưu... danh sách rỗng pTail pHead void Init(List &l) { l.pHead = l.pTail = NULL; } Chương 6: Danh sách liên kết DSLK đơn 32  Các thao tác cơ bản  Tạo danh sách rỗng  Thêm một phần tử vào danh sách  Duyệt danh sách  Tìm kiếm một giá trị trên danh sách  Xóa một phần tử ra khỏi danh sách  Hủy toàn bộ danh sách  … Chương 6: Danh sách liên kết DSLK đơn – Các thao tác cơ sở 33   Thêm một phần tử vào danh. .. sách: Có 3 vị trí thêm  Gắn vào đầu danh sách  Gắn vào cuối danh sách  Chèn vào sau nút q trong danh sách Chú ý trường hợp danh sách ban đầu rỗng Chương 6: Danh sách liên kết DSLK đơn – Các thao tác cơ sở 34  Thêm một phần tử  Nếu danh sách ban đầu rỗng pTail pHead pHead = pTail = new_node; X new_node Chương 6: Danh sách liên kết DSLK đơn – Các thao tác cơ sở 35  Thêm một phần tử  Nếu danh sách. .. phần tử cuối danh sách Khai báo pTail như sau: Node *pTail; pTail pHead A Chương 6: Danh sách liên kết B X Z Y DSLK đơn – Khai báo 26  Ví dụ: Khai báo cấu trúc 1 DSLK đơn chứa số nguyên // kiểu của một phần tử trong danh sách struct Node { int data; Node* pNext; }; // kiểu danh sách liên kết struct List { Node* pHead; Node* pTail; }; Chương 6: Danh sách liên kết Khai báo biến kiểu danh sách: List tên_biến;... node vào đầu danh sách pTail pHead A X new_node Chương 6: Danh sách liên kết B C D E new_node->pNext = pHead; pHead = new_node; DSLK đơn – Các thao tác cơ sở 36 Thuật toán: Gắn nút vào đầu DS // input: danh sách, phần tử mới new_node // output: danh sách với new_node ở đầu DS  Nếu DS rỗng thì   pHead = pTail = new_node; Ngược lại  new_node->pNext = pHead;  pHead = new_node; Chương 6: Danh sách liên. .. dựng cấu trúc dữ liệu đáp ứng được các yêu cầu:  Linh động hơn  Có thể thay đổi kích thước, cấu trúc trong suốt thời gian sống  Cấu trúc dữ liệu động Chương 6: Danh sách liên kết Biến không động 12 Biến không động (biến tĩnh, biến nửa tĩnh) là những biến thỏa:  Được khai báo tường minh,  Tồn tại khi vào phạm vi khai báo và chỉ mất khi ra khỏi phạm vi này,  Được cấp phát vùng nhớ trong vùng dữ liệu. .. giá trị 0 cho phần tử thứ 4 của mảng p2 free(p1); free(p2); Chương 6: Danh sách liên kết Kiểu dữ liệu Con trỏ 18   Kiểu con trỏ là kiểu cơ sở dùng lưu địa chỉ của một đối tượng dữ liệu khác Biến thuộc kiểu con trỏ Tp là biến mà giá trị của nó là địa chỉ cuả một vùng nhớ ứng với một biến kiểu T, hoặc là giá trị NULL Chương 6: Danh sách liên kết Con trỏ – Khai báo 19  Cú pháp định nghĩa một kiểu con... mối liên kết: lưu trữ địa chỉ của phần tử kế tiếp trong danh sách, hoặc lưu trữ giá trị NULL nếu là phần tử cuối danh sách Link  Khai báo node Data struct Node { DataType data; // DataType là kiểu đã định nghĩa trước Node *pNext; // con trỏ chỉ đến cấu trúc Node }; Chương 6: Danh sách liên kết DSLK đơn – Khai báo 24  Ví dụ 1: Khai báo node lưu số nguyên: struct Node { int data; Node *pNext; }; Chương. .. một định danh đã được kết nối với địa chỉ vùng nhớ lưu trữ biến và được truy xuất trực tiếp thông qua định danh đó  Ví dụ : int a; // a, b là các biến không động char b[10]; Chương 6: Danh sách liên kết Biến động 13   Trong nhiều trường hợp, tại thời điểm biên dịch không thể xác định trước kích thước chính xác của một số đối tượng dữ liệu do sự tồn tại và tăng trưởng của chúng phụ thuộc vào ngữ cảnh ... … Chương 6: 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. ..  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 đôi: phần tử liên kết với phần tử đứng trước sau danh sách: A Chương 6: Danh sách liên. .. phần tử vào danh sách: Có vị trí thêm  Gắn vào đầu danh sách  Gắn vào cuối danh sách  Chèn vào sau nút q danh sách Chú ý trường hợp danh sách ban đầu rỗng Chương 6: Danh sách liên kết DSLK

Ngày đăng: 03/12/2015, 06:38

Từ khóa liên quan

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

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

Tài liệu liên quan