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

đề tài danh sách liên kết

18 599 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 18
Dung lượng 422,73 KB

Nội dung

Lợi thế chủ yếu của một danh sách liên kết so với một mảng thông thường là danh sách các phẩn tử có thể dễ dàng được thêm hoặc xoá mà không cần thiết lập lại vị trí hay cách tổ chức của

Trang 1

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

CƠ SỞ TẠI THÀNH PHỐ HÀ NỘI

KHOA CÔNG NGHỆ THÔNG TIN

_o0o _

BÁO CÁO CHUYÊN ĐỀ CÔNG NGHỆ PHẦN MỀM

Đề tài:

Danh sách liên kết

Giáo viên hướng dẫn: Nguyễn Mạnh Sơn Sinh viên thực hiện: Nguyễn Quốc Dũng

Mã sinh viên: B14LDCN008

Lớp: L14CNPM

Hà Nội – 2/2016

Trang 2

MỤC LỤC

Chương 1: Tổng quan về danh sách liên kết 1

1 Giới thiệu danh sách liên kết 1

2 Ưu điểm và nhược điểm 2

2.1 Ưu điểm 2

2.2 Nhược điểm 2

Chương 2: Các loại danh sách liên kết và các thuật ngữ liên quan 3

1 Các loại danh sách liên kết 3

1.1 Danh sách liên kết đơn 3

1.2 Danh sách liên kết kép 3

1.3 Danh sách liên kết vòng 3

2 Các thuật ngữ liên quan 4

2.1 Nút giả (Dummy node) 4

2.2 Danh sách trống (Empty lists) 4

2.3 Trường liên kết (Hash linking) 4

3 So sánh giữa các loại cấu trúc dữ liệu danh sách 4

3.1 Danh sách liên kết và mảng động 4

3.2 Danh sách liên kết kép và đanh sách liên kết đơn 5

3.3 Danh sách liên kết vòng và danh sách liên kết đơn 6

3.4 Danh sách liên kết đơn và danh danh sách khác 6

Chương 3: Các thao tác trên danh sách liên kết 8

1 Thêm một nút vào đầu danh sách 9

2 Duyệt danh sách 10

3 Thêm một nút vào cuối danh sách 10

4 Chèn vào sau một nút trong danh sách 11

5 Chèn vào trước một nút trong danh sách 11

6 Xóa một nút trong danh sách 12

Chương 4: Xây dựng chương trình sử dụng danh sách liên kết bằng java 14

KẾT LUẬN 15

TÀI LIỆU THAM KHẢO 16

Trang 3

1

NỘI DUNG CHUYÊN ĐỀ

Chương 1: Tổng quan về danh sách liên kết

1 Giới thiệu danh sách liên kết

Danh sách liên kết là danh sách tuyến tính các phần tử dữ liệu mỗi phân tử dữ liệu được gọi là các điểm nút, các điểm nút liên kết với nhau giông như con trỏ

Danh sách liên kết là một cấu trúc dữ liệu bao gồm một tập các nút đứng cạnh như một chuỗi Mỗi một nút bao gồm dữ liệu và một liên kết tới nút kết tiếp trong chuỗi Cấu trúc này cho phép thêm hoặc xoá một cách hiệu quả các phẩn tử tại bất kỳ vị trí nào trong chuỗi

Ví dụ:

Hình 1: Một danh sách liên kết đơn, mỗi nút chứa hai trường: một giá trị nguyên và một liên kết tới

nút tiếp theo

Danh sách liên kết là một trọng những cấu trúc dữ liệu đơn giản và phổ biến nhất Chúng được sử dụng để thực hiện một số kiểu dữ liệu trừu tượng phổ biến khác như lists, stack, queues, Tuy nhiên, nó rất ít được dùng để thực hiện các cấu trúc dữ liệu khác một cách trực tiếp nếu không sử dụng một danh sách như một sự thực thi cơ sở

