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