Báo cáo: Danh sách liên kết pdf

34 605 0
Báo cáo: Danh sách liên kết pdf

Đ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

1 Danh Sách Liên Kết Nguyễn Thanh Hiên Danh Sách Liên Kết (Linked List) •Gồm nhiều phần tử (gọi mỗi phần tử là một node) •Các phần tử nối kết với nhau thông qua vùng liên kết •Các phần tử được try xuất tuần tự vàbao gồm: vùng dữ liệu vàcác vùng liên kết A i A node in a linked list A header node A tail node 2 Các loại danh sách liên kết •DSLK đơn •DSLK kép •DSLK vòng A 2 A 3 A N A 1 A 1 A 2 A 3 A N A 1 A 2 A 3 A N Các Tác Vụ •Khởi tạo (init) •Kiểm tra DSLK rỗng (IsEmpty) •Xác định kích thước (Size) •Chèn (Insert) •Xóa (Remove) •Tìm kiếm (Retrieve) •Thay thế (Replace) •Duyệt (Traverse) 3 DSLK Đơn-Cấu trúc dữ liệu •typedefstruct node{ T info; // T làkiểu đã định nghĩa trước struct node* link; // con trỏ chỉ đến cấu trúc node }NODE; •T làkiểu dữ liệu cơ bản hoặc kiểu dữ liệu tự định nghĩa DSLK Đơn-Cấu trúc dữ liệu •typedefstruct node { int info; struct node* link; }NODE; CTDL cho một phần tử của DS các số nguyên 4 DSLK Đơn-Cấu trúc dữ liệu •typedefstruct SinhVien { char Ten[30]; int MaSV; }SV; •typedefstruct svNode { SV info; struct svNode* link; }SVNODE; CTDL cho một phần tử của DS các sinh viên DSLK Đơn-Cấu trúc dữ liệu •typedefstruct phanso { int tu; int mau; }PS; •typedefstruct psNode { PS info; struct psNode* link; }PSNODE; CTDL cho một phần tử của DS các phân số 5 DSLK Đơn-Cấu trúc dữ liệu •typedefstruct { NODE* pHead; NODE* pTail; } LIST; pHead pTail A 1 A 2 A 3 A N DSLK Đơn-Các Tác Vụ •Khởi tạo DS void init (LIST &list){ list.pHead=NULL; list.pTail=NULL; } 6 DSLK Đơn-Các Tác Vụ • Tạo một Node mới cho DS NODE* getNode(T x){ NODE* p; p=new NODE; if (p==NULL) return NULL; p-> info = x; p-> link=NULL; return p; } x DSLK Đơn-Các Tác Vụ • Chèn một phần tử vào DS – Chèn vào đầu (insertHead) – Chèn vào cuối (insertTail) – Chèn sau phần tử q (insertMid) 7 DSLK Đơn-Các Tác Vụ • Chèn vào đầu (insertHead) A 1 A 2 A 3 A N pTail pHead x newNode (1) (2) DSLK Đơn-Các Tác Vụ • Chèn vào đầu (insertHead) void insertHead(LIST &ds, NODE* newNode) { if (ds.pHead==NULL) //ds rỗng { ds.pHead = newNode; ds.pTail = ds.pHead; } else { newNode ->link = ds.pHead; ds.pHead = newNode; } } 8 DSLK Đơn-Các Tác Vụ • Chèn vào cuối (insertTail) pHead pTail A 1 A 2 A 3 A N x (1) (2) DSLK Đơn-Các Tác Vụ • Chèn vào cuối (insertTail) void insertTail(LIST &ds, NODE *newNode) { if (ds.pHead==NULL) { ds.pHead = newNode; ds.pTail = ds.pHead; } else { ds.pTail->link = newNode; ds.pTail = newNode; } } 9 DSLK Đơn-Các Tác Vụ • Chèn sau phần tử q (insertMid) pHead pTail A 1 A 2 A 3 A N x (1)(2) q DSLK Đơn-Các Tác Vụ • Chèn sau phần tử q (insertMid) void insertMid(LIST &ds,NODE *q, NODE* newNode) { if ( q!=NULL) { newNode ->link = q-> link; q-> link = newNode; if(q == ds.pTail) ds.pTail = newNode; } else //chèn vào đầu danh sách insertHead(ds, newNode); } 10 DSLK Đơn-Các Tác Vụ • Tìm một phần tử trong DS NODE * Retrieve(LIST ds, Data k) { NODE *p; p = ds.pHead; while((p!= NULL)&&(p->info != x)) p = p->link; return p; } DSLK Đơn-Các Tác Vụ • Duyệt DS void * Traverse(LIST ds) { NODE *p; p = ds.pHead; while(p!= NULL){ process(p); p = p->link; } } [...]... k if(q != NULL) { if(p == ds.pTail) ds.pTail = q; q->link = p->link; delete p; } else //p là phần tử đầu ds { ds.pHead = p->link; if(ds.pHead == NULL) ds.pTail = NULL; } return 1; } 13 DSLK Đơn- Hủy danh sách void ReamoveList(LIST &ds) { NODE *p; while (ds.pHead!= NULL) { p = ds.pHead; ds.pHead = p->link; delete p; } ds.pTail = NULL; } DSLK Kép- Cấu trúc dữ liệu typedef struct DNode { T info; struct... q->pNext; if ( q!=NULL) { newNode->pNext = p; //(1) newNode->pPrev = q; //(2) q->pNext = newNode; //(3) if(p != NULL) p->pPrev = newNode; //(4) if(q == ds.pTail) ds.pTail = newNode; } else //chèn vào đầu danh sách InsertHead(ds, newNode); } 16 DSLK Kép- Remove • • • • • Xóa đầu Xóa cuối Xóa sau phần tử q Xóa trước phần tử q Xóa có khóa k DSLK Kép- Remove sau q void Remove(DLIST &ds, DNODE *q) { DNODE *p;... q->pNext = p->pNext; if(p == ds.pTail) ds.pTail = q; else p->pNext->pPrev = q; delete p; } } else RemoveHead(ds); } 17 STACK 21 56 31 29 179 52 Bottom_of_stack (this is where the stack started) top Danh sách hạn chế Direction in which stack grows •Các phần tử được thêm vào và lấy ra ở đỉnh stack • Hiện thực dùng dslk hoặc array Empty/unfilled portion of stack Stack – Tác vụ • • • • • Init() Push()... Stack-Ví dụ 21 56 31 29 pop() 179 52 21 56 31 29 21 56 31 29 push(2) 179 top() 179 2 top top 21 56 31 29 179 2 top Return 52 Return 2 Queue 12 31 79 front • • • • 5 63 back empty portion of the queue Danh sách hạn chế Chèn vào một đầu, lấy ra ở đầu kia Hiện thực dùng dslk hoặc array Linear and Circular Queues 20 Queue-Tác vụ • EnQueue() Input: element to be enqueued Algorithm: increment back by 1 add . 1 Danh Sách Liên Kết Nguyễn Thanh Hiên Danh Sách Liên Kết (Linked List) •Gồm nhiều phần tử (gọi mỗi phần tử là một node) •Các phần tử nối kết với nhau thông qua vùng liên kết •Các phần. try xuất tuần tự vàbao gồm: vùng dữ liệu vàcác vùng liên kết A i A node in a linked list A header node A tail node 2 Các loại danh sách liên kết •DSLK đơn •DSLK kép •DSLK vòng A 2 A 3 A N A 1 A 1 A 2 A 3 A N A 1 A 2 A 3 A N Các. link; q-> link = newNode; if(q == ds.pTail) ds.pTail = newNode; } else //chèn vào đầu danh sách insertHead(ds, newNode); } 10 DSLK Đơn-Các Tác Vụ • Tìm một phần tử trong DS NODE * Retrieve(LIST

Ngày đăng: 30/07/2014, 09:21

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan