34
Chương 2. Mảng và Danh sách Chương 2. Mảng và Danh sách 2.1. 2.1. Các khái niệm Các khái niệm 2.2. 2.2. Cấu trúc lưu trữ kế tiếp của mảng Cấu trúc lưu trữ kế tiếp của mảng 2.3. 2.3. Lưu trữ kế tiếp danh sách tuyến tính Lưu trữ kế tiếp danh sách tuyến tính 2.4. 2.4. Lưu trữ móc nối Lưu trữ móc nối danh sách tuyến tính danh sách tuyến tính

Chg2 danh sach

Embed Size (px)

Citation preview

Chương 2. Mảng và Danh sáchChương 2. Mảng và Danh sách

2.1. 2.1. Các khái niệmCác khái niệm2.2. 2.2. Cấu trúc lưu trữ kế tiếp của mảngCấu trúc lưu trữ kế tiếp của mảng2.3. 2.3. Lưu trữ kế tiếp danh sách tuyến tínhLưu trữ kế tiếp danh sách tuyến tính2.4. 2.4. Lưu trữ móc nốiLưu trữ móc nối danh sách tuyến tínhdanh sách tuyến tính

2.1. Mảng và danh sách2.1. Mảng và danh sáchMảngMảng Danh sáchDanh sách

Có thứ tựCó thứ tự Có thứ tựCó thứ tự

Có số phần tử cố địnhCó số phần tử cố định Số phần tử biến độngSố phần tử biến động

Các phép toánCác phép toán

Tạo lập (Create)Tạo lập (Create) Tạo lập (Create)Tạo lập (Create)

Tìm kiếm (Search)Tìm kiếm (Search) Tìm kiếm (Search)Tìm kiếm (Search)

Cập nhật (Update)Cập nhật (Update) Cập nhật (Update)Cập nhật (Update)

Bổ xung phần tử(Insert)Bổ xung phần tử(Insert)

Loại bỏ phần tử (delete)Loại bỏ phần tử (delete)

Ghép, tách , sắp xếpGhép, tách , sắp xếp Ghép, tách , sắp xếpGhép, tách , sắp xếp

Cấu trúc lưu trữ của mảng một chiềuCấu trúc lưu trữ của mảng một chiều Đặc điểm lưu trữ: Lưu trữ kế tiếp Đặc điểm lưu trữ: Lưu trữ kế tiếp

trong một số từ máy cố định.trong một số từ máy cố định....a[1] a[2] ... a[i] a[n]

Công thức tính địa chỉ mảng một chiều.Công thức tính địa chỉ mảng một chiều. Loc(a[i]) = LLoc(a[i]) = L00+ c * (i – b)+ c * (i – b) trong đó b là chỉ số phần tử đầutrong đó b là chỉ số phần tử đầu c là số từ máy dành cho một phần tửc là số từ máy dành cho một phần tử LL00 là địa chỉ phần tử đầu b. là địa chỉ phần tử đầu b.

...a[b] a[b+1] ... a[i] a[b+n-1]

L0

c từ máy

Lưu trữ mảng hai chiều Lưu trữ mảng hai chiều a[b1..M,b2..N]a[b1..M,b2..N]

(Kích thước m x n) ưu tiên dòng. (Kích thước m x n) ưu tiên dòng. m = M-b1+1 ; n = N – b2 +1m = M-b1+1 ; n = N – b2 +1

b1, b2 b1, b2+1 ... b1,j b1,N

b1+1, b2 b1+1, b2+1 ... b1+1, j .. b1+1, n

... ... ... ... .. ...

i , b2 i, b2+1 ... i, j .. i, n

.. .. ... .. . ...

M, b2 M, b2+1 ... M, j ... M , N

Đổi chỉ số mảng 2 chiều m dòng, n cột Đổi chỉ số mảng 2 chiều m dòng, n cột a[b1..b1+m-1,b2+n-1] a[b1..b1+m-1,b2+n-1] (ưu tiên dòng)(ưu tiên dòng) sang mảng một chiều sang mảng một chiều c[0..m*n-1]c[0..m*n-1]

CC b2b2 b2+1b2+1 .. jj b2+n-1b2+n-1

b1b1 00 11 .. j-b1j-b1 .... n-1n-1

