1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Lecture 7 linked list

13 55 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 705,32 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài 7Danh sách liên kết Linked List 1 Vấn đề của Mảng Xét lại vấn đề sử dụng mảng để tạo danh sách : Thêm phần tử : On Xoá phần tử : On Xoá phần tử : On Số phần tử mảng cố định!!!... Cần

Trang 1

Bài 7

Danh sách liên kết

(Linked List)

1

Vấn đề của Mảng

Xét lại vấn đề sử dụng mảng để tạo danh sách : Thêm phần tử : O(n)

Xoá phần tử : O(n)

Xoá phần tử : O(n)

Số phần tử mảng cố định!!!

Trang 2

Vấn đề của Mảng

Làm sao có thể thêm (hay xoá) một phần tử mà

không phải di chuyển các phần tủ khác?

Làm sao để danh sách “động” hơn?

Cần dùng một cấu trúc lưu trữ mới với các yêu cầu Các phần tử phải được tách rời ra

3

Và được nối với nhau bằng “dây liên kết”

Khi thêm phần tử chỉ cần thay đổi mối đây liên kết chi phí xử lý sẽ thấp hơn

Mô hình cấu trúc dữ liệu trừu tượng Linked List

là một dãy các vị trí lữu trữ các đối tượng với số

lượng tùy ý.

DANH SÁCH LIÊN KẾT

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

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

lượng tùy ý.

Nó thiết lập một mối quan hệ trước/sau giữa các

vị trí

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

Trang 3

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

Các nút (node) được cài đặt bao

gồm:

Phần tử lưu trữ trong nó next

Phần tử lưu trữ trong nó

Một liên kết đến nút kế tiếp

Sử dụng môt con trỏ header , trỏ vào

node đầu danh sách và con trỏ

trailer trỏ vào node cuối danh sách.

elem

node trailer

5

elem

NULL

Cấu trúc của một Node

Các thuộc tính

Element * elem ;

Node * next ;

Node * next ;

Các phương thức

Node * getnext () - Trả lại địa chỉ của nút kế tiếp

Element * getElem () - Trả lại địa chỉ của phần tử mà nút

trỏ tới trong nút void setNext (Node *) - Đặt thuộc tính next trỏ đến đ/c

phần tử là đối của phương thức void setElem (Element e) - Đặt phần tử e vào nút

Trang 4

Cấu trúc danh sách liên kết đơn

Các thuộc tính:

Node * header

Các phương thức cập nhật:

void replace(Node *p, Element e)

Node * header

Node * trailer

Các phương thức

chung:

long size(),

int isEmpty()

Các phương thức

truy cập:

void replace(Node *p, Element e) Node *insertAfter(Node *p, Element e) Node * insertFirst(Element e)

Node * insertLast(Element e) Node * getNode(int i)

void remove(Node *p)

7

truy cập:

Node *first()

Node *last()

Insertion First

Hình ảnh phép toán insertFirst(), phép toán trả lại vị trí q

header

trailer

NULL

trailer

NULL

header

X q X

trailer

NULL

header

X

q

Trang 5

Insertion Last

Hình ảnh phép toán insertLast(), phép toán trả lại vị trí q

header

trailer

NULL

NULL

trailer

NULL

header

X

NULL

q

9

trailer

NULL

header

A

Insertion After

Hình ảnh phép toán insertAfter(p, X), phép toán trả lại vị trí q

header

trailer

NULL

p

NULL

trailer

NULL

header

X

trailer

NULL

header

A

X

Trang 6

Hình ảnh phép toán remove(p)

trailer

NULL

trailer

NULL

header

NULL

A

X

p

11

X

header

trailer

NULL

Bài tập về nhà

Xây dựng lớp ứng dụng sử dụng lớp Danh sách liên kết đơn để lưu trữ 1 danh sách sinh viên Mỗi sinh viên gồm các thông tin sau: MaSv, Hoten, Ngay, Thang, Nam sinh, gioi tinh, que quan.

Lớp có các chức năng sau:

- Thêm một sinh viên vào cuối DS

- Thêm một sinh viên vào đầu DS

- Xóa bỏ một sinh viên thứ i khỏi DS

- Thay thế sinh viên thứ i bằng một sinh viên mới

- Thay thế sinh viên thứ i bằng một sinh viên mới

Xây dựng chương trình để chạy lớp ứng dụng

Trang 7

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

Các nút (node) được cài đặt

bao gồm:

Phần tử lưu trữ trong nó

Một liên kết đến nút trước nó

Một liên kết đến nút trước nó

Một liên kết đến nút kế tiếp

Có hai nút đặc biệt là trailer và

trailer

n

13

Elem

Cấu trúc của một Node

Các thuộc tính

• Element *elem;

Node *next, *pre;

• Node *next, *pre;

Các phương thức

• Node *getnext() - Trả lại địa chỉ của nút kế tiếp

• Node *getPre() - Trả lại địa chỉ của nút trước đó

