1. Trang chủ
  2. » Luận Văn - Báo Cáo

Danh sách liên kết lép Tiểu luận cấu trúc dữ liệu

13 2 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 13
Dung lượng 636,06 KB
File đính kèm Tiểu luận CTDL.rar (1 MB)

Nội dung

Bài tiểu luận môn cấu trúc dữ liệu, chủ đề danh sách liên kết kép do sinh viên làm kèm file code, ảnh code ngôn ngữ c. LỜI NÓI ĐẦU Ngày nay, nghành công nghệ thông tin đang phát triển mạnh mẽ và được ứng dụng phổ biến khắp các mọi mặt đời sống. Từ vật chất tới các mạng xã hội, thế giới hiện nay ngày càng phát triển là do nghành công nghệ thông tin đạt được nhiều thành tựu và phát triển Chính vì tầm quan trọng và đa dạng về nghành công nghệ thông tin mà đòi hỏi các sinh viên công nghệ thông tin cần phải nắm vững các nguyên lý và ứng dụng của các môn học từ khi còn trên ghế nhà trường mà hôm nay chúng ta sẽ nói về môn “Cấu trúc dữ liệu và giải thuật”. Trong phạm vi môn học, nhằm tìm hiểu về danh sách liên kết, tác giả xin trình bày đề tài: Nghiên cứu và cài đặt danh sách liên kết kép