b1+1b1+1 nn n+1n+1 .. n+j-b1n+j-b1 2n-12n-1

...... ...... ...... .. ...... .... ......

ii n.(i-b1)n.(i-b1) n(i-b1)+1n(i-b1)+1 .. n(i-b1)+(j-b2)n(i-b1)+(j-b2) .... n(i-b1+1)-1n(i-b1+1)-1

.... .... .... .. .... .. ......

b1+m-1b1+m-1 n.(m-1)n.(m-1) n.(m-1)+1n.(m-1)+1 n.(m-1)+(j-b1)n.(m-1)+(j-b1) n.m-1n.m-1

Công thức đổi chỉ số: Id(i,j) = n(i-b1)+(j-b2)Công thức đổi chỉ số: Id(i,j) = n(i-b1)+(j-b2)

Ví dụ tính địa chỉ các phần tử của mảng Ví dụ tính địa chỉ các phần tử của mảng hai chiều 3 dòng 4 cột a[2..4,-1..2] hai chiều 3 dòng 4 cột a[2..4,-1..2]

-1-1 00 11 22

22 00 11 22 33

33 44 55 66 77

44 88 99 1010 1111

b1=2, b3 = -1 ; m = 3, n =4, a[2,-1] ở địa chỉ Lb1=2, b3 = -1 ; m = 3, n =4, a[2,-1] ở địa chỉ L00

Tra bảng ta có: Phần tử a[3,0] quy đổi địa chỉ về mảng một chiều bắt Tra bảng ta có: Phần tử a[3,0] quy đổi địa chỉ về mảng một chiều bắt đầu từ 0 là 5. Do đó địa chỉ của phần tử a[3,0] là Loc(3,0) =Lđầu từ 0 là 5. Do đó địa chỉ của phần tử a[3,0] là Loc(3,0) =L00 + 5c. + 5c.

Hoặc tính theo công thức Hoặc tính theo công thức Id(i,j) = n(i-b1)+(j-b2) = 4(3-2)+(0-(-1))= 4+1 = 5Id(i,j) = n(i-b1)+(j-b2) = 4(3-2)+(0-(-1))= 4+1 = 5

rồi tính Loc(3,0) =Lrồi tính Loc(3,0) =L00 +Id(3,0)*c = L +Id(3,0)*c = L00 + 5c. + 5c.

Sử dụng mảng để lưu trữ danh sách Sử dụng mảng để lưu trữ danh sách tuyến tínhtuyến tính

Khai báo một mảng một chiều có n Khai báo một mảng một chiều có n phần tử với n = max(m)phần tử với n = max(m)

Nhược điểm : khó ước lượng max(m)Nhược điểm : khó ước lượng max(m) Nhược điểm : lãng phí bộ nhớ Nhược điểm : lãng phí bộ nhớ

2.2. 2.2. Lưu trữ móc nối với danh Lưu trữ móc nối với danh sách tuyến tínhsách tuyến tính

2.2.1. 2.2.1. Danh sách móc nối đơnDanh sách móc nối đơn2.2.2. 2.2.2.

Các phép toán trên danh sách móc nối Các phép toán trên danh sách móc nối đơnđơn

2.2.3. 2.2.3. Danh sách nối vòngDanh sách nối vòng2.2.4. 2.2.4. Danh sách nối képDanh sách nối kép2.2.5. 2.2.5. Áp dụngÁp dụng

2.2

2.2.1. 2.2.1. Cấu trúc một nút và phương pháp mối Cấu trúc một nút và phương pháp mối nối đơn cho danh sách tuyến tính:nối đơn cho danh sách tuyến tính:

Mỗi phần tử trong danh sách lưu trữ bằng một nút Mỗi phần tử trong danh sách lưu trữ bằng một nút (node). (node).

Mỗi nút gồm một số từ máy kế tiếpMỗi nút gồm một số từ máy kế tiếp Mỗi nút gồm hai trườngMỗi nút gồm hai trường

Trường Trường INFORINFOR chỉ thông tin chỉ thông tin của nút, trường của nút, trường LINKLINK để liên kết để liên kết với nút đứng sau nóvới nút đứng sau nó