Lợi thế chủ yếu của một danh sách liên kết so với một mảng thông thường là danh sách các phẩn tử có thể dễ dàng được thêm hoặc xoá mà không cần thiết lập lại vị trí hay cách tổ chức của toàn bộ cấu trúc bởi vì các thành phần dữ liệu không được lưu trữ kề nhau trong bộ nhớ, trong khi một mảng phải được khải báo trong mã nguồn trước khi dịch và chạy chương trình Danh sách liên kết cho phép chèn hoặc xoá các nút tại bất kỳ vị trí nào trong danh sách và có thể thực hiện như thế với một số thao tác nhất định nếu liên kết trước đó với liên kết được thêm vào hoặc xoá đi được duy trì

Danh sách liên kết ngay bản thân nó không cho phép truy cập một cách ngẫu nhiên vào dữ liệu hoặc bất kỳ dạng chỉ số nào Do đó, rất nhiểu thao tác cơ bản như lấy

ra nút cuối cùng của danh sách hay tìm kiểm một nút với điểu kiện nào đó hay thiết đặt

Trang 4

vị trí cho một nút mới… có thể cần phải duyệt hầu hết hoăc toàn bộ các phần tử trong danh sách

2 Ưu điểm và nhược điểm

2.1 Ưu điểm

- Danh sách liên kết là một cấu trúc dữ liệu động, có thể tăng lên hoặc bớt đi, cấp phát hoặc thu hồi bộ nhớ trong khi chương trình đang chạy

- Thao tác chèn và xoá các nút được thực hiện một cách dễ dàng

- Các cấu trúc tuyến tính như Stacks và queues được thực thi một cách dễ dàng trong một danh sách liên kết

- Chúng có thể giảm thời gian truy cập và có thể mở rộng theo thời gian thực mà không cần bộ nhớ bộ nhớ được chỉ định

2.2 Nhược điểm

- Chúng có xu hướng sử dụng thêm bộ nhớ do con trỏ yêu cầu thêm không gian lưu trữ

- Các nút trong danh sách liên kết phải được đọc một cách thứ tự từ đầu danh sách

- Các nút lưu trữ không kề nhau, do đó làm tăng thời gian truy cập vào một phần tử đơn

lẻ trong danh sách

- Khó khăn khi thực hiện duyệt ngược danh sách

- Bộ nhớ heap hạn chế

Trang 5

Chương 2: Các loại danh sách liên kết và các thuật ngữ

liên quan

1 Các loại danh sách liên kết

1.1 Danh sách liên kết đơn

Danh sách liên kết đơn bao gồm các phần tử có mối liên hệ với nhau Mỗi phần

tử đó là một nút, mỗi nút có một trường dữ liệu chứa thông tin và một trường liên kế chứa địa chỉ của nút kế tiếp trong danh sách hoặc lưu trữ giá trị Null nếu phần tử đó nằm cuối danh danh sách Các thao tác có thể được thực hiện trên danh sách liên kết đơn bao gồm thêm, xoá và duyệt nút

Ví dụ:

Hình 2: Danh sách liên kết đơn, mỗi nút chứa hai trường: một giá trị nguyên và một liên kết tới nút

tiếp theo

1.2 Danh sách liên kết kép

Danh sách liên kết bao gồm các phần tử có mối liên hệ với nhau Mỗi phần tử đó

là một nút, mỗi nút có một trường dữ liệu chứa thông tin và hai trường liên kết chứa địa chỉ của nút kế tiếp đứng trước và sau nó trong danh sách

Ví dụ:

Hình 3: Danh sách liên kết kép, mỗi nút chứa ba trường: Một giá trị nguyên, một liên kết với nút đứng

trước và một liên kết với nút đứng sau

Rất nhiều hệ điều hành hiện nay sử dụng danh sách liên kết kép để duy trì các tham số trong các tiến trình hoạt động, luồng và một số đối tượng động khác

1.3 Danh sách liên kết vòng

Trang 6

