Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 4 – Trần Minh Thái (2017)

72 55 0
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 4 – Trần Minh Thái (2017)

Đ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 - Chương 4: Danh sách liên kết giúp người học có thể nắm vững khái niệm về kiểu dữ liệu tĩnh và động, nắm vững cách tổ chức dữ liệu động bằng danh sách liên kết và minh họa được các thao tác xử lý trên danh sách liên kết đơn, cài đặt minh họa được các thao tác của danh sách đơn bằng ngôn ngữ C.

Chương Danh sách liên kết Trần Minh Thái Email: minhthai@huflit.edu.vn Website: www.minhthai.edu.vn Cập nhật: ngày 10 tháng 04 năm 2016 Mục tiêu  Nắm vững khái niệm kiểu liệu tĩnh động  Nắm vững cách tổ chức liệu động danh sách liên kết minh họa thao tác xử lý danh sách liên kết đơn  Cài đặt minh họa thao tác danh sách đơn ngôn ngữ C Vấn đề kiểu liệu tĩnh 10 10 5 15 15 2 ? Làm để chèn thêm số vào vị trí mảng Vấn đề kiểu liệu tĩnh ? 10 10 Giả sử cần thêm tiếp phần tử 5 15 15 2 Bổ sung thêm Bài tập Hãy cài đặt hàm (bằng ngơn ngữ C) chèn phần tử có giá trị x vào vị trí vt mảng số nguyên a, kích thước n, theo mẫu hàm sau: void ChenX(int a[], int &n, int x, int vt); Vấn đề kiểu liệu tĩnh 10 10 5 3 15 15 2 ? Làm để xóa phần tử Vấn đề kiểu liệu tĩnh 10 10 5 15 15 2 7 Bài tập Hãy cài đặt hàm (bằng ngôn ngữ C) xóa phần tử có giá trị x (nếu có) mảng số nguyên a, kích thước n (giả sử giá trị phần tử mảng không trùng nhau), theo mẫu hàm sau: void XoaX (int a[], int &n, int x); Vấn đề kiểu liệu tĩnh i Độ phức tạp chèn/ xóa mảng chiều O(n) Vấn đề kiểu liệu tĩnh  Giải vấn đề phức tạp chèn/ xóa?  Giải vấn đề giới hạn kích thước vùng nhớ tối đa?  Giải vấn đề vùng nhớ không liên tục?  Giải vấn đề giải phóng vùng nhớ không cần dùng đến? DÙNG CẤU TRÚC DỮ LIỆU ĐỘNG 10 Chèn node vào trước node p – Cách ? Hãy viết hàm tìm trả trỏ node đứng trước trỏ node p (bằng ngôn ngữ C), theo mẫu sau: NODE *PrevNode (LIST list, NODE *p) 58 Chèn node vào trước node p – Cách NODE *PrevNode (LIST list, NODE *p) { if(p == list.pHead) return NULL; NODE *pTruoc = list.pHead; while(pTruoc->pNext != p) pTruoc = pTruoc -> pNext; return pTruoc; } 59 Chèn node vào trước node p – Cách void ChenTruocP1 (LIST &list, NODE *p, NODE *pNew) { pNew -> pNext = p; NODE *pTruoc = PrevNode(list, p); if(pTruoc == NULL) list.pHead = pNew; else pTruoc -> pNext = pNew; } 60 Chèn node vào trước node p – Cách Bước Chèn pNew vào sau p Bước Hoán vị giá trị pNew p pNew p list pHead pTail 61 Xóa nút danh sách Xóa nút đầu danh sách  Ảnh hưởng pHead Xóa nút cuối danh sách  Ảnh hưởng pTail Xóa nút danh sách 62 Xóa nút danh sách Xóa nút đầu danh sách Cần xóa 30 list pHead 25 41 pTail pDel NODE *pDel = list.pHead list.pHead = list.pHead->pNext free(pDel) 63 78 Xóa nút danh sách ? Hãy viết hàm xóa nút đầu danh sách (bằng ngôn ngữ C), theo mẫu sau: void DeleteHead (LIST &list) (lưu ý trường hợp danh sách cịn node trước xóa) 64 Xóa nút danh sách void DeleteHead (LIST &list) { NODE *pDel = list.pHead; if(list.pHead != list.pTail) list.pHead = pDel -> pNext; else list.pHead = list.pTail = NULL; free(pDel); } 65 Xóa nút danh sách Xóa nút cuối danh sách Cần xóa pPrev 30 list pHead 25 41 pTail NODE *pDel = list.pTail NODE *pPrev = “Tìm node trước pTail” pPrev->pNext = NULL list.pTail = pPrev free(pDel) 66 pDel 78 Xóa nút danh sách ? Hãy viết hàm xóa nút cuối danh sách (bằng ngôn ngữ C), theo mẫu sau: void DeleteTail (LIST &list) (lưu ý trường hợp xóa danh sách có node) 67 Xóa nút danh sách void DeleteTail (LIST &list) { NODE *pDel = list.pTail; NODE *pTruoc = PrevNode(list, list.pTail); if(pTruoc != NULL) { pTruoc -> pNext = NULL; list.pTail = pTruoc; } else list.pHead = list.pTail = NULL; free(pDel); } 68 Xóa nút danh sách Xóa nút danh sách Cần xóa 30 list pHead pPrev pDel 25 41 96 pTail NODE *pPrev = “Tìm node trước pDel” pPrev->pNext = pDel->pNext free(pDel) 69 78 Xóa nút danh sách ? Hãy viết hàm xóa node danh sách (bằng ngôn ngữ C), theo mẫu: void DeleteNode (LIST &list, NODE *pDel) 70 Xóa nút danh sách ? Hãy viết hàm hủy tồn danh sách (bằng ngơn ngữ C), theo mẫu sau: void DestroyList (LIST &list) 71 Bài tập Chèn node có giá trị x vào phía sau node có giá trị lớn (giả sử danh sách khơng có giá trị trùng nhau) void ChenXSauMax(LIST &list, int x); Xóa node có giá trị x xuất danh sách (nếu có xóa: trả 1, ngược lại trả 0) int XoaX(LIST &list, int x); Sắp tăng dslk void SapTang(LIST &list); 72 ... pNew vào cuối danh sách (bằng ngôn ngữ C), theo mẫu sau: void AddTail (LIST &list, NODE *pNew) 46 Nhập liệu vào danh sách Nhập liệu cho node Tạo trỏ node Thêm node vào danh sách 47 Nhập liệu vào... list.pTail = pNew 44 TH Thêm nút vào cuối danh sách ? Hãy vẽ lại “đường kết nối” theo thứ tự thích hợp thêm pNew vào cuối danh sách 30 list pHead 25 42 pTail pNew 45 TH Thêm nút vào cuối danh sách... vấn đề vùng nhớ không liên tục?  Giải vấn đề giải phóng vùng nhớ không cần dùng đến? DÙNG CẤU TRÚC DỮ LIỆU ĐỘNG 10 Biến tĩnh biến động C  Biến tĩnh tên biến;  Vd: int a; float

Ngày đăng: 10/05/2021, 23:16

Từ khóa liên quan

Mục lục

  • Slide 1

  • Mục tiêu

  • Vấn đề kiểu dữ liệu tĩnh

  • Vấn đề kiểu dữ liệu tĩnh

  • Bài tập

  • Vấn đề kiểu dữ liệu tĩnh

  • Vấn đề kiểu dữ liệu tĩnh

  • Bài tập

  • Vấn đề kiểu dữ liệu tĩnh

  • Vấn đề kiểu dữ liệu tĩnh

  • Biến tĩnh và biến động trong C

  • Biến tĩnh và biến động trong C

  • Biến tĩnh và biến động trong C

  • Danh sách liên kết (DSLK)

  • Slide 15

  • Đặc điểm DSLK

  • Đặc điểm DSLK

  • Cấu tạo của DSLK

  • Cấu tạo của DSLK

  • Cấu tạo của nút

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

Tài liệu liên quan