Nút đầu có một con trỏ trỏ đến, nút cuối không Nút đầu có một con trỏ trỏ đến, nút cuối không nối đến nút nào cả nối đến nút nào cả

INFOR LINK

A B C D

L

2.2

2.2.2. Phép toán trên danh sách móc nối đơn2.2.2. Phép toán trên danh sách móc nối đơn

Tạo một danh sách mớiTạo một danh sách mới Bổ sung nút mới vào danh sBổ sung nút mới vào danh s

ách nối đơn ách nối đơn Loại bỏ một nút trong danh sLoại bỏ một nút trong danh s

ách nối đơnách nối đơn Ghép hai danh sách nối đơnGhép hai danh sách nối đơn

Các thao tác cơ sở trên cáCác thao tác cơ sở trên các nút và con trỏc nút và con trỏ

CÁC PHÉP TOÁN

CREATE

INSERT

DELETE

COMBINE

2.2

Các thao tác cơ sở trên các con trỏCác thao tác cơ sở trên các con trỏ Để có thể tạo ra cấu trúc danh sách móc nối, một ngôn Để có thể tạo ra cấu trúc danh sách móc nối, một ngôn

ngữ lập trình cần có các thủ tục và hàm cơ sở saungữ lập trình cần có các thủ tục và hàm cơ sở sau

Dispose(p)

Infor(p)

Link(p)

lấy một địa chỉ p từ danh sách lấy một địa chỉ p từ danh sách chỗ trốngchỗ trống

Cho giá trị của trường INFOR Cho giá trị của trường INFOR của nút trỏ bởi biến con trỏ p của nút trỏ bởi biến con trỏ p

Cho giá trị của trường LINK của Cho giá trị của trường LINK của nút trỏ bởi biến con trỏ p nút trỏ bởi biến con trỏ p

New(p)

trả lại địa chỉ p vào danh sách trả lại địa chỉ p vào danh sách chỗ trống chỗ trống

2.2

Tạo một danh sách rỗng: CREATETạo một danh sách rỗng: CREATE

Nội dungNội dung: : Khi tạo một danh sách móc nối mới ta Khi tạo một danh sách móc nối mới ta

tạo một biến con trỏ, không chứa tạo một biến con trỏ, không chứa thông tin, không có nút kế tiếpthông tin, không có nút kế tiếp

Procedure Create(L);Procedure Create(L); BeginBegin New(p);New(p); L:= p;L:= p; Link(p):=Null;Link(p):=Null; End;End;

Pascal

2.2

PPAASSCCAALL

Trong ngôn ngữ Trong ngôn ngữ PascalPascal để tạo một danh sách móc để tạo một danh sách móc nối trươc hết phải khai báo một kiểu dữ liệu bản nối trươc hết phải khai báo một kiểu dữ liệu bản ghi với hai trường, trường Infor có kiểu là kiểu ghi với hai trường, trường Infor có kiểu là kiểu dữ liệu của danh sách (chẳng hạn Integer), một dữ liệu của danh sách (chẳng hạn Integer), một trường kiểu con trỏ. Cú pháp như sau:trường kiểu con trỏ. Cú pháp như sau:

TTypeype pointpoint = ^node;= ^node;nnode ode = record= record Infor:integer;link:point; Infor:integer;link:point; end;end;

Procedure Procedure CreateLCreateListist; {; {tao mot danh sach tao mot danh sach rong}rong}

BeginBegin new(h);new(h); h^.link:=h^.link:=NilNil;; End;End;

2.2

Bổ sung nút mới vào danh sách nối Bổ sung nút mới vào danh sách nối đơn : INSERT(L, m, X)đơn : INSERT(L, m, X)

Nội dung phép toán: Cho L là con trỏ, trỏ tới Nội dung phép toán: Cho L là con trỏ, trỏ tới nút đầu của danh sách nối đơn, m là con trỏ nút đầu của danh sách nối đơn, m là con trỏ trỏ tới một nút trong danh sách. Nếu danh trỏ tới một nút trong danh sách. Nếu danh sách rỗng thì bổ xung một nút với thông tin sách rỗng thì bổ xung một nút với thông tin X, nếu L không rỗng thi bổ xung vào danh X, nếu L không rỗng thi bổ xung vào danh sách một nút đứng sau nút trỏ bởi m, nút sách một nút đứng sau nút trỏ bởi m, nút mới có thông tin là X.mới có thông tin là X.