Danh sách liên kết vòng là một danh sách đơn (hoặc kép) mà phần tử cuối danh sách thay vì mang giá trị Null, trỏ tới phần tử đầu danh sách

Ví dụ:

HÌnh 4: Danh sách liên kết vòng

2 Các thuật ngữ liên quan

2.1 Nút giả (Dummy node)

Nút giả là một nút được thiết kế để sử dụng trong danh sách liên kết và cây tại điểm kết thúc Nó không chứa bất kỳ dữ liệu nào được quản lý bởi cấu trúc dữ liệu

Việc sử dụng có rất nhiểu ưu điểm nhu tăng tốc độ thao tác, giảm độ phức tạp của thuật toán và chiểu dài code, làm cấu trúc dữ liệu trở lên mạnh mẽ hơn

2.2 Danh sách trống (Empty lists)

Danh sách trống là danh sách không chứa một bản ghi dữ liệu nào khi nút giả đang được sử dụng, danh sách, danh sách được gọi là trống khi chỉ có nút giả

2.3 Trường liên kết (Hash linking)

Trường liên kết không phải là một phần của nút Nếu bản ghi dữ liệu được lưu trữ trong một mảng và được tham chiếu thông qua chỉ số thì trường liên kết có thể được lưu trữ trong một mảng riêng với chỉ số giống như chỉ sổ của bản ghi dữ liệu

3 So sánh giữa các loại cấu trúc dữ liệu danh sách

3.1 Danh sách liên kết và mảng động

Mảng động là một cấu trúc dữ liệu cấp phát tất cả các phần tử liên tiếp trong bộ nhớ và cố định số phần tử hiện tại Nếu không gian hiện có cho mảng động bị đầy, nó

sẽ cấp phát lại và có thể sao chép các phần tử

Danh sách liên kết có một số ưu điểm hơn mảng động chèn thêm hoặc xoá một phần tử tại một vị trí nào đó trong danh sách, giả sử chúng ta đã định chỉ số của con trỏ tới nút đó (trước vị trị cần xoá hoặc cần chèn thêm) rồi, nó là một thao tác với thời gian không đổi, trong khi việc chèn trong mảng động tại vị trí ngẫu nhiên sẽ yêu cầu di chuyển trung bình một nửa số phần tử và tất cả các phần tử trong trường hợp xấu nhất Trong

Trang 7

khi có thể xoá một phần tử từ một mảng trong thời gian không đổi bởi cách nào đó đánh dấu chỗ đó một chỗ trống, đây là nguyên nhân gây ra sự phân mảnh, nó sẽ cản trở việc thực hiện các vòng lặp

Ngoài ra, rất nhiểu phần tử được thêm vào trong một danh sách liên kết chỉ bị giới hạn bởi tổng bộ nhớ khả dụng; trong khi một mảng động sẽ lấp đầy cấu trúc dữ liệu mảng của nó và sẽ phải cấp phát lại, thậm trí là không thể cấp phát lại nếu bộ nhớ bị phân mảnh, mặc dù chi phí cấp phát lại lớn hơn việc chèn và chi phí chèn khi cấp phát lại sẽ được trừ dần O(1) Điểu này sẽ giúp việc gắn thêm phần tử tại cuối mảng, nhưng việc chèn (hoặc xoá) vào vị trí giữa vẫn kéo theo những chi phí trái phép của dữ liệu di chuyển để duy trì một mảng có nhiểu phẩn tử được xoá có thể được đưa trở lại kích thước yêu cầu để tránh lãng phí quá nhiểu bộ nhớ

Mảng động (cũng như cấu trúc dữ liệu mảng cố định) cho phép truy cập ngẫu nhiên với khoảng thời gian không đổi, trong khi danh sách liên kết chỉ cho phép truy cập tuần tự các phần tử Trong thực tế, danh sách liên kết đơn có thể dễ dàng được duyệt chỉ trong một đường, nên nó làm cho danh sách liên kết không phù hợp với các ứng dụng mà cần tìm kiếm các phần tử bằng chỉ số của nó nhanh chóng Truy cập các mảng hay mảng động nhanh hơn danh sách liên kết trên nhiểu máy bởi vì chúng được tối ưu

