Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 103 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
103
Dung lượng
873 KB
Nội dung
CHƯƠNG DANH DANH SÁCH SÁCH (( LIST_ADT) LIST_ADT) Mục tiêu Sau học xong chương này, sinh viên: Hiểu cấu trúc liệu động Nắm vững kiểu liệu trừu tượng List-ADT Cài đặt kiểu liệu ngơn ngữ lập trình cụ thể Ứng dụng kiểu liệu trừu tượng toán thực tế Nội Dung Cấu trúc liệu động List-ADT Cài đặt danh sách kề Cài đặt danh sách liên kết đơn Cài đặt danh sách liên kết kép Biến Tĩnh Được khai báo tường minh, có tên gọi CẤU TRÚC DỮ LIỆU ĐỘNG Tồn phạm vi khai báo Được cấp phát stack Kích thước khơng đổi => khơng tận dụng hiệu nhớ Ví dụ : int x,y; char c; float f[5]; Khi biết nhu cầu sử dụng đối tượng trước thực xử lý : dùng biến khơng động Ví Dụ Hạn Chế Của Biến Tinh CẤU TRÚC DỮ LIỆU ĐỘNG Tổ chức danh sách lớp học Dùng mảng tĩnh : typedef struct { char ten[20]; int maso; }Hocvien; Hocvien danhsach[50]; Số lượng học viên lãng phí Số lượng học viên > 50 => thiếu chỗ Biến Động CẤU TRÚC DỮ LIỆU ĐỘNG Không khai báo tường minh, khơng có tên gọi Xin cần, giải phóng sử dụng xong Được cấp phát heap Linh động kích thước Vấn đề: biến động khơng có tên gọi tường minh, thao tác? CẤU TRÚC DỮ LIỆU ĐỘNG Kiểu trỏ Kiểu trỏ dùng lưu địa đối tượng liệu khác Biến thuộc kiểu trỏ Tp biến mà giá trị địa cuả vùng nhớ ứng với biến kiểu T, giá trị NULL Khai báo C : typedef int intpointer *intpointer; p; Bản thân biến trỏ không động Dùng biến trỏ để lưu giữ địa biến động => truy xuất biến động thông qua biến trỏ CẤU TRÚC DỮ LIỆU ĐỘNG Các thao tác kiểu trỏ Tạo biến động cho trỏ ‘p’ đến nó: void* malloc(size); void* calloc(n,size); new // hàm cấp phát nhớ C++ Hủy biến động p đến : Hàm free(p) huỷ vùng nhớ cấp phát hàm malloc calloc p trỏ tới Hàm delete p huỷ vùng nhớ cấp phát hàm new p trỏ tới Sử dụng biến tinh, trỏ biến động Biến không động x CẤU TRÚC DỮ LIỆU ĐỘNG int x; x=5; int *p; Biến trỏ p 0xFF p = new(int); *p = 0xFF Biến động có địa 0xFF Kiểu danh sách Danh sách = { phần tử có kiểu} CẤU TRÚC DỮ LIỆU ĐỘNG Danh sách kiểu liệu tuyến tính: Mỗi phần tử có nhiều phần tử đứng trước Mỗi phần tử có nhiều phần tử đứng sau Là kiểu liệu quen thuộc thực tế: Danh sách học sinh Danh mục sách thư viện Danh bạ điện thoại Danh sách nhân viên công ty … 10 DANH SÁCH LIÊN KẾT KÉP Cài đặt tác vụ ds lk kép Tác vụ MakeNull_List: Khởi tạo ds lk kép void MakeNull_List(List *plist) { *plist = NULL; } Tác vụ Empty_List: Kiểm tra ds rỗng? int Empty_List(List *plist) { return *plist==NULL; } 89 DANH SÁCH LIÊN KẾT KÉP Cài đặt tác vụ ds lk kép Tác vụ listsize: Xác định số nút có ds lk kép int listsize(List *plist) { List p=*plist; int n=0; while(p!=NULL) { p=p->right; n++: } return n; } 90 DANH SÁCH LIÊN KẾT KÉP Cài đặt tác vụ ds lk kép Tác vụ nodepointer: Xác định trỏ nút thứ i (i=0, 1, …) List nodepointer(List *plist, int i) { List p=*plist; int vitri=0; while(p!=NULL && vitriright; vitri++: } return p; } 91 DANH SÁCH LIÊN KẾT KÉP Cài đặt tác vụ ds lk kép Tác vụ push: Thêm nút có nd x vào đầu ds lk void push(List *plist, int x) { List p; p=getnode(); p->info=x; if(*plist==NULL) //truong hop ds rong { p->left=NULL; p->right=NULL; *plist=p; } else { p->right=*plist; (*plist)->left=p; p->left=NULL; *plist = p; } } 92 Thêm Nút Vào Đầu Danh Sách • Minh họa hình vẽ DANH SÁCH LIÊN KẾT KÉP plist A B X 93 C D DANH SÁCH LIÊN KẾT KÉP Cài đặt tác vụ ds lk kép Tác vụ insertright: Thêm nút có nd x vào sau nút p void insertright(List p, int x) { List q,r; //q la nut can them, p truoc, r sau if(p==NULL) coutright; r->left=q; //tao lk giua r va q q->right=r; q->left=p; p->right=q; } } 94 Cài đặt tác vụ ds lk kép DANH SÁCH LIÊN KẾT KÉP Minh họa thêm nút X vào sau nút p plist p r=p->right A B C q->left=p r->left=q p->right=q q->right=r X q 95 D DANH SÁCH LIÊN KẾT KÉP Cài đặt tác vụ ds lk kép Tác vụ insertleft Thêm nút có nd x vào trước nút p void insertleft(List p, int x) { List q,r; //q la nut can them, p sau, r truoc if(p==NULL) coutleft r->right=q; //tao lk giua r va q q->left=r; q->right=p; p->left=q; } } 96 Cài đặt tác vụ ds lk kép DANH SÁCH LIÊN KẾT KÉP Minh hoạ thêm nút vào trước nút p plist p r=p->left A B C r->right=q q>right=p q->left=r p->left=q X q 97 D Cài đặt tác vụ ds lk kép DANH SÁCH LIÊN KẾT KÉP Tác vụ pop: Xóa nút đầu ds lk kép void pop(List *plist) { List p; if(empty(plist)) coutright; (*plist)->left=NULL; freenode(p); } } 98 Cài đặt tác vụ ds lk kép DANH SÁCH LIÊN KẾT KÉP Tác vụ delnode: Xóa nút p ds lk kép void delnode(List *plist, List p) { List q,r; if(p==NULL) coutright=r freenode(p); } } } 99 Cài đặt tác vụ ds lk kép DANH SÁCH LIÊN KẾT KÉP Tác vụ printright: duyệt xuôi ds lk kép void printright(List *plist) { List p; if(empty(plist)) cout