• Element *getElem() - Trả lại địa chỉ của phần tử lưu trong nút

• void setNext(Node *) - Đặt thuộc tính Next trỏ đến đ/c của

phần tử là đối của phương thức

• void void setPre(Node *) setPre(Node *) - Đặt thuộc tính Prior trỏ đến đ/c của - Đặt thuộc tính Prior trỏ đến đ/c của

phần tử là đối của phương thức

• void setElem(Element e) - Đặt phần tử e vào nút

Trang 8

Cấu trúc Danh sách liên kết kép

Các thuộc tính:

Node * header

Node * trailer

Các phương thức cập nhật:

void replace(Node *p, e) Node *insertAfter(Node *p, Elemnt e)

Node * trailer

Các phương thức

chung:

long size(),

int isEmpty()

Các phương thức

truy cập:

Node *first()

Node *insertAfter(Node *p, Elemnt e) Node *insertBefore(Node *p, Element e) Node * insertFirst(Element e)

Node * insertLast(Element e) Node * getNode(int i)

void remove(Node *p)

15

Node *first()

Node *last()

Insert First

Hình ảnh phép toán insertFirst(X), phép toán trả lại vị trí q

q

X

p q

Trang 9

Insert Last

Hình ảnh phép toán insertLast( X), phép toán trả lại vị trí q

17

X

q

Insert After

Hình ảnh phép toán insertAfter(p, X), phép toán trả lại vị trí q

p

p

q

X

Trang 10

Thuật toán Insert After

Algorithm insertAfter ( p,e ): //Bổ sung phần tử e vào sau

// phần tử nút p Tạo ra một nút mới q

q -> setElement( e ) //Đặt gia trị e vào nút q

q -> setNext(p->getNext()) //liên kết với phần tử sau nó

p getNext()->setPrev(q) //Liên kết phần tử sau p với q

q -> setPrev(p) //liên kết q với phần tử trước nó

p -> setNext(q) //liên kết p với q

19

p -> setNext(q) //liên kết p với q

return q // trả lại vị trí của q

Insert Before

Hình ảnh phép toán insertBefore(p, X), phép toán trả lại vị trí q

p

p q

X

Trang 11

Xóa - Remove

Hình ảnh minh họa phép toán remove(p), ở đây p = last()

p

21

D

Thuật toán remove

Algorithm remove(Node *p):

//kết nối phần tử trước p với phần tử sau p

p->getPre()->setNext(p->getNext())

//kết nối phần tử sau p với pần tử trước p

p->getNext()->setPre(p -> getPre ())

//bỏ kết nối p với phần tử trước nó

p setPre(NULL)

p.setNext(NULL)

p.setNext(NULL)

delete p

Trang 12

So sánh mảng và DSLK

Mảng

Bộ nhớ sử dụng lưu trữ phụ

thuộc vào việc cài đặt chứ

không phải số lượng thực sự

Danh sách liên kết

Bộ nhớ sử dụng để lưu trữ tương ứng với số lượng các phần tử thực

sự cần lưu tai bất kỳ thời điểm không phải số lượng thực sự

cần lưu

Mối quan hệ giữa phần tử

đầu và các phần tử khác là

rất ít

Các phần tử được sắp xếp

cho phép tìm kiếm rất nhanh

Việc chèn và xóa phần tử đòi

hỏi phải di chuyển các phần

tử

sự cần lưu tai bất kỳ thời điểm nào

Sử dụng một con trỏ để lưu phần

tử đầu, từ đó đi đến các phần tử khác

Việc bổ sung và xóa bỏ các phần

tử không phải di chuyển các phần tử

Truy nhập đến các phần tử chỉ có thể thực hiện được bằng cách đi

23

tử thể thực hiện được bằng cách đi

dọc theo chuỗi mắt xích từ phần tử đầu Vì vậy đối với danh sách liên kết đơn thì thời gian tìm kiếm một phần tử sẽ là O(n)

Bài tập: 17h00 11/11/2015

- Xây dựng lớp Node

- Xây dựng lớp DblList

- Xây dựng lớp DblItr //Lớp bộ lặp

- Xây dựng lớp DblItr //Lớp bộ lặp

- Xây dựng lớp ứng dụng sử dụng lớp Danh sách liên

kết đôi để lưu trữ 1 danh sách sinh viên Mỗi sinh

viên gồm các thông tin sau: MaSv, Hoten, Ngay,

Thang, Nam sinh, gioi tinh, que quan.

Lớp có các các chức năng sau:

- Thêm một sinh viên vào cuối DS

- Thêm một sinh viên vào đầu DS

- Thêm một sinh viên vào đầu DS

- Xóa bỏ sinh viên thứ i khỏi DS

- Thay thế sinh viên thứ i bằng một sinh viên mới

Xây dựng chương trình để chạy lớp ứng dụng

Trang 13

25

Ngày đăng: 04/11/2019, 23:58

TỪ KHÓA LIÊN QUAN