BA C

L

D

M

Xp

2.2

Procedure INSERT(l,m,X);Procedure INSERT(l,m,X);

BeginBegin New(p);New(p); Infor(p)= X;Infor(p)= X; Link(p):= link(m);Link(p):= link(m); Link(m):= p;Link(m):= p;

EndEnd

2.2

Loại bỏ một nút trong danh sách nối đơnLoại bỏ một nút trong danh sách nối đơn

Để loại bỏ nút trỏ bởi m khỏi Để loại bỏ nút trỏ bởi m khỏi danh sách ta phải lấy con trỏ danh sách ta phải lấy con trỏ đến nút đó cho trỏ trực tiếp đến đến nút đó cho trỏ trực tiếp đến nút đứng ngay saunút đứng ngay sau

A C

L

D

M

B

2.2

Procedure DELETE(L,m);Procedure DELETE(L,m);Begin Begin If L = Null then beginIf L = Null then begin Write(‘Danh sách rỗng’); return ; end;Write(‘Danh sách rỗng’); return ; end;If m=L then L:=link(L);If m=L then L:=link(L); else begin else begin p:= L;p:= L; While p<> m do p:=link(p);While p<> m do p:=link(p); link(p):= link(m);link(p):= link(m); end;end; dispose(m);dispose(m);

end;end;

2.2

Ghép hai danh sách nối đơnGhép hai danh sách nối đơnCOMBIN(L,M);COMBIN(L,M);

Nếu L và M không rỗng thì tìm nút cuối của danh Nếu L và M không rỗng thì tìm nút cuối của danh sách L và nối vào nút đầu của danh sách Msách L và nối vào nút đầu của danh sách M

BA C

L

D

M

2.2

Procedure Combin(L,M);Procedure Combin(L,M); BeginBegin If M = Null then return;If M = Null then return; If L = Null then begin L:= M; If L = Null then begin L:= M;

return; end;return; end; p:=L;p:=L; while link(p)<> Null do p:= link(p);while link(p)<> Null do p:= link(p); link(p):= m;link(p):= m; End;End;

2.2

Danh sách nối vòngDanh sách nối vòng Thêm một nút đầu danh sách đặt là Head Thêm một nút đầu danh sách đặt là Head

không chứa dữ liệukhông chứa dữ liệu Nút cuối danh sách trỏ về nút HeadNút cuối danh sách trỏ về nút Head

Head

Tạo danh sách rỗngTạo danh sách rỗng New(Head);New(Head); Link(Head):=Head;Link(Head):=Head;

Thêm một nút đầu Thêm một nút đầu có thông tin X vào có thông tin X vào danh sách;danh sách;

New(p);New(p); Infor(p):=XInfor(p):=X link(p):=Link(Head);link(p):=Link(Head); Link(head):=p;Link(head):=p;

Thao tác trên danh sách nối Thao tác trên danh sách nối vòngvòng

Head

Head

p

Danh sách nối képDanh sách nối kép

Cấu trúc một nútCấu trúc một nút INFOR: Thông tinINFOR: Thông tin LPoint: Mối nối tráiLPoint: Mối nối trái Rpoint: Mối nối phảiRpoint: Mối nối phải

INFOR RPointLPoint

Cấu trúc một danh sách nối képCấu trúc một danh sách nối kép

A B C D

L R

A B

R

Nếu danh sách L là Nếu danh sách L là rỗng, nút mới thêm rỗng, nút mới thêm là nút đầu tiênlà nút đầu tiên

Chèn một nút mới vào danh sách nối Chèn một nút mới vào danh sách nối képkép

X

L R

Nếu thêm vào đầu danh sáchNếu thêm vào đầu danh sách

X

L L

L

X

B C D

R Nếu thêm vào giữa danh sách, trước nút Nếu thêm vào giữa danh sách, trước nút mm

m

A

p CODE

Chèn một nút mới vào danh sách nối Chèn một nút mới vào danh sách nối képkép

Procedure DoubleInsert(L,R,M,X);Procedure DoubleInsert(L,R,M,X);

