Xem mẫu

  1. Chủ đề Sự tự tham chiếu của cấu trúc trong C   Cấu trúc dữ liệu danh sách liên kết đơn (single linked list), danh sách liên kết đôi (double linked list): -Khởi tạo, thi hành. -Thuật toán quét dữ liệu -Thuật toán chèn, xoá.
  2. Sự tự tham chiếu của cấu trúc 1 hoặc nhiều thành phần của nó là con trỏ tới chính  nó. struct list { char data; struct list *link; }; list item1, item2, item3; a b c item1.data=‘a’; item2.data=‘b’; item3.data=‘c’; item1.link=item2.link=item3.lik=NULL;
  3. Thi hành list trong C là 1 cấu trúc dữ liệu mà nó lưu giữ thông tin  List tổng quát về vị trí của phần tử tiếp theo.  Các phần tử của “single linked list ” chỉ có vị trí tiếp theo  Trong C con trỏ được sử dụng để trỏ tới phần tử tiếp theo.  Array(mảng): ta có thể truy nhập ở bất kì vị trí nào trong mảng ngay lập tức.  Linked list: ta có thể thay đổi số phần tử dữ liệu của nó.
  4. Khai báo linked list typedef ... elementtype;//kiểu dữ liệu phần tử typedef struct node{ elementtype element; node* next; }; node* root; node* cur; Hoặc: typedef ... elementtype; struct node{ elementtype element; struct node* next; }; struct node* root; struct node* cur;
  5. Cấp phát bộ nhớ cho 1 phần tử cần cấp phát 1 khối bộ nhớ cho mỗi  Ta node(phần tử) qua 1 con trỏ. struct node * new; new = (struct node*) malloc(sizeof(structnode)); new->element = … new->next = null; • new->addr có nghĩa là (*new).addr. • “con trỏ biến cho bản ghi cấu trúc” ->”tên trường (field)”
  6. Exercise 3.1 thiết kế “address list”(danh sách địa  Ta chỉ) cho các số điện thoại di động .  Phải tạo 1 bản ghi cấu trúc gồm có name, phone number và email address.  Phải tạo 1 chương trình có thể giải quyết với số lượng dữ liệu tuỳ ý.
  7. Exercise 3.1 (tiếp)  Tạo 1 danh sách liên kết đơn chứa danh sách phone address.  Viết 1 hàm insert 1 phần tử vào list ngay sau phần tử hiện thời, sử dụng nó để thêm node vào list  Viết 1 hàm duyệt toàn bộ list và in ra thông tin chứa trong nó.  Viết hàm xoá 1 node khỏi list.
  8. Gợi ý  Bạn có thể tổ chức các phần tử và cấu trúc dữ liệu theo bản ghi cấu trúc AddressList sau.Bạn tự định nghĩa 1 cấu trúc (Address) để chứ thông tin về địa chỉ. struct AddressList { struct AddressList *next; struct Address addr; };
  9. Khai báo bản ghi cấu trúc struct AddressList { struct AddressList *next; struct Address addr; }; biến con trỏ trỏ tới phần tử tiếp  “next”: theo cũng có cùng cấu trúc AddressList.  “addr”: là 1 địa chỉ
  10. 3 thừa số quan trọng của 1 list đầu của list  Root:  NULL:giá trị của con trỏ.nó báo hiệu kết thúc của list.  Cur: biến con trỏ lưu giữ phần tử hiện tại. Cur Root (head) NULL
  11. Link list : Insertion (chèn) ngay sau vị trí hiện tại:  Chèn create new_item //phần tử mới cur->next = new; cur = cur->next; Cur … root New_item
  12. Link list : Insertion Chèn ngay sau vị trí hiện tại  new = ( struct AddressList * ) malloc( sizeof(struct AddressList ) ); new->addr = addr; new->next = NULL; if ( root == NULL ) { /* nếu không có phần tử nào */ root = new; cur = root; } else { cur->next = new; cur = cur->next; } }
  13. Link list : Insertion vào trước vị trí hiện tại:  Chèn cur prev … root New_item
  14. Duyệt 1 list  for ( cur = root; cur != NULL; cur = cur- >next ) { showAddress( cur->addr, stdout ); } //showAddress là hàm in ra dữ liệu (tự viết)
  15. Duyệt 1 list đổi giá trị của biến con trỏ cur trong  Thay dãy  Các biến này được gọi là “biến lặp”  Hoàn thành duyệt khi giá trị cur = NULL
  16. Deletion (xoá) xoá phần tử đầu tiên:  Khi del=root; root = del->next; free(del);  Khi xoá phần tử đầu tiên, ta chuyển con trỏ root tới vị trí next được chỉ ra bởi del.
  17. Xoá phần tử ở giữa node đang được trỏ bởi cur.  Xoá  Xác định prev là con trỏ tới node ngay trước node cần xoá.  Sau đó thực hiện: prev->next = cur->next; free(cur);
  18. Exercise 3.2  Tạo hàm insert, delete với tham số n (nguyên) chỉ ra vị trí của node bị tác động đến. Vị trí đầu tiên là 0 - n = 1: thêm phần tử vào sau phần tử đầu tiên. - n = 2: thêm phần tử vào sau phần tử thứ 2. - struct AddressList *insert (struct AddressList *root, struct Address ad, int n); struct AddressList *delete(struct AddressList *root, int n);
  19. Giải phóng list to_free = root ;//to_free là biến lặp lưu vị trí node ta giải phóng while (to_free != NULL) { root = root->next; free(to_free); to_free = root; }
  20. Exercise 3.3 dựng 1 chương trình quản lí sinh viên đơn  Xây giản sử dụng linked list gồm node có cấu trúc như sau: typedef struct Student_t { char id[ID_LENGTH]; char name[NAME_LENGTH]; int grade; struct Student_t *next; } Student;
nguon tai.lieu . vn