Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 15 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
15
Dung lượng
590,73 KB
Nội dung
4/25/2010 Chương Bài Dynamic allocation, Single linked list ĐỖ BÁ LÂM ViỆN CNTT&TT, TRƯỜNG ĐHBK HÀ NỘI Nội dung 1 Cấp phát nhớ động (Dynamic Allocation) 1.1 Khái niệm 1.2 Hàm malloc 1.3 Hàm free 2 Single linked list 2.1 Tổng quan 2.2 Các thao tác 2.3 Bài tập 1.1 Khái niệm Cấp phát động (dynamic) ? cố định (fix) Ví dụ Mảng có kích thước cố định, lưu trữ số lượng phần tử biết trước Kích thước mảng biết thời điểm dịch, khơng thể thay đổi Bạn có ln biết số phần tử thực mà mảng cần lưu? => Cấp phát động >< cấp phát cố định 4/25/2010 1.2 Hàm malloc Cú pháp void * malloc(unsigned int nbytes); Cấp phát động nBytes nhớ Thành công: trả trỏ - trỏ tới vùng nhớ cấp phát Không thành công: NULL Luôn kiểm tra xem việc cấp phát có thành cơng hay không Thư viện stdlib.h 1.2 Hàm malloc Ép kiểu (chuyển kiểu) – casing Hàm malloc void * malloc(unsigned int nbytes); Ép sang kiểu khác malloc trả void* Ví dụ p = (int *) malloc (n*sizeof(int)); cấp phát vùng nhớ chứa n số int 1.3 Hàm free free() void free(void *); Giải phóng vùng nhớ cấp phát Ví dụ: free(ptr); Nếu ptr khơng trỏ tới vùng nhớ cấp phát malloc gây lỗi run-time Ln giải phóng vùng nhớ khơng sử dụng 4/25/2010 Ví dụ Ví dụ Nhập từ bàn phím mảng số nguyên với số phần tử nhập từ bàn phím Hiển thị phần tử mảng Ví dụ Xây dựng hàm với tham số hai xâu kí tự Hàm trả trỏ trỏ tới xâu ghép từ hai xâu Hướng dẫn Ví dụ scanf(“%d”,&n); p = (int *) malloc(sizeof(int) * n); Ví dụ n1 = strlen (str1); n2 = strlen (str2); str = (char *) malloc(sizeof(char) * (n1+n2+1)); strcpy Danh sách liên kết đơn 2.1 Tổng quan 2.1.1 Khái niệm 2.1.2 Thành phần nút 2.1.3 Con trỏ đầu - head 4/25/2010 Danh sách liên kết đơn 2.2 Các thao tác 2.2.1 Khai báo danh sách 2.2.2 Cấp phát nhớ cho nút 2.2.3 Thêm nút vào sau nút 2.2.4 Loại bỏ nút danh sách 2.2.5 Duyệt danh sách 2.2.6 Giải phóng danh sách 10 2.1.1 Khái niệm Là cấu trúc liệu xác định bao gồm tập “nút” (node) chứa liệu Trong nút có liên kết đến nút „A‟ „b‟ „C‟ „Z‟ X nút 11 2.1.2 Thành phần nút Mỗi nút gồm có: Thành phần liệu - data: Chứa liệu nút (số nguyên, số thực, ký tự hay cấu trúc ) Thành phần liên kết – next: Con trỏ trỏ đến nút danh sách „C‟ data: Ký tự „C‟ Con trỏ 12 4/25/2010 2.1.2 Thành phần nút Đặc biệt: Đối với nút cuối danh sách: • next = NULL „A‟ „b‟ „C‟ „Z‟ X next = NULL 13 2.1.3 Con trỏ đầu - head Để xác định danh sách liên kết đơn ta dùng trỏ trỏ đến nút danh sách – Con trỏ đầu (head) „A‟ „b‟ „C‟ „Z‟ X head Khi danh sách rỗng: head = NULL 14 2.2.1 Khai báo danh sách B1 Định nghĩa cấu trúc “nút”: struct node { dataType data; // dataType: int, char… struct node *next; }; B2 Khai báo trỏ đầu: struct node *head; B3 Khởi tạo danh sách: head = NULL; 15 4/25/2010 2.2.2 Cấp phát nhớ cho nút Chúng ta cần cấp phát nhớ cho nút thông qua trỏ struct node *new_item; new_item = (struct node*) malloc(sizeof(struct node)); new_item->element = …; new_item->next = NULL; 16 2.2.3 Thêm nút vào sau nút head: trỏ tới đầu danh sách NULL: giá trị trỏ, cho biết đuôi danh sách cur: trỏ tới nút xem xét cur head (or root) NULL 17 2.2.3 Thêm nút vào sau nút tạo new_item; new_item → next = cur → next; cur → next = new_item; cur= cur → next; // sai cur → next = new_item; new_item → next = cur → next; cur= cur → next; cur head … new_item 18 4/25/2010 2.2.3 Thêm nút vào sau nút //Tạo danh sách new_item = (struct node * ) malloc( sizeof( struct node ) ); new_item → data = …; // khởi tạo giá trị new_item → next = NULL; if ( head == NULL ) { /* Neu danh sach rong*/ head = new_item; cur = head; } else { cur → next = new_item; cur = cur → next; // cur = new_item; } 19 2.2.4 Loại bỏ nút đầu danh sách Nếu danh sách rỗng: Thoát khỏi hàm Ngược lại head X Cho trỏ head trỏ đến phần tử trỏ Giải phóng nhớ cấp phát cho phần tử 20 2.2.4 Loại bỏ nút đầu danh sách struct node *p; if (head == NULL) return; //ds rỗng p = head; head = head → next;//ds khong rong free(p); 21 4/25/2010 2.2.5 Duyệt danh sách Giải pháp Nút cuối danh sách có thành phần next NULL Duyệt từ nút head, thông qua trường next để xác định nút thu trỏ NULL 22 2.2.5 Duyệt danh sách Thực struct node *p; p = head; while (p != NULL){ //Thao tác với p->data: hiển thị… p = p->next; } 23 2.2.6 Giải phóng danh sách Giải pháp Duyệt danh sách từ trái qua phải, loại bỏ nút Mỗi lần duyệt, phải thay đổi lại trỏ head 24 4/25/2010 2.2.6 Giải phóng danh sách to_free = head ; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 25 2.2.6 Giải phóng danh sách to_free = head ; while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 26 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 27 4/25/2010 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 28 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 29 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 30 10 4/25/2010 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 31 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 32 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 33 11 4/25/2010 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 34 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 35 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 36 12 4/25/2010 2.2.8 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 37 2.2.8 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 38 2.2.8 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 39 13 4/25/2010 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head 40 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head NULL 41 2.2.6 Giải phóng danh sách while (to_free != NULL) { head = head->next; free(to_free); to_free = head; } to_free head NULL 42 14 4/25/2010 Bài tốn quản lý sinh viên • Thơng tin sinh viên bao gồm: – MSSV: xâu ký tự, tối đa ký tự – HoTen: xâu ký tự, tối đa 30 ký tự – DiemTB: float • Tổ chức thông tin SV dạng danh sách liên kết: – Thêm thông tin sinh viên vào danh sách MSSV xâu rỗng – Viết hàm hiển thị thông tin tất SV danh sách – Giải phóng danh sách 43 Mở rộng Hàm chèn nút vào đầu danh sách Hàm xóa nút theo MSSV nhập từ bàn phím … 44 Thảo luận 45 15 ... Tổng quan 2 .1.1 Khái niệm 2 .1.2 Thành phần nút 2 .1.3 Con trỏ đầu - head 4/25/2010 Danh sách liên kết đơn 2.2 C? ?c thao t? ?c 2.2.1 Khai báo danh sách 2.2.2 C? ??p phát nhớ cho nút 2.2.3... Ký tự ? ?C? ?? Con trỏ 12 4/25/2010 2 .1.2 Thành phần nút Đ? ?c biệt: Đối với nút cuối danh sách: • next = NULL „A‟ „b‟ ? ?C? ?? „Z‟ X next = NULL 13 2 .1.3 Con trỏ đầu - head Để x? ?c định danh sách liên...4/25/2010 1.2 Hàm malloc C? ? pháp void * malloc(unsigned int nbytes); ? ?C? ??p phát động nBytes nhớ Thành c? ?ng: trả trỏ - trỏ tới vùng nhớ c? ??p phát Không thành c? ?ng: NULL Luôn kiểm tra xem vi? ?c cấp phát