vị trí tham chiếu và như vậy rất hữu ích để giấu dữ liệu

Một nhược điểm của danh sách liên kết là bộ lưu trữ thêm cần thiết cho tham chiếu cái đó thường làm cho chúng không thực tế cho danh sách các mục dữ liệu nhỏ như ký tự hoặc giá trị boolean, bởi vì bộ lưu trữ cho các liên kết có thể vượt gấp nhiều lần dữ liệu Ngược lại, một mảng động chỉ yêu cầu khoảng trống cho dữ liệu của nó (và một số lượng rất nhỏ dữ liệu điểu khiển) Nó có thể chậm và với một bộ cấp phát kém

để cấp phát bộ nhớ cho mỗi phần tử, một vấn chung được giải quyết việc sử dụng bể bộ nhớ (memory pools)

Một vài giải pháp biến thể cố kết hợp hai ưu điểm của hai loại danh sách này Danh sách liên kết mở (Unrolled linked list) lưu trữ một số phần tử trong mỗi nút danh sách, tăng khả năng lưu trữ và giảm bộ nhớ chỉ định cho tham chiếu

3.2 Danh sách liên kết kép và đanh sách liên kết đơn

Danh sách liên kết kép yêu cầu nhiểu không gian cho mỗi nút, các thao tác cơ bản của chúng mất nhiều chi phí hơn Nhưng chúng lại dễ dàng hơn để thao tác bằng tay bởi vì chúng cho phép truy cập tuần tự nhanh và dễ dàng hơn từ tất cả các chiểu Một danh sách liên kết kép có thể chèn thêm hoặc xoá một nút trong một số thao tác nhất định nếu cho địa chỉ của nút Để làm tương tự trong danh sách liên kết đơn, ta phải có

Trang 8

địa chỉ của con trỏ tới nút đó, nó là chỉ dẫn cho toàn bộ danh sách (trong trường hợp nó

là nút đầu tiên ) hoặc là trường liên kết trong nút trước Một vài thuật toán yêu cầu truy cập từ tất cả các chiểu Mặt khác danh sách liên kết kép không cho phép chi sẻ đoạn cuối danh sách (tail-sharing) và không thể được sử dụng như cấu trúc dữ liệu bền vững

3.3 Danh sách liên kết vòng và danh sách liên kết đơn

Một danh sách liên kết vòng có thể được dùng để miêu tả một mảng như là vòng tròn trong thực tế, ví dụ: các góc của một đa giác, một bộ nhớ đệm được sử dụng và giải phóng trong thứ tự FIFO (Fisrt In, First Out)… Trong các ứng dụng này, một con trỏ tới bất kỳ nút nào dùng làm chỉ dẫn tới toàn bộ danh sách

Với dánh sách liên kết vòng, một con trỏ tới nút cuối cùng cũng cho sự truy cập

dễ dàng như ở nút đầu tiên bằng một liên kết tiếp theo Do vậy, trong ứng dụng yêu cầu truy cập từ tất các đầu của danh sách (ví dụ: thực hiện hàng đợi), một cấu trúc vòng cho phép ta điểu khiển cấu trúc bởi một con trỏ duy nhất

Một danh sách vòng có thể được tách thành hai danh sách vòng trong khoảng thời gian cố định bằng việc cho biết địa chỉ của nút cuối cùng của mỗi vòng Thao tác bao gồm trao đổi thông tin các trường liên kết của hai nút Thực hiện thao tác tương tự với bất kỳ hai nút trong hai danh sách riêng biệt, ghép hai danh sách đó thành một Đặc tính này rất đơn giản trong một số cấu trúc dữ liệu và giải thuật

Sự miêu tả đơn giản nhất cho một danh sách vòng trống là con trỏ null, nó cho biết rằng danh sách không có nút Không có con trỏ null, rất nhiểu thuật toán phải kiểm tra trường hợp đặc biệt này và làm việc với nó theo cách khác Ngược lại, sử dụng null

để biểu thị danh sách đơn trống là tự nhiên hơn và xảy ra các trường hợp đặc biệt ít hơn

3.4 Danh sách liên kết đơn và danh danh sách khác

Trong khi danh sách liên kết kép và danh sách liên kết vòng có những ưu điểm hơn danh sách liên kết đơn Nhưng danh sách liên kết đơn cũng có những ưu điểm làm cho chúng thích hợp hơn trong một số trường hợp

Một danh sách liên kết đơn là một cấu trúc dữ liệu đệ quy, bởi vì nó chứa một con trỏ tới một đối tượng nhỏ hơn cùng kiểu Chính vì lý do đó, rất nhiểu thao tác trên danh sách liên kết đơn (như ghép hai danh sách, liệt kê các phần tử trong đảo thứ tự) thường có những thuật toán đệ quy rất đơn giản, đơn giản hơn bất kỳ giải pháp nào sử dụng câu lệnh lặp Trong khi những giải pháp đệ quy này có thể sửa lại cho phù hợp với danh sách liên kết kép và liên kết vòng, nhưng các thủ tục cần thêm những tham số và các trường hợp cơ bản phức tạp hơn

Trang 9

Danh sách liên kết đơn cũng cho phép chia sẻ đoạn cuối danh sách (tail-sharing),

Cụ thể, nếu một nút được thêm vào tại vị trí bắt đầu danh sách, thì danh sách cũ vẫn duy trì như là đoạn cuối của danh sách mới

Trang 10

Chương 3: Các thao tác trên danh sách liên kết

Trong Java bạn được phép định nghĩa một class (B) bên trong một class (A) khác Class A được gọi là outer class và class B được gọi là inner class Mục đích của inner class là được sử dụng bên trong như một class hỗ trợ Dưới đây là LinkedList class với inner Node class

private static class Node<AnyType>

{

private AnyType data;

private Node<AnyType> next;

public Node(AnyType data, Node<AnyType> next)

{

this.data = data;

this.next = next;

}

}

Một inner class là một thành viên của class chứa nó và có truy cập tới thành viên khác của outer class outer class có thể có một truy cập trực tiếp tới tất cả thành viên trong inner class Một inner class có thể được khai báo private, public, protected hoặc package private Có hai kiểu inner class: static và non-static Một static inner class không thể chuyển trực tiếp tới biến instance hoặc phương thức được định nghĩa bên trong outer class của nó: Nó có thể sử dụng chúng qua đối tượng tham chiếu

Chúng ta thực thi LinkedList class với hai inner class: static Node class và non-static LinkedListIterator class

public Iterator<AnyType> iterator()

{

return new LinkedListIterator();

}

private class LinkedListIterator implements Iterator<AnyType>

{

private Node<AnyType> nextNode;

public LinkedListIterator()

{

nextNode = head;

Trang 11

}

public boolean hasNext()

{

return nextNode != null;

}

public AnyType next()

{

if (!hasNext()) throw new NoSuchElementException();

AnyType res = nextNode.data;

nextNode = nextNode.next;

return res;

}

public void remove() { throw new UnsupportedOperationException(); } }

Giả sử ta có danh sách liên kết đơn và theo thứ tự mỗi bước thực hiện bên dưới Danh sách đó được lưu trữ trạng thái khởi tạo của nó trước mỗi dòng thực thi

1) head = head.next;

2) head.next = head.next.next;

3) head.next.next.next.next=head;

1 Thêm một nút vào đầu danh sách

Phương thức tạo một nút và thêm vào trước nút bắt đầu của danh sách

Ngày đăng: 11/07/2016, 22:36

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w