Các thao tác trên danh sách liên kết

Một phần của tài liệu KỸ THUẬT LẬP TRÌNH DANH SÁCH LIÊN KẾT (Trang 26 - 63)

liên kết Thêm phần tử Duyệt danh sách Xoá phần tử Truy xuất phần tử Xoá danh sách

Các thao tác trên danh sách liên kết

Thêm phần tử

Vào đầu danh sách Sau m t phần tử

Các thao tác trên danh sách liên kết Thêm phần tử

Vào đầu danh sách:

int AddHead(NODE* &pHead, float Data);

 Nếu danh sách r ng

• Phần tử vừa thêm là phần tử đầu danh sách

 Ngược lại,

Các thao tác trên danh sách liên kết Thêm phần tử

 Vào đầu danh sách:

 Nếu danh sách r ng if (pHead == NULL) { }  Ngược lại else {

Các thao tác trên danh sách liên kết Thêm phần tử

 Vào đầu danh sách:

int AddHead (NODE* &pHead, float Data) {

NODE *pNode;

pNode = CreateNode (Data); if (pNode == NULL) return 0; if (pHead == NULL) { pHead = pNode; } else { pNode-> pNext = ; pHead = ; } return 1; }

Các thao tác trên danh sách liên kết

Thêm phần tử

Sau m t phần tử:

int InsertAfter (NODE* &pHead, NODE *pNode, float Data);

 Nếu danh sách r ng? //sinh viên tự giải quyết

Các thao tác trên danh sách liên kết

Thêm phần tử

Sau m t phần tử:

int InsertAfter (NODE* &pHead, NODE *pNode, float Data);

 Nếu danh sách khác r ng?

• Tạo node mới có dữ liệu là Data.

• Cập nhật lại liên kết của pNode và node vừa tạo.

X

Các thao tác trên danh sách liên kết Thêm phần tử

Sau m t phần tử:

int InsertAfter (NODE* &pHead, NODE *pNode, float Data);

{

if (pNode == NULL) return 0; NODE *pNewNode;

pNewNode = CreateNode(Data); if (pNewNode == NULL) return 0; if (pHead == NULL) {

//Giả sử chèn vào đầu

} else {

pNewNode->pNext = ; pNode -> pNext = ; }

Các thao tác trên danh sách liên kết Thêm phần tử

Vào cuối danh sách:

int AddLast (NODE* &pHead, float Data);

int AddLast (NODE *& pHead, NODE* &pTail, float Data);

Các thao tác trên danh sách liên kết Duyệt danh sách

Đảm bảo việc truy xuất đến tất cả các phần tử trên danh sách

Thuật toán:

 Bắt đầu từ phần tử đầu tiên

 Trong khi chưa hết danh sách • Xử lý phần tử hiện hành

Các thao tác trên danh sách liên kết Duyệt danh sách

void Traverse (NODE *pHead)

{

NODE *pNode;

pNode = pHead;

while (pNode != NULL) {

//Làm gì đó

pNode = ; }

Các thao tác trên danh sách liên kết

Duyệt danh sách

Bài tập

 In ra tất cả các phần tử có trên danh sách liên kết

 Tính tổng giá trị các số nguyên có trên danh sách liên kết

Các thao tác trên danh sách liên kết Xoá phần tử Đầu danh sách Cuối danh sách Sau m t phần tử Theo khóa k

Các thao tác trên danh sách liên kết Xoá phần tử Đầu danh sách  Nếu danh sách r ng:  Nếu danh sách khác r ng: • Cập nhật lại pHead

• Xóa con trỏ pHead cũ

Các thao tác trên danh sách liên kết

Xoá phần tử

Đầu danh sách:

int RemoveHead (NODE* &pHead)

{ NODE *pTemp; NODE *pTemp; if(pHead==NULL) return 0; pTemp = pHead; pHead = ______________; delete ___________; return 1; }

Các thao tác trên danh sách liên kết

Xoá phần tử

Cuối danh sách:

 Cập nhật lại pTail

Các thao tác trên danh sách liên kết

Xoá phần tử

Sau m t phần tử:

int RemoveAfter (NODE* &pHead, NODE *pNode);

- Trường hợp chung: - Trường hợp đặc biệt: pNode cần xóa pNode pNode pHead

Các thao tác trên danh sách liên kết

Xoá phần tử

Sau m t phần tử:

int RemoveAfter (NODE* &pHead, NODE *pNode) {

//sv tự viết

return 1; }

Các thao tác trên danh sách liên kết

Xoá danh sách

Danh sách liên kết bao gồm các phần tử được cấp phát đ ng.

Phải xoá các phần tử trên danh sách sau khi đã sử dụng xong danh sách.

Thuật toán:

 Duyệt qua các phần tử trên danh sách

Các thao tác trên danh sách liên kết

Xố danh sách

Xóa danh sách

void RemoveList (NODE *&pHead, NODE *&pTail)

{ while (pHead!=NULL) while (pHead!=NULL) { __________ } pTail = NULL; }

Các thao tác trên danh sách liên kết Bài tập 1

Cho m t DSLK đơn, m i node trong DSLK lưu thông tin là 1 số nguyên và con trỏ đến node kế. Tạo 2 DSLK đơn mới (không phá huỷ DSLK đã cho).

 M t danh sách chứa các số lẻ của danh sách đã cho.

 M t danh sách chứa các số chẵn của danh sách đã cho.

Các thao tác trên danh sách liên kết Bài tập 1

 In ra các đường chạy tự nhiên từ DSLK đã cho:

VÍ DỤ: DSLK ban đầu biểu diễn các số: 1 5 6 4 8 3 7

In ra các dãy số: 1 5 6

4 8

Các thao tác trên danh sách liên kết Bài tập 2

Cho danh sách liên kết đơn L, lập giải thuật thực hiện các phép sau đây:

 Tính số lượng các nút của danh sách.

 Tìm tới nút thứ k trong danh sách, nếu có nút thứ k thì cho biết địa chỉ của nút đó, ngược lại trả về null.

 Bổ sung m t nút vào sau nút k.

Các thao tác trên danh sách liên kết Bài tập 2

 Cho con trỏ M trỏ tới 1 node có trong danh sách nói trên và m t danh sách đơn khác có node đầu tiên là P. Chèn danh sách P vào sau nút trỏ bởi M.

Các thao tác trên danh sách liên kết Bài tập 3

Hàm MoveToFront có tác dụng di chuyển 1 node trong xâu lên đầu xâu, như hình sau:

Chọn kiểu khai báo hàm phù hợp và viết code

void MoveToFront(NODE ฀ ฀ pHead, NODE ฀ ฀ pTail, NODE ฀ ฀ pNode )

Lưu ý: các kí hiệu ฀ có thể là *, & hoặc khoảng trắng

Các thao tác trên danh sách liên kết Bài tập 4

Quản lý thông tin sinh viên của m t lớp gồm :

 Mã sinh viên : chu i 8 ký tự .

 Tên sinh viên : chu i 20 ký tự .

 Điểm Tốn, Lý, Hố

Tổ chức cấu trúc dữ liệu thích hợp để biểu diễn các thông tin trên, và cài đặt các chức năng:

 Cập nhật lý lịch cho sinh viên (thêm, xố, sửa)

 Tìm thơng tin của m t sinh viên.

Các thao tác trên danh sách liên kết Bài tập 5

Khai báo danh sách liên kết đơn lưu trữ dữ liệu gồm:

Key : kiểu số nguyên

Value : kiểu số thực

Viết hàm rút gọn danh sách liên kết trên theo

dạng sau: nếu các phần tử có cùng khóa Key thì chỉ giữ lại m t phần tử và giá trị Value thì c ng dồn vào phần tử đó.

Các thao tác trên danh sách liên kết Bài tập 5

Khai báo danh sách liên kết đơn lưu trữ dữ liệu gồm:

Key : kiểu số nguyên

Value : kiểu số thực

Viết hàm rút gọn danh sách liên kết trên theo

dạng sau: nếu các phần tử có cùng khóa Key thì chỉ giữ lại m t phần tử và giá trị Value thì c ng dồn vào phần tử đó.

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

Nhắc lại: M i phần tử có HAI liên kết đến phần tử đứng sau và trước nó.

Các thao tác: tương tự như danh sách liên kết đơn.

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

Chèn vào đầu danh sách

int AddHead(DNODE *& pHead, DNODE *& pTail, float Data)

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

Chèn vào cuối danh sách

int AddTail(DNODE *& pTail, float Data)

- Bước 1: - Bước 2: - Bước 3:

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

Chèn sau m t phần tử:

int AddAfter(DNODE *& pHead, DNODE *pNode, float Data)

int AddAfter(DNODE *& pTail, DNODE *pNode,

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

Chèn trước m t phần tử:

int AddBefore(DNODE *& pHead, DNODE *pNode, float Data)

int AddBefore(DNODE *& pTail, DNODE *pNode, float Data)

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

Hủy m t phần tử đứng sau m t phần tử cho trước

int RemoveAfter(DNODE *& pHead, DNODE *pNode) int RemoveAfter(DNODE *& pTail, DNODE *pNode)

Danh sách liên kết kép Các thao tác Duyệt danh sách

Truy xuất 1 phần tử trong danh sách Xóa danh sách

Các thao tác trên danh sách liên kết kép Bài tập 6

Cho DSLK kép L mà m i node có lưu thơng tin là m t số nguyên. Viết hàm loại bỏ tất cả các node có thơng tin là giá trị K cho trước.

62 62 62

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

Nhắc lại: có mối liên kết giữa phần tử cuối và phần tử đầu

HCMUS - 2009 Bài giảng Cấu trúc dữ liệu

– Văn Chí Nam – Nguyễn Thị Hồng Nhung – Đặng

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

Một phần của tài liệu KỸ THUẬT LẬP TRÌNH DANH SÁCH LIÊN KẾT (Trang 26 - 63)

Tải bản đầy đủ (PDF)

(69 trang)