Professional Documents
Culture Documents
Mảng
– Mảng:
z Một tập các cặp (index, item)
z Với mỗi giá trị của index sẽ có một giá trị tương ứng của item.
– Các phép toán với cấu trúc mảng
z Create(j, list) : tạo mảng có j chiều, list là một j-bộ với phần tử
thứ k của list là kích thước chiều thứ k của mảng.
z Retrieve(A,i) : Trả ra giá trị của phần tử nhận chỉ số i nếu có
z Store(A,i,x) : Trả ra một mảng giống như mảng A đã cho ban
đầu, chỉ khác là một cặp (i,x) đã được bổ sung vào vị trí đúng
– Cài đặt
z Sử dụng một phần bộ nhớ liên tiếp
Mảng 1 chiều
– Khởi tạo
z Cần chỉ ra số phần tử của mảng
z Trong C: <kiểu dữ liệu của phần tử ><tên biến>[size]
– int list[5];
– char word[25];
– Tham chiếu
z Các phần tử trong mảng 1 chiều được tham chiếu đến sử
dụng địa chỉ được tính
– int list [5] Æ list[0] base address = α
list[1] α + sizeof(int)
list[2] α + 2*sizeof(int)
list[3] α + 3*sizeof(int)
list[4] α + 4*size(int)
Mảng 1 chiều
Mảng 2 chiều
– Khai báo
z Cần chỉ ra số hàng, số cột
z Trong C : <kiểu phần tử> <tên biến> [size1] [size2]
– int table[4][5];
z Truy xuất một phần tử
– table[i][j]
– Lưu trữ mảng 2 chiều trong bộ nhớ máy tính
z Theo thứ tự ưu tiên hàng
z Theo thứ tự ưu tiên cột
Mảng 2 chiều
– Lưu trữ mảng 2 chiều theo thứ tự ưu tiên hàng
z int a[4][3]
a00 a01 a02 a10 a11 a12 a20 a21 a22 a30 a31 a32
Mảng 2 chiều
– Lưu trữ mảng 2 chiều theo thứ tự ưu tiên cột
a00 a10 a20 a30 a01 a11 a21 a31 a02 a12 a22 a32
A
0 1 2 i last max-1
– Thực hiện các phép toán bổ sung các phần tử mới và loại bỏ
các phần tử cũ khá tốn kém
z Tại sao?
A
0 1 2 p last
A
0 1 2 p last
A x
0 1 2 p last
Procedure INSERT-LIST(L,last, x, p)
{ L là danh sách được lưu trữ dưới dạng mảng, x là giá trị phần tử mới, p là vị trí
phần tử mới, L có số tối đa là max phần tử , last là chỉ số phần tử cuối cùng
trong danh sách }
1. {Danh sách đã đầy} if (last >= max) then ERROR;
2. {Kiểm tra giái trị p} else if (p > last +1) OR (p <1) then ERROR;
3. else
begin {Dịch chuyển các phần tử, tạo ô trống để bổ sung}
for i: = last down to p do L[i+1]:= L[i];
{Lưu giá trị mới vào vị trí thứ r}
L[p] := x;
last:= last+1; {Số lượng phần tử trong danh sách tăng thêm 1}
end.
End
A x
0 1 2 p last
A
0 1 2 p last
A
0 1 2 p last
Function DELETE-LIST(L, p)
{ Loại bỏ phần tử ở vị trí p trong danh sách kế tiếp L. L có tối đa max
phần tử , hiện tại phần tử cuối cùng ở vị trí last}
1. {Kiểm tra p} if (p > last +1) OR (p <1) then ERROR;
2. {Dồn các phần tử ở đuôi danh sách lên trên 1 vị trí}
for i:= p to last-1 do
S[i] := S[i+1];
last:= last-1;
3. return.
– Bài tập tại lớp: Hãy viết giải thuật xác định chỉ số của phần tử x
cho trước trong danh sách L : Locate(L,x)
A B C D
5 4 2 1 3
5
ANH 4 COÂNG 2 HIEÄP 1 MA ÏNH 3 THAÉNG
– Bổ sung vào một vị trí xác định trước: Hãy bổ xung thêm
một nút mới có thông tin là X vào sau một nút trong danh
sách được trỏ tới bởi con trỏ M
L M
Danh saù ch
B C G H
ban ñaà u
L M
Danh saù ch B C G H
sau khi boå
sung phaà n töû X
L M
Danh saùc h
B C G H
ban ñaàu
L M
Danh saùc h
sau khi loaïi B C G H
boû phaàn töû
sau M
Danh saù ch
B D G E
ban ñaà u
Q
C G H
P T
C G H
info nút
– Trường PREV của nút đầu tiên và trường NEXT của nút
cuối cùng đều có giá trị NULL
– Cần nắm được hai con trỏ, con trỏ L trỏ tới nút cực trái, con
trỏ R trỏ tới nút cực phải của danh sách
– Với danh sách rỗng , L = R = NULL
L B C G H R
L B C G H R
R
L B C G H
L B C G H R
B C G H R
L
z Giải thuật loại bỏ một phần tử khỏi danh sách nối kép
Procedure DELETE-DOUBLE (L, R, M)
{Loại bỏ phần tử trỏ bởi M }
1. {Danh sách rỗng}
if L= R= NULL then return;
2. {Loại bỏ}
if L= R and L = M then L:=R:= NULL;
else if M = L then begin L:= NEXT(L); PREV(L) := NULL; end;
else if M = R then begin R:= PREV(R); NEXT(R) := NULL; end;
else begin NEXT(PREV(M)) :=NEXT(M); PREV(NEXT(M)) := PREV(M);
end;
call Dispose(M);
3. return.
L B C G H
z Trường LINK chỉ tới nút chứa phần tử đầu tiên của danh sách
z Tồn tại một con trỏ HEAD trỏ tới nút đầu này
B C G H
HEAD
Nuù t ñaà u
danh saù c h
– Danh sách có nút đầu không bao giờ rỗng về mặt hình thức
HEAD
– Bài tập : Viết giải thuật thực hiện các thao tác sau
z Loại bỏ phần tử trỏ bởi T trong danh sách nối vòng có nút
đầu
z Thêm một phần tử vào đằng trước phần tử trỏ bởi T trg
danh sách nối vòng có nút đầu
A( x ) = 2 x 8 − 5 x 7 + 3 x 2 + 4 x − 7
B( x) = 6 x 8 + 5 x 7 − 2 x 6 + x 4 − 8 x 2
z …
– Ví dụ: Đa thức A(x) ở trên sẽ được lưu trữ trong một vector
A gồm 9 phần tử như sau
0 0 -8 0 1 0 -2 5 6
– Ví dụ:
A( x ) = 2 x 8 − 5 x 7 + 3 x 2 + 4 x − 7
B ( x) = 6 x 8 + 5 x 7 − 2 x 6 + x 4 − 8 x 2
A
2 8 -5 7 3 2 4 1 -7 0
B
6 8 5 7 -2 6 1 4 -8 2
Procedure ADD-POLY2(A, B, C)
Begin
1. p:= A; q:=B;
≠
2. call New(C) ; d:= C; {d trỏ vào nút cuối cùng của C}
3. while p <> NULL and q <> NULL do
case
EXP(p) = EXP(q): x := COEF(p) + COEF(q) ;
if x<>0 then call ATTACH(x, EXP(p), d) ;
p:= LINK(p) ; q:= LINK(q);
EXP(p) > EXP(q): call ATTACH(COEF(p), EXP(p),d);
p:= LINK(p);
EXP(p) < EXP(q): call ATTACH(COEF(q), EXP(q),d);
q:= LINK(q);
end case; {Còn tiếp}
end ;
6. {Kết thúc danh sách tổng} LINK(d) := NULL;
7. {Cho con trỏ C trỏ tới danh sách tổng}
t:= C; C:= LINK(t); call dispose(t);
8. return.