Bài giảng Cấu trúc danh sách (List)
lượt xem 6
download
Khái niệm danh sách, phép toán trên danh sách, các phép toán trên danh sách, cài đặt danh sách bằng mảng,... là những nội dung chính trong bài giảng "Cấu trúc danh sách - List". Mời các bạn cùng tham khảo nội dung bài giảng để nắm bắt nội dung chi tiết.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Cấu trúc danh sách (List)
- CẤU TRÚC DANH SÁCH (LIST) Bộ môn Công nghệ phần mềm Khoa Công nghệ thông tin & Truyền thông Đại học Cần Thơ
- KHÁI NIỆM DANH SÁCH Là tập hợp hữu hạn các phần tử có cùng kiểu Kiểu chung được gọi là kiểu phần tử (element type) Ta thường biểu diễn dạng: a1, a2, a3, ..., an Nếu • n=0: danh sách rỗng • n>0: phần tử đầu tiên là a1, phần tử cuối cùng là an Độ dài của danh sách: số phần tử của danh sách Các phần tử trong danh sách có thứ tự tuyến tính theo vị trí xuất hiện. Ta nói ai đứng trước ai+1 (i=1..n-1)
- PHÉP TOÁN TRÊN DANH SÁCH MAKENULL_LIST(L): khởi tạo danh sách rỗng EMPTY_LIST(L): kiểm tra danh sách rỗng. FIRST(L): vị trí phần tử đầu tiên END_LIST(L): vị trí sau phần tử cuối. INSERT_LIST(X,P,L): xen phần tử X vào vị trí P trong danh sách L. DELETE_LIST(P,L): xóa phần tử ở vị trí P trong danh sách L.
- PHÉP TOÁN TRÊN DANH SÁCH PREVIOUS(P,L): vị trí của phần tử đứng trước phần tử P trong danh sách L. NEXT(P,L): vị trí của phần tử đứng sau phần tử P trong danh sách L RETRIEVE(P,L): giá trị phần tử ở vị trí P. LOCATE(X,L): xác định vị trí phần tử X trong danh sách L.
- VÍ DỤ void SORT(LIST L) { Position p,q; //kiểu vị trí của các phần tử trong danh sách p= FIRST(L); //vị trí phần tử đầu tiên trong danh sách while (p!=ENDLIST(L)) { q=NEXT(p,L); //vị trí phần tử đứng ngay sau phần tử p while (q!=ENDLIST(L)) { if (RETRIEVE(p,L) > RETRIEVE(q,L)) swap(p,q); // hoán đổi nội dung 2 phần tử q=NEXT(q,L); } p=NEXT(p,L); } }
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Dùng 1 mảng để lưu trữ liên tiếp các phần tử, bắt đầu từ vị trí đầu tiên. Ta phải ước lượng số phần tử tối đa của danh sách. Ta phải lưu trữ độ dài hiện tại của danh sách (last).
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Mô hình lưu trữ: Chỉ số 0 1 … Last-1 … Maxlength-1 Nội dung Phần tử 1 Phần tử 2 … Phần tử cuối … Vị trí của một phần tử trong danh sách là chỉ số của mảng tại vị trí lưu trữ phần tử đó + 1
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Khai báo: #define MaxLength ... //Độ dài tối đa của danh sách typedef ... ElementType; //kiểu của phần tử trong danh sách typedef int Position; //kiểu vị trí cuả các phần tử typedef struct { ElementType Elements[MaxLength]; //mảng chứa các phần tử của danh sách Position Last; //giữ độ dài danh sách } List; List L;
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Khởi tạo danh sách rỗng: void MakeNull_List(List *L) { L->Last = 0; }
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Kiểm tra danh sách rỗng ? int Empty_List(List L){ return L.Last == 0; }
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Xen một phần tử vào danh sách Nếu mảng đầy thì thông báo lỗi Ngược lại, nếu vị trí p không hợp lệ thì báo lỗi Ngược lại: • Dời các phần tử từ vị trí p đến cuối danh sách ra sau một vị trí • Đưa phần tử mới x vào tại vị trí p • Độ dài danh sách tăng 1
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Xen một phần tử vào vị trí 3
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Xen một phần tử vào danh sách void Insert_List(ElementType X,Position P, List *L){ if (L->Last==MaxLength) printf("Danh sach day"); else if ((PL->Last+1)) printf("Vi tri khong hop le"); else { Position Q; /*Dời các phần tử từ vị trí p đến cuối dsách ra sau 1 vị trí*/ for(Q=(L->Last-1)+1;Q>P-1;Q--) L->Elements[Q]=L->Elements[Q-1]; //Đưa x vào vị trí p L->Elements[P-1]=X; //Tăng độ dài danh sách lên 1 L->Last++; } }
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Xóa một phần tử Nếu p là một vị trí không hợp lệ thì thông báo lỗi Ngược lại: • Dời các phần tử từ vị trí p+1 đến cuối danh sách ra trước một vị trí • Độ dài của danh sách giảm 1
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Xóa phần tử ở vị trí 4
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG void Delete_List(Position P,List *L){ if (EmptyList(*L)) printf("Danh sach rong!"); else if ((PL->Last)) printf("Vi tri khong hop le"); else { Position Q; /*Dời các phần tử từ vị trí p+1 đến cuối danh sách ra trước 1 vị trí*/ for(Q=P-1;QLast-1;Q++) L->Elements[Q]=L->Elements[Q+1]; L->Last--; } }
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Xác định vị trí sau phần tử cuối trong danh sách Position End_List(List L){ return L.Last+1; } Xác định vị trí đầu tiên trong danh sách Position First(List L){ return 1; } Xác định nội dung phần tử tại vị trí P trong dsách ElementType Retrieve(Position P,List L){ return L.Elements[P-1]; }
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Tìm kiếm phần tử Position Locate(ElementType X, List L){ Position P; int Found = 0; P = First(L); //vị trí phần tử đầu tiên /*trong khi chưa tìm thấy và chưa kết thúc danh sách thì xét phần tử kế tiếp*/ while ((P != EndList(L)) && (!Found)) if (Retrieve(P,L) == X) Found = 1; else P = Next(P, L); return P; }
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Ví dụ: Nhập danh sách từ bàn phím void Read_List(List *L) { int i,N; ElementType X; MakeNull_List(L); printf("So phan tu danh sach N= ");scanf("%d",&N); for(i=1;i
- CÀI ĐẶT DANH SÁCH BẰNG MẢNG Ví dụ: In danh sách ra màn hình void Print_List(List L){ Position P; P = First(L); while (P != End_List(L)) { printf("%d ",Retrieve(P,L)); P = Next(P, L); } printf("\n"); }
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Cấu trúc dữ liệu và thuật toán - Chương 6: Danh sách liên kết
149 p | 403 | 67
-
Bài giảng Cấu trúc dữ liệu và giải thuật - TS. Ngô Hữu Dũng
273 p | 204 | 11
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 4 - ThS. Trịnh Quốc Sơn (ĐH Công nghệ Thông tin)
78 p | 103 | 11
-
Bài giảng Cấu trúc dữ liệu và giải thuật - Danh sách liên kết đơn (List)
78 p | 123 | 10
-
Bài giảng Cấu trúc dữ liệu: Chương 5 - Nguyễn Xuân Vinh
20 p | 87 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 5 - ThS. Trịnh Quốc Sơn (ĐH Công nghệ Thông tin)
20 p | 67 | 9
-
Bài giảng Cấu trúc dữ liệu và giải thuật 1: Chương 5
20 p | 44 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Array List & Linked List - TS. Trần Ngọc Việt
71 p | 22 | 6
-
Bài giảng Cấu trúc dữ liệu và thuật toán - Chương 3: Cấu trúc dữ liệu động
40 p | 100 | 5
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Doubly/Circular linked list - TS. Ngô Hữu Dũng
35 p | 85 | 5
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 6 - Châu Thị Bảo Hà
99 p | 93 | 5
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 3 - ThS. Nguyễn Hà Giang
91 p | 71 | 5
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 4 - Trường ĐH Công nghệ Thông tin
79 p | 27 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 3 - Đỗ Ngọc Như Loan
84 p | 51 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 5 - Trường ĐH Công nghệ Thông tin
37 p | 39 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật - Giới thiệu môn học
13 p | 61 | 2
-
Bài giảng Cấu trúc dữ liệu: Danh sách liên kết - TS. Lê Minh Trung & Th.S Lương Trần Ngọc Khiết
32 p | 24 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn