Sự tự tham chi ếu của cấu trúc trong C pot

30 513 0
Sự tự tham chi ếu của cấu trúc trong C pot

Đ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

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á. 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; item1.data=‘a’; item2.data=‘b’; item3.data=‘c’; item1.link=item2.link=item3.lik=NULL; a cb Thi hành list trong C  List là 1 cấu trúc dữ liệu mà nó lưu giữ thông tin 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ó. 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; Cấp phát bộ nhớ cho 1 phần tử  Ta cần cấp phát 1 khối bộ nhớ cho mỗi 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)” Exercise 3.1  Ta thiết kế “address list”(danh sách địa 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ỳ ý. 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. 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; }; Khai báo bản ghi cấu trúc struct AddressList { struct AddressList *next; struct Address addr; };  “next”: biến con trỏ trỏ tới phần tử tiếp theo cũng có cùng cấu trúc AddressList.  “addr”: là 1 địa chỉ 3 thừa số quan trọng của 1 list  Root: đầu của list  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. Root (head) Cur NULL [...]... 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;  Exercise 3.3 Yêu c u:  List đư c sắp xếp theo thứ tự giảm dần c a điểm sinh viên  Chương trình cung c p c c ch c năng sau: - Chèn new student (khi chèn thì trư c hết fải tìm ra vị trí đúng c a student đó đã rồi mới chèn) - Tìm 1 student qua ID: trả về con trỏ -... 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  Xoá phần tử ở giữa Xoá node đang đư c trỏ bởi cur  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);  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... prev->next = cur->next; free(cur); } return root; Exercise 3.5 Sử dụng Student_Package3 .c và thêm hàm change_grade(thay đổi điểm) Hàm này nên lấy tham số là root c a list, ID c a người c điểm (grade) ta muốn thay đổi và điểm mới  Gợi ý: tạo ra 1 new student với c ng tên, ID như c nhưng c điểm mới.Sau đó loại bỏ student c đi và thêm student mới này vào sử dụng c c hàm đã c từ trư c  Solution Student... cur->next; } }  Link list : Insertion  Chèn vào trư c vị trí hiện tại: cur prev … root New_item 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)  Duyệt 1 list Thay đổi giá trị c a biến con trỏ cur trong 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  Deletion (xoá) Khi xoá... prev_std = curr_std; curr_std = curr_std->next; } prev_std->next = to_add; to_add->next = curr_std; return root; Exercise 3.4 Sử dụng Student_Package2 .c (c c bt trư c) và tạo hàm find_student() nhận vào 1 list và 1 số ID, trả về con trỏ tới student c số ID trùng khớp ở trong list đó, ho c trả về 0 nếu không tìm thấy Student *find_student(Student *root, char* id); - Gợi ý: sử dụng hàm strcmp(s1,s2)... Insertion (chèn) Chèn ngay sau vị trí hiện tại: create new_item //phần tử mới cur->next = new; cur = cur->next;  Cur … root New_item 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;... Ta muốn c thể loại bỏ student qua ID  Hàm th c hiện: remove_student()  Xem Student_Package3 .c  Loại bỏ 1 student - ở đầu list if (root == NULL) return root; cur = root; if (strcmp(cur->id, id) == 0) { root = root->next; free(cur); return root; } Loại bỏ 1 student - ở giữa list while (cur != NULL && strcmp(cur->id, id) != 0) { prev = cur; cur = cur->next; } if (cur != NULL) { prev->next = cur->next;... ID,hàm này trả về 0 nếu s1 trùng khớp s2  Solution /*tim student c ID khớp với ID đư c đưa ra*/ Student *find_student(Student *root, char* id) { Student *to_search = root;/* bắt đầu từ root c a list */ while (to_search != NULL) /* đi khắp list */ { if (strcmp(to_search->id, id) == 0) /* id giống */ return to_search; to_search = to_search->next; } /* Nếu đến đây t c là đã không tìm đư c ID khớp */ return... struct AddressList *insert (struct AddressList *root, struct Address ad, int n); struct AddressList *delete(struct AddressList *root, int n); 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; } Exercise 3.3 Xây dựng 1 chương trình quản lí sinh viên đơn giản sử dụng linked list gồm node c c u tr c. .. dụng c c hàm đã c từ trư c  Solution Student *find_student(Student* root, char* id) { Student* curr = root; while (curr != NULL && strcmp(curr->id, id) != 0) { curr = curr->next; } return curr; } Student *change_grade(Student *root, char* id, int new_grade) { Student* std = find_student(root, id); /*tạo new student*/ std = create_student(std->name, id, new_grade); root = remove_student(root, id); . 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. toán quét dữ liệu - Thuật toán chèn, xoá. 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,. chứa trong nó.  Viết hàm xoá 1 node khỏi list. 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ứ

Ngày đăng: 28/06/2014, 22:20

Từ khóa liên quan

Mục lục

  • Chủ đề

  • Sự tự tham chiếu của cấu trúc

  • Thi hành list trong C

  • Khai báo linked list

  • Cấp phát bộ nhớ cho 1 phần tử

  • Exercise 3.1

  • Exercise 3.1 (tiếp)

  • Gợi ý

  • Khai báo bản ghi cấu trúc

  • 3 thừa số quan trọng của 1 list

  • Link list : Insertion (chèn)

  • Link list : Insertion

  • Slide 13

  • Duyệt 1 list

  • Slide 15

  • Deletion (xoá)

  • Xoá phần tử ở giữa

  • Exercise 3.2

  • Giải phóng list

  • Exercise 3.3

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

Tài liệu liên quan