BEGINBEGIN New(p); Infor(p):=X;New(p); Infor(p):=X; if R = Null then beginif R = Null then begin Lp(p):= Rp(p):=NullLp(p):= Rp(p):=Null L:= R:= p;return; end;L:= R:= p;return; end; if m = L then begin if m = L then begin Lp(p):=Null; Rp(p):= Lp(p):=Null; Rp(p):= L;Lp(L):=p;L:= p;L;Lp(L):=p;L:= p;

return ; end;return ; end; Lp(p):= Lp(m); Rp(p):= m; Lp(p):= Lp(m); Rp(p):= m; Lp(m):= p; Rp(Lp(m)):=p; Lp(m):= p; Rp(Lp(m)):=p;

END;END;

A B C D

R

Xóa nút trỏ bởi Xóa nút trỏ bởi mm khỏi danh sách nối khỏi danh sách nối képkép

Nếu chỉ có một nút (R= L)Nếu chỉ có một nút (R= L)

A

L

A B C D

L

R

Nếu xóa nút cực trái (Nếu xóa nút cực trái (mm = L) = L)

DA B C

L

L

R Nếu xóa nút cực phải (Nếu xóa nút cực phải (mm = R) = R)

Nếu xóa nút giữa (Nếu xóa nút giữa (mm R, R, mm L)L)m

L

CODE

Xóa nút trỏ bởi m khỏi danh sách nối Xóa nút trỏ bởi m khỏi danh sách nối képkép

Procedure DoubleDelete(L,R,M);Procedure DoubleDelete(L,R,M);BEGINBEGIN

If R=Null then begin write(‘Danh sách If R=Null then begin write(‘Danh sách rỗng’);return; end;rỗng’);return; end;

CaseCase L=R : L:=R:=Null;L=R : L:=R:=Null; m = L: L:=Rp(L); Lp(L):= Null;m = L: L:=Rp(L); Lp(L):= Null; m = R: R:= Lp(R); Rp(R):= Null;m = R: R:= Lp(R); Rp(R):= Null; else : Rp(Lp(m)):= Rp(m);else : Rp(Lp(m)):= Rp(m); Lp(Rp(m)):= Lp(m);Lp(Rp(m)):= Lp(m);End case;End case;Dispose(m)Dispose(m)END;END;

Biểu diễn đa thức một ẩn Biểu diễn đa thức một ẩn bằng danh sách nối đơnbằng danh sách nối đơn

Mỗi số hạng (đơn thức) biểu diễn bằng một Mỗi số hạng (đơn thức) biểu diễn bằng một nútnút

Mỗi nút có ba thành phần : Mỗi nút có ba thành phần : Hệ số :HeSoHệ số :HeSo Số mũ : SoMuSố mũ : SoMu LinkLink

SoMu LinkHeSo

Ví dụVí dụ

Đa thức A(x)=-6xĐa thức A(x)=-6x1010+8x+8x66+2x+2x22+5+5

10-6 68 22 0 X5

A

B

10-5 68 24 11

C

Đa thức B(x)=xĐa thức B(x)=x1010+2x+2x22+x+x

Đa thức C(x)=A(x)+B(x)=-5xĐa thức C(x)=A(x)+B(x)=-5x1010+8x+8x66+4x+4x22+x+5+x+5

0 X5

101 22 1 X1

CODE

Giải thuật cộng hai đa thức cho Giải thuật cộng hai đa thức cho dưới dạng danh sách móc nốidưới dạng danh sách móc nối

Phương pháp cộng:Phương pháp cộng: Giả sử hai đa thức A(x) và B(x) cho theo số mũ Giả sử hai đa thức A(x) và B(x) cho theo số mũ

giảm dần:giảm dần: So sánh hai số hạng cực trái của mỗi đa thức.So sánh hai số hạng cực trái của mỗi đa thức. Nếu hai số mũ của hai số hạng này bằng nhau thì Nếu hai số mũ của hai số hạng này bằng nhau thì

cộng hai hệ số và đưa tổng và số mũ chung vào đa cộng hai hệ số và đưa tổng và số mũ chung vào đa thức tổngthức tổng