TRƯỜNG ĐẠI HỌC AN GIANG KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO DANH SÁCH LIÊN KẾT KÉP NGUYỄN MINH ĐỨC – DH22PM AN GIANG, 05 – 2022 LỜI NÓI ĐẦU ***** Ngày nay, nghành công nghệ thông tin phát triển mạnh mẽ ứng dụng phổ biến khắp mặt đời sống Từ vật chất tới mạng xã hội, giới ngày phát triển nghành công nghệ thông tin đạt nhiều thành tựu phát triển Chính tầm quan trọng đa dạng nghành công nghệ thông tin mà địi hỏi sinh viên cơng nghệ thơng tin cần phải nắm vững nguyên lý ứng dụng mơn học từ cịn ghế nhà trường mà hơm nói môn “Cấu trúc liệu giải thuật” Trong phạm vi mơn học, nhằm tìm hiểu danh sách liên kết, tác giả xin trình bày đề tài: Nghiên cứu cài đặt danh sách liên kết kép MỤC LỤC CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI CHƯƠNG 2: NỘI DUNG ĐỀ TÀI .3 CHƯƠNG 3: CHƯƠNG TRÌNH .5 CHƯƠNG 4: ĐÁNH GIÁ KẾT QUẢ NGHIÊN CỨU VÀ KẾT LUẬN .13 TÀI LIỆU THAM KHẢO 13 Nguyễn Minh Đức – DH22PM CHƯƠNG I: GIỚI THIỆU ĐỀ TÀI I Phát biểu đề tài Trước tìm hiểu nghiên cứu danh sách liên kết đôi, trước hết phải hiểu khái niệm danh sách liên kết đơn (Linked List): Giống kiểu liệu Array (mảng), Linked List cấu trúc liệu tuyến tính Tuy nhiên khác với array, phần tử linked list không lưu trữ vị trí nhớ liền kề nhau, mà phần tử linked list liên kết với cách sử dụng trỏ So với Linked List Doubly Linked List (DLL – danh sách liên kết kép) chứa thêm trỏ phụ, thường gọi previous pointer (con trỏ trỏ đến node trước đó), trỏ previous với trỏ next phần data chứa liệu/giá trị node (2 thành phần nằm node Linked List thông thường) thành phần tạo nên Doubly Linked List, báo cáo này, nghiên cứu cài đặt danh sách liên kết kép II Phạm vi, đối tượng nghiên cứu Danh sách liên kết kép (Doubly linked list) III Mục tiêu - Tìm hiểu cấu trúc, thuật tốn chương trình sử dụng cài đặt dánh sách liên kết kép - Viết giải thuật IV Nguồn phương pháp nghiên cứu - Nguồn nghiên cứu: từ giáo trình “Cấu trúc liệu giải thuật, tài liệu từ web - Phương pháp: tìm hiểu tài liệu, từ viết chương trình, chạy thử kiểm tra độ xác chương trình CHƯƠNG II: NỘI DUNG ĐỀ TÀI I Danh sách liên kết Danh sách liên kết danh sách mà phần tử liên kết với nhờ vào vùng liên kết chúng, phần tử danh sách lưu trữ phần tử nhớ gồm số đơn vị nhớ gọi nút Mỗi nút có thành phần: + Trường liệu: lưu trữ thông tin liệu nút + Trường trỏ: chứa địa nút hay trước II Danh sách liên kết kép (Doubly Linked List) Khái niệm - Danh sách liên kết kép danh sách mà phần tử danh sách có kết nối với phần tử đứng trước phần tử đứng sau - Danh sách liên kết kép xác định hai trỏ: + Left: trỏ vào node + Right: trỏ vào node cuối Khai báo - Danh sách nối kép gồm nút nối với theo chiều Mỗi nút ghi gồm ba trường: + Trường thứ chứa giá trị lưu nút + Trường thứ hai (Next) chứa liên kết (Con trỏ) tới nút kế tiếp, tức chứa thông tin đủ để biết nút nút nút nào, trường hợp nút cuối cùng, trường liên kết gán giá trị đặc biệt + Trường thứ ba (Prev) chứa liên kết (Con trỏ) tới nút liền trước, tức chứa thông tin đủ để biết nút đứng trước nút danh sách nút nào, trường hợp nút trường gán giá trị đặc biệt - Khác với danh sách nối đơn, danh sách nối kép có hai chốt: + Nút chốt danh sách gọi First + Nút cuối danh sách gọi Last - Để duyệt danh sách nối kép, ta có hai cách: + Hoặc First, dựa vào liên kết Next để sang nút kế tiếp, đến gặp giá trị đặc biệt (Nút cuối) dừng lại + Hoặc Last, dựa vào liên kết Prev để sang nút liền trước Việc chèn/xóa vào danh sách nối kép đơn giản kỹ thuật chỉnh lại mối liên kết nút cho hợp lý - Tổ chứa danh sách liên kết kép: Trong nút ngồi phần Data cịn có hai trỏ, trỏ đến nút đứng trước trỏ đến nút đứng sau Liên kết sau Data Giá trị Liên kết trước Hình ảnh minh họa - Như cấu trúc nút biểu diễn sau: Lptr Data Rptr - Trong đó: + Data chứa liệu nút + Lptr: trỏ trái, trỏ tới nút đứng trước + Rptr: trỏ phải, trỏ tới nút đứng sau (Lptr nút cực trái Rptr nút cực phải Null) CHƯƠNG III: CHƯƠNG TRÌNH Cài đặt node DLL (Doubly linked list) ngôn ngữ C: Chèn thêm node vào đầu DLL (5 Bước) ngôn ngữ C: Node ln ln chèn vào phía trước node head linked list cho Và node vừa chèn thêm vào trở thành node head DLL Ví dụ, DLL cho có dạng 10 -> 15 -> 20 -> 25 chèn thêm phần tử vào phía trước, lúc DLL trở thành -> 10 -> 15 -> 20 -> 25 Chúng ta gọi hàm có chức chèn thêm node vào phần đầu DLL hàm push() Hàm push() phải nhận vào trỏ trỏ đến trỏ head, hàm push phải thay đổi trỏ head để trỏ head trỏ đến node chèn vào Truyền vào cho hàm push() tham chiếu (con trỏ trỏ đến trỏ) tới node head DLL, giá trị int mà node chứa, hàm push() thực chèn thêm node vào phần đầu danh sách liên kết kép (DLL): Cấp phát nhớ cho node Truyền liệu (chính giá trị int) vào node Làm cho trỏ next node trỏ đến (bằng với) trỏ head DLL, làm cho trỏ previous node với NULL Làm cho trỏ prev node head trỏ đến node cần chèn vào Làm cho trỏ head trỏ đến node chèn vào Chèn thêm node vào sau node cụ thể DLL (7 bước) ngôn ngữ C: Ở đây, cho trỏ trỏ đến node, trỏ prev_node, node chèn vào phía sau node cụ thể DLL Dưới bước để chèn thêm node vào phía sau node cụ thể DLL: Hàm insertAfter() nhận vào node để làm prev_node, giá trị int mà node chứa Hàm insertAfter() thực chèn thêm node vào phía sau node cho Kiểm tra xem prev_node nhận vào có NULL hay khơng, NULL return ln Cấp phát nhớ cho node Truyền liệu (giá trị) vào node Làm cho trỏ next node trỏ đến (bằng với) trỏ next prev_node Làm cho trỏ next prev_node trỏ đến (bằng với) node chèn vào Làm cho trỏ prev node chèn vào trỏ đến (bằng với node prev_node Hay nói cách khác làm cho prev_node trở thành node trước new_node Làm cho trỏ prev trỏ next new_node trỏ đến (bằng với) new_node Chèn thêm node vào cuối DLL (7 bước) ngôn ngữ C: Trong trường hợp này, node ln ln chèn thêm vào phía sau node cuối DLL cho Ví dụ, DLL cho có dạng -> 10 -> 15 -> 20 -> 25 chèn thêm phần tử 30 vào cuối, lúc DLL trở thành -> 10 -> 15 -> 20 -> 25 -> 30 Bởi bản, danh sách liên kết kép hay danh sách liên kết nói chung đại diện trỏ head chúng, nên phải duyệt từ đầu tới cuối danh sách sau thay đổi trỏ next node cuối trỏ next trỏ đến node chèn thêm vào Dưới dây bước để chèn thêm node vào cuối danh sách liên kết kép Hàm append() nhận vào tham chiếu (con trỏ trỏ đến trỏ) tới trỏ head DLL giá trị int mà node chứa Hàm append() thực chèn thêm node vào phần cuối DLL Cấp phát nhớ cho new_node Truyền liệu (giá trị) vào new_node new_node trở thành node cuối DLL, phải làm cho trỏ next new_node trở thành/bằng với NULL Nếu DLL trống, ta làm cho new_node trở thành node head DLL luôn, tức làm cho trỏ head DLL trỏ đến new_node Nếu DLL không trống, ta duyệt tới node cuối DLL Thay đổi trỏ next node cuối DLL trỏ next trỏ đến new_node Làm cho node cuối DLL trở thành node trước new_node, tức làm cho trỏ prev new_node trỏ đến/bằng với node cuối DLL Ghép danh sách nối kép ngôn ngữ C: #include #include #include typedef int item; typedef struct Node { item Data; Node *Left; Node *Right; }; typedef struct DList { 10 Node *Head; Node *Tail; }; Node *GetNode(int x) { Node *P; P=new(Node); if(P==NULL) { printf("\n Khong du bo nho"); return NULL; } P->Data=x; P->Left = P->Right =NULL; return P; } void Init(DList &L) { L.Head = NULL; L.Tail = NULL; } void Addtail(DList &L, Node *new_e) { if(L.Head==NULL) { L.Head=L.Tail=new_e; } else { L.Tail->Right=new_e; L.Tail=new_e; } } void nhap(DList &L) { int i,n,x; 11 Node *P; printf("\n Nhap so luong phan tu danh sach 1: "); scanf("%d",&n); for(i=1;iRight; } } int main() { DList L; Node *P; Init(L); nhap(L); xuat(L); 12 getch(); } CHƯƠNG IV: ĐÁNH GIÁ KẾT QUẢ NGHIÊN CỨU VÀ KẾT LUẬN - Ưu điểm: xâu kép có mối liên kết hai chiều nên từ phần tử truy xuất phần tử khác Thao tác xóa node DLL hiệu có trỏ trỏ đến node cần xóa - Nhược điểm: xâu kép 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ể TÀI LIỆU THAM KHẢO Giáo trình Cấu trúc liệu giải thuật - Nxb Thống kê - Đại học kinh tế quốc dân https://cafedev.vn/ctdl-danh-sach-lien-ket-kep-doubly-linked-list-phan-1-gioi-thieu-va-chen-themnode-moi/ 13 ... trữ thông tin liệu nút + Trường trỏ: chứa địa nút hay trước II Danh sách liên kết kép (Doubly Linked List) Khái niệm - Danh sách liên kết kép danh sách mà phần tử danh sách có kết nối với phần... ? ?Cấu trúc liệu giải thuật, tài liệu từ web - Phương pháp: tìm hiểu tài liệu, từ viết chương trình, chạy thử kiểm tra độ xác chương trình CHƯƠNG II: NỘI DUNG ĐỀ TÀI I Danh sách liên kết Danh sách. .. kết Danh sách liên kết danh sách mà phần tử liên kết với nhờ vào vùng liên kết chúng, phần tử danh sách lưu trữ phần tử nhớ gồm số đơn vị nhớ gọi nút Mỗi nút có thành phần: + Trường liệu: lưu trữ

Ngày đăng: 03/11/2022, 22:07

w