Giả sử chúng ta phụ trách xây dựng một hệ thống thư viện giám sát và truy vấn các hoạt động khác nhau tại thư viện. Bây giờ chúng tôi được yêu cầu triển khai ba lệnh khác nhau để thực hiện những điều sau -
-
Bằng cách sử dụng lệnh 1, chúng ta có thể ghi lại việc chèn một cuốn sách có y trang ở giá x.
-
Bằng cách sử dụng lệnh 2, chúng ta có thể in số trang của cuốn sách thứ y ở giá x.
-
Bằng cách sử dụng lệnh 3, chúng ta có thể in số lượng sách trên giá x.
Các lệnh được cung cấp cho chúng ta dưới dạng một mảng 2D ở định dạng này {command type, x, y}. Nếu không có giá trị y, giá trị sẽ mặc định là 0. Chúng tôi in kết quả của các lệnh đã cho.
Vì vậy, nếu đầu vào giống như số kệ =4, truy vấn =4, input_arr ={{1, 3, 23}, {1, 4, 128}, {2, 3, 0}, {3, 4, 0 }}; thì đầu ra sẽ là
23 1
Command 1 inserts a book with 23 pages on shelf 3. Command 2 inserts a book with 128 pages on shelf 4. Command 3 prints the page number of book 0 on shelf 3. Command 4 prints the number of books on shelf 3.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- b:=một mảng mới có kích thước s
- p:=một mảng mới có kích thước s
- để khởi tạo i:=0, khi i
- b [i]:=0
- p [i]:=một mảng mới
qtype:=q_array [loopCount, 0] nếu qtype giống 1, thì -
- x:=q_array [loopCount, 1]
- y:=q_array [loopCount, 2]
- b [x]:=b [x] + 1
- p [x]:=giải quyết định vị đối tượng được trỏ bởi p [x] và trả về một con trỏ có kích thước
- b [x]
- p [x, b [x] - 1] =y
ngược lại khi qtype giống như 2, thì -
- x:=q_array [loopCount, 1]
- y:=q_array [loopCount, 2]
- in (p [x, y])
Mặt khác
- x:=q_array [loopCount, 1]
- in (b [x])
- phân bổ bộ nhớ có được bởi b
- phân bổ bộ nhớ mà p [i] có được
- phân bổ bộ nhớ có được bởi p
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#include <stdio.h> #include <stdlib.h> void solve(int s, int q, int q_array[][3]) { int* b; int** p; b = (int*)malloc(sizeof(int)*s); p = (int**)malloc(sizeof(int*)*s); for(int i = 0; i < s; i++) { b[i] = 0; p[i] = (int*)malloc(sizeof(int)); } int loopCount; for(loopCount = 0; loopCount < q; loopCount++) { int qtype; qtype = q_array[loopCount][0]; if (qtype == 1) { int x, y; x = q_array[loopCount][1]; y = q_array[loopCount][2]; b[x] += 1; p[x] = realloc(p[x], b[x]*sizeof(int)); p[x][b[x] - 1] = y; } else if (qtype == 2) { int x, y; x = q_array[loopCount][1]; y = q_array[loopCount][2]; printf("%d\n", p[x][y]); } else { int x; x = q_array[loopCount][1]; printf("%d\n", b[x]); } } if (b) free(b); for (int i = 0; i < s; i++) if (p[i]) free(p[i]); if (p) free(p); } int main() { int input_arr[][3] = {{1, 3, 23}, {1, 4, 128}, {2, 3, 0}, {3, 4, 0}}; solve(4, 4, input_arr); }
Đầu vào
int input_arr[][3] = {{1, 3, 23}, {1, 4, 128}, {2, 3, 0}, {3, 4, 0}}; solve(4, 4, input_arr);
Đầu ra
23 1