Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 68 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
68
Dung lượng
572,91 KB
Nội dung
Cấu trúc liệu giải thuật Đỗ Tuấn Anh Email: anhdt@it-hut.edu.vn Nội dung Chương – Thiết kế phân tích (5 tiết) Chương – Giải thuật đệ quy (10 tiết) Chương – Mảng danh sách (5 tiết) Chương – Ngăn xếp hàng đợi (10 tiết) Chương – Cấu trúc (10 tiết) Chương – Tìm kiếm (5 tiết) Chương – Sắp xếp (10 tiết) Chương – Đồ thị (5 tiết) Chương – Mảng Danh sách Mảng Danh sách Một số phép toán danh sách nối đơn Các dạng khác danh sách móc nối Sử dụng danh sách móc nối – Ví dụ tốn cộng đa thức Mảng Mảng: Số phần tử cố đinh Kích thước phần tử cố định Các phần tử mảng phải kiểu Truy cập ngẫu nhiên (theo số) Mảng: Số phần tử cố định Kích thước mảng sau khai báo cố định Ví dụ: void notAllowed (); { int size; int arr[size]; /* khơng phép, kích thước mảng phải số xác định*/ printf(“Enter the size of the array: “); scanf(“%d”, &size); } Cấu trúc lưu trữ mảng double x[50]; x[0] addr x[1] x[2] x[3] … x[49] addr + 49 * sizeof(double) Mảng lưu trữ => truy cập ngẫu nhiên sử dụng số => tốc độ truy cập tất phần tử Mảng nhiều chiều double a[5][5]; a[0] a[0][0] a[0][1] a[0][2] a[0][4] a[1] a[1][0] a[1][1] a[4] a[4][0] a[4][4] a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] addr Ma trận (mảng chiều) mảng mà phần tử mảng chiều C lưu trữ mảng nhiều chiều theo thứ tự ưu tiên hàng – phần tử hàng Mảng nhiều chiều lưu trữ mảng chiều … a[4][3] a[4][4] addr + (i*5+j)*sizeof(double) Danh sách Danh sách người đến khám bệnh Ban đầu chưa có Có người đến Có người khám xong (Tạo hình ảnh động đây) Danh sách tuyến tính Một chuỗi phần tử Tồn phần tử đầu phần tử cuối Mỗi phần tử có phần tử trước phần tử sau Danh sách tuyến tính Số phần tử biến đổi Một phần tử thường cấu trúc (struct) Thao tác thường xuyên Thêm phần tử Xóa phần tử Các thao tác khác: Tìm kiếm Ghép danh sách Tách danh sách thành nhiều danh sách Sao chép danh sách Cập nhật Xóa nút Xóa nút Cur (khơng phải nút đầu cuối danh sách) (Cur->prev)->next = Cur->next; (Cur->next)->prev = Cur->prev; free (Cur); 10 20 40 Head Cur 55 70 Danh sách nối kép với nút đầu giả Danh sách không rỗng Nút đầu giả 10 20 40 Head Danh sách rỗng Nút đầu giả Head 55 70 Tạo danh sách nối kép rỗng Node* Head = malloc (sizeof(Node)); Head->next = Head; Head->prev = Head; Nút đầu giả Head Xóa nút Nút Cur cần xóa nằm đầu danh sách (Cur->prev)->next = Cur->next; (Cur->next)->prev = Cur->prev; free (Cur); Nút đầu giả 10 Head Cur 20 40 55 70 Nút cần xóa nằm ởgiữa danh sách (Cur->prev)->next = Cur->next; (Cur->next)->prev = Cur->prev; free (Cur); // giống xóa đầu DS! Nút đầu giả 10 Head 20 40 Cur 55 70 Nút cần xóa nằm cuối danh sách (Cur->prev)->next = Cur->next; (Cur->next)->prev = Cur->prev; free (Cur); // tương tự xóa DS! Nút đầu giả 10 Head 20 40 55 70 Cur void deleteNode(Node* Head, int x){ Node* Cur; Cur = FindNode(Head, x); if (Cur != NULL){ Cur->prev->next = Cur->next; Cur->next->prev = Cur->prev; free (Cur); } } Thêm nút Thêm nút New vào sau nút giả (đầu danh sách) trước nút Cur New->next = Cur; New->prev = Cur->prev; Cur->prev = New; (New->prev)->next = New; Nút giả 20 10 Head New Cur Thêm vào DS Thêm nút New vào trước nút Cur New->next = Cur; New->prev = Cur->prev; Cur->prev = New; (New->prev)->next = New; // giống thêm vào đầu! Nút giả 10 Head 20 40 New 55 Cur Thêm vào cuối DS Thêm nút New vào cuối DS (lúc Cur trỏ vào nút= giả) New->next Cur; New->prev = Cur->prev; Cur->prev = New; (New->prev)->next = New; // giống thêm vào đầu Nút giả 10 Cur Head 20 40 55 70 New Thêm vào DS rỗng Thêm New vào danh sách rỗng (Cur trỏ vào nút giả) New->next = Cur; New->prev = Cur->prev; Cur->prev = New; (New->prev)->next = New; Nút giả 20 Head Cur New void insertNode(Node* Head, int item){ Node *New, *Cur; New = malloc (sizeof(Node)); New->data = item; Cur = Head->next; while (Cur != Head){ if (Cur->data < item) Cur = Cur->next; else break; } New->next = Cur; New->prev = Cur->prev; Cur->prev = New; (New->prev)->next = New; } Sử dụng danh sách móc nối Bài tốn cộng đa thức: 5x4 + 6x3 +7 + 2x3 – 7x2 + 3x = 5x4 + 8x3 – 7x2 + 3x + Mỗi nút danh sách: nút coef exponent next Figure 3-38 Biểu diễn đa thức typedef struct poly{ float hs; float sm; struct poly *nextNode; } ... thêm vào đầu danh sách thêm vào sau phần tử đầu không thêm thêm vào đầu danh sách không thêm // // // // in danh sách xóa nút có giá trị = in danh sách hủy toàn danh sách So sánh mảng danh sách. .. đầu danh sách Do nên truyền Head theo tham biến (hoặc trả lại trỏ mới) Thêm nút Các trường hợp thêm nút Thêm vào danh sách rỗng Thêm vào đầu danh sách Thêm vào cuối danh sách Thêm vào danh sách. .. (5 tiết) Chương – Mảng Danh sách Mảng Danh sách Một số phép toán danh sách nối đơn Các dạng khác danh sách móc nối Sử dụng danh sách móc nối – Ví dụ toán cộng đa thức Mảng Mảng: Số phần tử cố