Nếu khác nhau thì đưa số hạng có số mũ lớn hơn Nếu khác nhau thì đưa số hạng có số mũ lớn hơn vào đa thức tổng, dịch chuyển con trỏ sang nút vào đa thức tổng, dịch chuyển con trỏ sang nút đứng sau.đứng sau.

Nếu một trong hai đa thức A(x), b(x) đã hết các số Nếu một trong hai đa thức A(x), b(x) đã hết các số hạng thì đưa tất cả các số hạng còn lại của đa thức hạng thì đưa tất cả các số hạng còn lại của đa thức kia vào đa thức tổng.kia vào đa thức tổng.

Thêm một đơn thức vào phía cuối một đa Thêm một đơn thức vào phía cuối một đa thứcthức

Procedure Attach(h,m,d);Procedure Attach(h,m,d); {Gắn vào phía cuối đa thức tại con {Gắn vào phía cuối đa thức tại con

trỏ d, đơn thức có hệ số h và số mũ trỏ d, đơn thức có hệ số h và số mũ m};m};

BeginBegin

New(p); HeSo(p):=h;SoMu(p):=m; New(p); HeSo(p):=h;SoMu(p):=m; link(d):=p; d:=p;link(d):=p; d:=p;

End;End;

Procedure PAdd(A,B,C);Procedure PAdd(A,B,C);BEGIN;BEGIN; p:=A; q:=B;New(C); d:=C;p:=A; q:=B;New(C); d:=C;While p#Null and q # Null do While p#Null and q # Null do CaseCase

SoMu(p)=SoMu(q): h=HeSo(p)+HeSo(q); if h#0 SoMu(p)=SoMu(q): h=HeSo(p)+HeSo(q); if h#0 then then AttachAttach(h,SoMu(p),d);p:=link(p);q:=link(q);(h,SoMu(p),d);p:=link(p);q:=link(q);

SoMu(p)>SoMu(q): Attach(HeSo(p),SoMu(p),d); SoMu(p)>SoMu(q): Attach(HeSo(p),SoMu(p),d); p:=link(p);p:=link(p);

else: else: AttachAttach(HeSo(q),SoMu(q),d); q:=link(q);(HeSo(q),SoMu(q),d); q:=link(q);end case;end case;while p# Null do begin while p# Null do begin

attachattach(HeSo(p),SoMu(p),d);p:=link(p);end;(HeSo(p),SoMu(p),d);p:=link(p);end;while q# Null do begin while q# Null do begin

attachattach(HeSo(q),SoMu(q),d);q:=link(q);end;(HeSo(q),SoMu(q),d);q:=link(q);end;link(d):=Null;link(d):=Null;t:=C; C:=link(C); dispose(t);t:=C; C:=link(C); dispose(t);END;END;

Cộng 2 đa thức A ,B ghi kết quả vào đa Cộng 2 đa thức A ,B ghi kết quả vào đa thức Cthức C

Lưu trữ đa thức bằng danh sách nối Lưu trữ đa thức bằng danh sách nối vòng có nút Headvòng có nút Head

Đa thức A(x)=-6xĐa thức A(x)=-6x1010+8x+8x66+2x+2x22+5+5

10-6 68 22 05

A

-1

Procedure PAdd(A,B,C);Procedure PAdd(A,B,C);BEGIN;BEGIN; p:=A; q:=B;New(C); d:=C;p:=A; q:=B;New(C); d:=C;While true While true CaseCase

SoMu(p)=SoMu(q): SoMu(p)=SoMu(q): if SoMu(p)=-1 then exit;if SoMu(p)=-1 then exit; h=HeSo(p)+HeSo(q);h=HeSo(p)+HeSo(q);

AttachAttach(h,SoMu(p),d);p:=link(p);q:=link(q);(h,SoMu(p),d);p:=link(p);q:=link(q);

SoMu(p)>SoMu(q):SoMu(p)>SoMu(q): AttachAttach(HeSo(p),SoMu(p),d); (HeSo(p),SoMu(p),d); p:=link(p);p:=link(p);else: else: AttachAttach(HeSo(q),SoMu(q),d); (HeSo(q),SoMu(q),d); q:=link(q);q:=link(q);

end case;end case;END;END;

Cộng hai đa thức danh sách nối vòngCộng hai đa thức danh sách nối vòng

Chương 3