Bài giảng Cấu trúc dữ liệu và giải thuật: Danh sách liên kết - TS. Ngô Hữu Dũng

50 20 0
Bài giảng Cấu trúc dữ liệu và giải thuật: Danh sách liên kết - TS. Ngô Hữu Dũng

Đ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

Bài giảng Cấu trúc dữ liệu và giải thuật: Danh sách liên kết giới thiệu đến các bạn những nội dung về Kích thước thay đổi linh động, cấp phát bộ nhớ động, không cần vùng nhớ liên tục, chèn/xoá dễ dàng, cho phép dữ liệu lớn hơn, cấu trúc linh hoạt,...

TRƯỜNG ĐẠI HỌC CƠNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH Cấu trúc liệu giải thuật Danh sách liên kết TS Ngô Hữu Dũng Dẫn nhập  Mảng (array)      Danh sách liên kết (linked list)     Kích thước khó thay đổi Cần cấp phát trước vùng nhớ liên tục Mất nhiều thao tác để chèn/xoá phần tử Phù hợp với liệu nhỏ, truy xuất nhanh Kích thước thay đổi linh động Cấp phát nhớ động, không cần vùng nhớ liên tục Chèn/xoá dễ dàng Cho phép liệu lớn hơn, cấu trúc linh hoạt Cấu trúc liệu giải thuật - DSLK Linked list – Khái niệm Dãy phần tử nối với trỏ (pointer)  Mỗi phần tử nút (node)    Phần liệu (int, float, char, struct…) Phần liên kết (pointer) Con trỏ head trỏ vào nút  Con trỏ tail trỏ vào nút cuối  Nút cuối trỏ vào NULL  data next data next data next tail head NULL Cấu trúc liệu giải thuật - DSLK Các loại danh sách liên kết Danh sách liên kết đơn (Singly linked list)  data next data next data next tail head NULL  Danh sách liên kết đôi/kép (Doubly linked list) prev data next prev data next prev data next tail head NULL  NULL Danh sách liên kết vòng (Circular linked list) data next data next head Cấu trúc liệu giải thuật - DSLK data next Một vài ứng dụng  Tổ chức cấu trúc liệu khác   Lưu dấu    Bộ nhớ, tiến trình, tập tin… Phù hợp với ứng dụng  Lịch sử truy cập web (history) Lưu tác vụ (undo) Quản lý thành phần máy tính   Stack, queue, tree, graph, hash table… Dữ liệu lớn, cấu trúc linh động Cấu trúc liệu giải thuật - DSLK data next data next data next tail head NULL Danh sách liên kết đơn Singly linked list Cấu trúc liệu giải thuật - DSLK Singly linked list – Khai báo  Khai báo nút kiểu cấu trúc    Phần liệu (int, float, char, struct…) Phần liên kết (pointer) Khai báo trỏ head tail struct Node { int data; struct Node *next; }; struct Node *head; struct Node *tail; data head tail Cấu trúc liệu giải thuật - DSLK next Định nghĩa kiểu nút  Dùng typedef định nghĩa kiểu cấu trúc nút  Có nhiều cách khai báo biến kiểu nút struct Node { int data; struct Node *next; }; // Định nghĩa kiểu nút typedef struct Node tNode; tNode *head; struct Node *tail; 10.Node *temp; // C++ Cấu trúc liệu giải thuật - DSLK Kiểu danh sách  Khai báo kiểu danh sách  Con trỏ head tail Phù hợp với toán cần dùng nhiều danh sách  Truy xuất?    ds1.taildata ds1.headnext data next head tail NULL (?) (?) // Kiểu nút struct Node { int data; struct Node *next; }; // Kiểu danh sách struct List { 10 struct Node *head; 11 struct Node *tail; 12.}; 13.// Biến danh sách 14.struct List ds1, ds2; Cấu trúc liệu giải thuật - DSLK Khai báo – Ví dụ  Danh sách sinh viên    Cấu trúc sinh viên  ID, ten… Cấu trúc nút  Dữ liệu: Kiểu cấu trúc sinh viên  Liên kết: Con trỏ kiểu nút Truy xuất?   10 ds.taildata.ID ds.headnextdata.ID struct SV{ int ID; char ten[50]; bool gioiTinh; float diem; }; struct Node{ struct SV data; struct Node *next; 10.}; 11.struct List{ 12 struct Node *head; 13 struct Node *tail; 14.}; 15.struct List ds; Cấu trúc liệu giải thuật - DSLK Xoá nút đầu danh sách // Delete the head node void delHead(tList *list) { tNode *delNode = list->head; if(delNode==NULL) // Empty list return; // (1) list->head = delNode->next;// (2) if(list->head == NULL) list->tail = NULL; // Become empty // (3) 10 11.} free(delNode); // (4) 36 Cấu trúc liệu giải thuật - DSLK Xoá nút sau nút cho trước  Nút cho trước rỗng nút cần xoá rỗng!?  Thay đổi liên kết  delNode = givenNodenext givenNodenext = delNodenext Nút cần xoá nút cuối cùng?  Kết thúc Cập nhật tail Giải phóng nhớ free() delete data next data (3) next givenNode 37 data next delNode Cấu trúc liệu giải thuật - DSLK data next Xoá nút sau nút cho trước // Delete the node after a given node void delAfter(tList *list, tNode *givenNode) { tNode *delNode; if(givenNode==NULL || givenNode->next == NULL) return; // (1) delNode = givenNode->next; givenNode->next = delNode->next; // (2) // (3) 10 11 12.} if(delNode==list->tail) list->tail = givenNode; free(delNode); // (4) // (5) 38 Cấu trúc liệu giải thuật - DSLK Xoá nút cuối danh sách tail (3)  Danh sách rỗng?  data Kết thúc next NULL Danh sách trở thành rỗng Ngược lại, danh sách có nhiều nút?  next Danh sách có nút?  data Tìm nút áp cuối (trước nút cuối) Nút áp cuối trở thành nút cuối Giải phóng nhớ 39 free() delete Cấu trúc liệu giải thuật - DSLK data NULL Xoá nút cuối danh sách // Delete the tail node void delTail(tList *list){ tNode *delNode = list->tail; if(delNode==NULL) return; tNode *i = list->head; if(i==delNode){ list->head=NULL; list->tail=NULL; 10 }else{ 11 while(i->next!=delNode) 12 i = i->next; 13 i->next = NULL; 14 list->tail = i; 15 } 16 free(delNode); 17.} 40 // (1) // (2) // (3) // (4) // (4) // (5) Cấu trúc liệu giải thuật - DSLK Xoá nút cho trước Xoá nút cho trước  Có thể vận dụng hàm biết  Ví dụ:     41 Nút cần xoá head?  Gọi delHead Nút cần xố tail?  Gọi delTail Tìm nút trước nút cần xoá  Gọi delAfter Cấu trúc liệu giải thuật - DSLK Xoá nút cho trước // Delete a given node void delGivenNode(tList *list, tNode *delNode) { if(delNode == list->head) delHead(list); else if(delNode == list->tail) delTail(list); else{ tNode *tempNode = list->head; 10 while(tempNode && tempNode->next!=delNode) 11 tempNode = tempNode->next; 12 if(tempNode) 13 delAfter(list, tempNode); 14 } 15.} 42 Cấu trúc liệu giải thuật - DSLK Xố tồn danh sách // Remove all list void removeList(tList *list) { tNode *node; while(list->head) { node=list->head; list->head = node->next; free(node); 10 } 11 list->tail = NULL; 12.} 43 Cấu trúc liệu giải thuật - DSLK Xoá toàn danh sách  Đơn giản 44 // Remove all list void removeList(tList *list) { while(list->head) delHead(list); } Cấu trúc liệu giải thuật - DSLK Vận dụng  Bài tập: Container tracking  Bổ sung thao tác xoá container   45 Xoá container (Nhập ID) Xoá toàn danh sách Cấu trúc liệu giải thuật - DSLK Sắp xếp danh sách – Interchange sort 46 // Sắp xếp tăng dần void interchangeSort(tList *list) { tNode *i, *j; for(i = list->head; i!=list->tail; i=i->next) for(j = i->next; j!=NULL; j=j->next) if(i->data > j->data) swapData(i, j); } Cấu trúc liệu giải thuật - DSLK Sắp xếp danh sách – Selection sort // Sắp xếp giảm dần void selectionSort(tList *list) { tNode *i, *j, *max; for(i = list->head; i!=list->tail; i=i->next) { max = i; for(j = i->next; j!=NULL; j=j->next) if(max->data < j->data) 10 max = j; 11 if(i!=max) 12 swapData(i, max); 13 } 14.} 47 Cấu trúc liệu giải thuật - DSLK Sắp xếp danh sách  Một số thuật tốn khơng ưa thích danh sách liên kết đơn   Danh sách liên kết đơn khó duyệt lùi Vẫn cài đặt thuật toán 48 Cấu trúc liệu giải thuật - DSLK Vận dụng  Bài tập: Container tracking  Bổ sung tác vụ xếp container   Theo khối lượng chứa Tạo menu để thực tác vụ tạo 49 Cấu trúc liệu giải thuật - DSLK Menu 10 11 50 Nhập container Xuất thông tin container Liệt kê container dùng Đếm số lượng container rỗi Tính tổng khối lượng hàng hố Tìm địa GPS container Cập nhật thông tin container Sắp xếp danh sách theo khối lượng Xố container Xố tồn danh sách Thốt chương trình Cấu trúc liệu giải thuật - DSLK ... Vào đầu, vào cuối, chèn vào sau phần tử Ở đầu, cuối, Sắp xếp 12 Cấu trúc liệu giải thuật - DSLK Bài toán đặt  Danh sách số nguyên    13 Cấu trúc liệu danh sách liên kết đơn Các thao tác danh. .. table… Dữ liệu lớn, cấu trúc linh động Cấu trúc liệu giải thuật - DSLK data next data next data next tail head NULL Danh sách liên kết đơn Singly linked list Cấu trúc liệu giải thuật - DSLK Singly... (5) 38 Cấu trúc liệu giải thuật - DSLK Xoá nút cuối danh sách tail (3)  Danh sách rỗng?  data Kết thúc next NULL Danh sách trở thành rỗng Ngược lại, danh sách có nhiều nút?  next Danh sách có

Ngày đăng: 20/05/2021, 03:36

Từ khóa liên quan

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

Tài liệu liên quan