Tải bản đầy đủ (.pdf) (28 trang)

slike bài giảng cấu trúc dữ liệu và giải thuật - đỗ bích diệp chương 3 mảng và danh sách

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (428.16 KB, 28 trang )

Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 1
Cấutrúcdữ liệuvàGiảithuật
Chương III: Mảng và Danh sách
Mảng và Danh sách
Nội dung
– Cấutrúcdữ liệuMảng
z Lưutrữ Mảng 1 chiều
z Lưutrữ Mảng 2 chiều
z Các phép toán trên cấutrúcMảng
– Danh sách tuyếntính
z Lưutrữ kế tiếp
z Lưutrữ móc nối
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 2
Kiểudữ liệutrừutượng Mảng
z Đốitượng củaMảng:
– Mộttậpcáccặp (index, item)
– Vớimỗigiátrị của index sẽ có mộtgiátrị tương ứng
củaitem.
– Index là mộttậpcóthứ tự có mộtchiềuhoặc nhiều
chiều
z Index 1 chiều : {0, 1, 2, …, n-1}
z Index 2 chiều : {(0,0) , (0,1), (0,2), …,(0,n), (1,0), (1,1) ….}
Kiểudữ liệutrừutượng Mảng
z Các phép toán
– Create(j, list) : tạomảng có j chiều, list là mộtj-bộ với
phầntử thứ k của list là kích thướcchiềuthứ k của
mảng.
– Retrieve(A,i) : Trả ra giá trị củaphầntử nhậnchỉ số i
nếucó


– Store(A,i,x) : Trả ra mộtmảng giống như mảng A đã
cho ban đầu, chỉ khác là mộtcặp(i,x) đã đượcbổ
sung vào vị trí đúng
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 3
Cấutrúcdữ liệuMảng
z Mảng là dãy các phầntửđược đánh chỉ số
z Khi cài đặt trong máy tính, mảng đượclưutrữ
trong một dãy các ô nhớ liên tiếp trong bộ nhớ
z Kích thướccủamảng đượcxácđịnh khi khởitạo
và không thay đổi
z Mỗiphầntử trong mảng có mộtchỉ số xác định
z Truy xuấtvàocácphầntử củamảng sử dụng chỉ
số củaphầntử
Mảng trong các ngôn ngữ lậptrình
– Tậpchỉ số củamảng có thể khác nhau
z C, Java : chỉ số là số nguyên, liên tục, bắt đầutừ 0
z Pascal : chỉ số có thể có giá trị rờirạc
z Perl: cho phép chỉ số không phảilàsố
– Mảng có thể là thuầnnhấthoặc không thuầnnhất
– Mảng có thể có thêm các thông tin bổ sung ngoài các
phầntử
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 4
Mảng 1 chiều
– Khởitạo
z Cầnchỉ ra số phầntử củamảng
z Khai báo mảng trong C:
<kiểudữ liệucủaphầntử ><tên biến>[size]
– int list[5];

– char word[25];

Tham chiếu
z Các phầntử trong mảng 1 chiều được tham chiếu đếnsử
dụng địachỉđượctính
– int list [5] Æ list[0] địachỉ cơ sở = α
list[1] α + sizeof(int)
list[2] α + 2*sizeof(int)
list[3] α + 3*sizeof(int)
list[4] α + 4*sizeof(int)
Mảng 1 chiều
Address Value
1228 0
1230 1
1232 2
1234 3
1236 4


int list[] = {0, 1, 2, 3, 4};
int *ptr; int rows = 5;
int i; ptr = list;
printf(“Address Value\n”);
for (i=0; i < rows; i++)
printf(“%8u%5d\n”, ptr+i, *(ptr+i));
printf(“\n”);
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 5
Mảng 2 chiều
– Khai báo

z Cầnchỉ ra số hàng, số cột
z Trong C : <kiểuphầntử> <tên biến> [size1] [size2]
– int table[4][5];
z Truy xuấtmộtphầntử
– table[i][j]

Lưutrữ 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ựưutiêncột
Mảng 2 chiều
– Lưutrữ mảng 2 chiều theo thứ tựưutiênhàng
a
32
a
31
a
30
a
22
a
21
a
20
a
12
a
11
a
10
a

02
a
01
a
00
a
32
a
31
a
30
a
22
a
21
a
20
a
12
a
11
a
10
a
02
a
01
a
00
Từ mảng 2 chiềulưutrữ

sang bộ nhớ kế tiếpsử dụng
thứ tựưu tiên hàng
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 6
Mảng 2 chiều
– Lưutrữ mảng 2 chiều theo thứ tựưutiêncột
a
32
a
31
a
30
a
22
a
21
a
20
a
12
a
11
a
10
a
02
a
01
a
00

a
32
a
22
a
12
a
02
a
31
a
21
a
11
a
01
a
30
a
20
a
10
a
00
Từ mảng 2 chiềulưutrữ
sang bộ nhớ kế tiếpsử dụng
thứ tựưutiêncột
Danh sách tuyếntính
– Danh sách là mộttậphợpcóthứ tự gồmmộtsố biến
động các phầntử cùng kiểu{a

1
, a
2
, …., a
n-1
, a
n
}
– a
i
là phầntửởvị trí i trong danh sách
– a
1
là phầntửđầu tiên, a
n
là phầntử cuốicùngcủa
danh sách
– n là độ dài của danh sách tại 1 thời điểm
– Trường hợp n =0 ta có danh sách rỗng
– Trong danh sách tuyến tính, thứ tự trướcsaucủacác
phầntửđượcxácđịnh rõ ràng.
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 7
Các cách cài đặt danh sách tuyếntính
– Dùng Mảng:
z Lưutrữ các phầntử của danh sách trong mộtvector lưutrữ
bao gồm các ô nhớ liên tiếp
– Dùng Con trỏ:
z Các phầntửđượclưutrữ trong các ô nhớởcác vị trí tùy ý
trong bộ nhớ

z Các phầntử liên kếtvớinhaubằng con trỏ
– Dùng địachỉ gián tiếp
z Các phầntửđượclưutrữ trong các ô nhớởcác vị trí tùy ý
trong bộ nhớ
z Có mộtmảng địachỉ trong đóphầntử thứ i củamảng chứa
địachỉ củaphầntử thứ i trong danh sách
Lưutrữ kế tiếp đốivớidanhsách
– Danh sách lưutrữ trong mộtphầnbộ nhớ bao gồm
các ô nhớ liên tiếp
z Các phầntử liềnkề nhau đượclưutrữ trong những ô nhớ
liềnkề nhau
z Mỗiphầntử của danh sách cũng đượcgánmộtchỉ số chỉ thứ
tựđượclưutrữ trong vector
z Có mộtchỉ số last dùng để xác định chỉ số củaphầntử cuối
cùng trong danh sách
A
123 last
i
max
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 8
Lưutrữ kế tiếp đốivới danh sách
– Khai báo danh sách sử dụng lưutrữ kế tiếp trong C
#define max 100
typedef etype integer
typedef struct LIST{
etype elements[max];
int last;
} LISTTYPE
Lưutrữ kế tiếp đốivới danh sách

– Ưu điểmcủacáchlưutrữ kế tiếp
z Tốc độ truy cậpvàocácphầntử của danh sách nhanh
– Nhược điểmcủacáchlưutrữ kế tiếp
z Cầnphảibiếttrướckíchthướctối đacủa danh sách
– Tại sao?
z Thựchiện các phép toán bổ sung các phầntử mớivàloạibỏ
các phầntử cũ khá tốnkém
– Tại sao?
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 9
Các thao tác trên danh sách kế tiếp
– Bổ sung mộtphầntử vào vị trí p trong danh sách
A
12
3
last
p
A
123 last
p
A
123 last
x
p
Các thao tác trên danh sách kế tiếp
Procedure INSERT-LIST(L, x, p)
Begin
{ L là danh sách đượclưutrữ dướidạng mảng, x là giá trị phầntử mới, p là vị trí
phầntử mới, L có số tối đalàmax phầntử , last là chỉ số phầntử cuối cùng trong
danh sách }

1. {Danh sách đã đầy} if (last > max) then ERROR;
2. {Kiểmtragiáitrị p} else if (p > last ) OR (p < 1) then ERROR;
3. else
begin {Dịch chuyểncácphầntử, tạoô trống để bổ sung}
for i = last down to p do L[i+1] = L[i];
{Lưu giá trị mớivàovị trí p} L[p] = x;
last = last+1; {Số lượng phầntử trong danh sách tăng thêm 1}
end.
End
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 10
Các thao tác trên danh sách kế tiếp
– Loạibỏ mộtphầntử trong danh sách
A
123
last
p
A
123 last
x
p
A
13 last
p
2
Các thao tác trên danh sách kế tiếp
Procedure DELETE-LIST(L, p)
Begin
{ Loạibỏ phầntửởvị trí p trong danh sách kế tiếpL.
L có tối đamax phầntử , hiệntạiphầntử cuốicùngở vị trí last}

1. {Kiểm tra p} if (p > last ) OR (p <1) then ERROR;
2. {Dồn các phầntửởđ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. End.
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 11
Lưutrữ móc nối đốivới danh sách
z Danh sách móc nối đơn ( Singly Linked-List)
– Mộtphầntử trong danh sách = một nút
– Một nút có hai thành phần
z INFO: chứa thông tin (nội dung, giá trị) ứng vớiphầntử
z NEXT: chứa địachỉ của nút tiếp theo
– Để thao tác được trên danh sách, cầnnắm được địachỉ của
nút đầu tiên trong danh sách Ù biết được con trỏ L trỏ tới đầu
danh sách
Danh sách móc nối đơn
L
e1 e2 e5 NILe4e3
5000
Data 4320
Structure
2000 CourseAlgorithm 3000And 1000
Hình ảnh danh sách móc nối đơn
Ví dụ danh sách móc nối đơn
Địachỉ nút đầu
danh sách
Địachỉ bộ nhớ của các phầntử tiếp theo
Cấu trúc dữ liệu và Giải thuật

Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 12
Danh sách móc nối đơn
z Danh sách rỗng là danh sách không có chứa nút nào, lúc
đó L = NULL
z Tham chiếu đếncácthànhphầncủamột nút có địachỉ p
(trỏ bởi con trỏ p)
– INFO(p): Tham chiếuvàogiátrị
z INFO(p) = 234 ÅÆ giá trị dữ liệulưutrữ tạinúttrỏ bởi
p là 234;
– NEXT(p)
z NEXT(p) = 234 ÅÆ Ô nhớ chứaphầntử sau nút trỏ
bởip cóđịachỉ là 234
z Cấp phát một nút trống sẽđượctrỏ bởip
Câu lệnh trong giả ngôn ngữ : call New(p)
z Thu hồimộtnúttrỏ bởip
Câu lệnh trong giả ngôn ngữ: call Dispose(p)
Danh sách móc nối đơn
– Khai báo trong ngôn ngữ C
typedef <kiểudữ liệucủaphầntử> element_type;
struct node{
element_type info;
struct node * next;
} ;
typedef struct node LISTNODE;
typedef LISTNODE *LISTNODEPTR;
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 13
Các thao tác trên danh sách nối đơn
z Duyệt danh sách nối đơn:
.

Procedure TRAVERSE(L)
{Đầuvàocủagiảithuậtlàmột LISTNODEPTR L}
Begin
p:= L;
while p <> NULL do
begin
writeln(INFO(p));
p:= NEXT(p);
end;
End
Các thao tác trên danh sách nối đơn
– Bổ sung mộtphầntử mới vào danh sách
z Hãy bổ sung 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 đượctrỏ tớibởicon trỏ P
L
BCGH
L
B
CG
H
P
X
P
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 14
Các thao tác trên danh sách nối đơn
– Bổ sung mộtphầntử mới vào danh sách
Procedure INSERT(L, X, P)
Begin
1. { Tạo nút mớichứa giá trị X, đượctrỏđếnbới con trỏ Temp}

Call New(Temp) ;
INFO(Temp) = X;
2. { Gắn nút mớivàovị trí cầnchèn}
NEXT(Temp) = NEXT(P);
NEXT(P) = Temp;
End
Các thao tác trên danh sách nối đơn
L
BCGH
P
X
Temp
Sau khi khởitạo nút mới và gán giá trị cho phầntử mới
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 15
Các thao tác trên danh sách nối đơn
L
BCGH
P
X
Temp
NEXT(P)
Sau khi thựchiện NEXT(Temp) = NEXT(P);
Các thao tác trên danh sách nối đơn
L
BCGH
P
X
Temp
Sau khi thựchiện NEXT(P) = Temp;

Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 16
Các thao tác trên danh sách nối đơn
– Loạibỏ nút xác định trước:
z Hãy loạibỏ nút đằng sau nút trỏ bởi con trỏ P cho trước
L
BCGH
L
B
CG
H
P
P
Các thao tác trên danh sách nối đơn
Procedure DELETE(L, p)
Begin
{Trường hợptổng quát}
1. Temp = NEXT(p) ;
2. Next(p) = Next(Temp);
3. call Dispose(Temp);
End.
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 17
Minh họa thao tác trong NNLT C
– Cho một danh sách chứacácsố nguyên, đượcsắp
xếp theo chiềutăng dần
z Viết đoạnchương trình C thựchiệnbổ sung mộtnútmớicó
giá trị x cho trước vào danh sách
z Viết đoạnchương trình C thựchiệnviệcloạibỏ một nút có
giá trị biếttrước

Minh họa thao tác trong NNLT C
– Khai báo danh sách
struct node{
int info;
struct node * next;
} ;
typedef struct node LISTNODE;
typedef LISTNODE *LISTNODEPTR;
void insert(LISTNODEPTR *, int );
int delete(LISTNODEPTR *, int);
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 18
void INSERT_ORDER( LISTNODEPTR *startPtr, int value){
/* Chương trình bổ sung một nút vào danh sách có sắpxếptheochiềutăng dần
của giá trị các phầntử */
LISTNODEPTR temp, current, previous ;
temp = malloc(sizeof(LISTNODE));
if (temp!= NULL) {
1. temp->info = value; temp->next = NULL;
previous = NULL; current = *startPtr;
2. while (current != NULL && value >current->info) {
previous = current; current = current->next;
}
3. if (previous = NULL) {
temp->next = *startPtr;
*startPtr = temp;
}
4. else { previous->next = temp; temp->next = current; }
}
}

int DELETE_ORDER( LISTNODEPTR *startPtr, int value){
/* Chương trình bổ sung một nút vào danh sách có sắpxếptheochiềutăng dần
của giá trị các phầntử */
LISTNODEPTR temp, current, previous ;
if (value == (* startPtr) -> info ) {
temp = *startPtr; *startPtr = (* startPtr) -> next; free(temp);
return value;
}else {
previous = *startPtr; current = (*startPtr) -> next;
while(current != NULL && current->info != value){
previous = current; current = current->next;
}
if (current != NULL) { temp = current; previous->next = current->next;
free(temp) ; return value;
}
}
return ‘\0’;
}
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 19
Danh sách nối kép
z Qui cách của nút trong danh sách nốikép
– Trường PREV của nút đầutiênvàtrường NEXT của nút
cuốicùngđềucógiátrị NULL
– Cầnnắm được hai con trỏ, con trỏ L trỏ tớinútcực trái, con
trỏ R trỏ tới nút cựcphảicủa danh sách
– Với danh sách rỗng , L = R = NULL
L
BCGH
R

prev next
info
nút
Danh sách nối kép
– Khai báo danh sách nối kép trong C
struct dlnode{
int info;
struct dlnode *next;
struct dlnode *prev;
} ;
typedef struct dlnode DLNODE;
typedef DLNODE *DLNODEPTR;
DLNODEPTR left, right;
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 20
Các thao tác trên danh sách nối kép
L
BCGH
R
X
M
L
BC GH
R
X
M
L
BCGH
R
Bổ sung mộtphầntử vào sau một nút đượctrỏ bởicon trỏ M biếttrước

Các thao tác trên danh sách nối kép
z Giảithuậtbổ sung mộtphầntử mới vào danh sách nốikép
Procedure INSERT-DOUBLE (L, R, M, X)
{Bổ sung mộtphầntử chứadữ liệu X vào sau phầntử trỏ bởiM}
1. {Tạolậpnútmới}
call New(p) ; {xin cấp phát một nút mớicóđịachỉ là p}
INFO(p) := X;
2. {Danh sách rỗng}
if L = R= NULL then begin
PREV(p):= NEXT(p) := NULL;
L:= R:=p;
return;
end;
(Còn tiếp)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 21
Các thao tác trên danh sách nối kép
z Bổ sung vào danh sách nốikép(tiếp)
3. {Trường hợpM lànútcựcphải}
if M = R then begin
NEXT(p) := NULL; PREV(p) := M; NEXT(M) := p;
R:= p;
end;
4. { Bổ sung vào giữa}
PREV(p) := M; NEXT(p) := NEXT(M);
PREV(NEXT(M)) := p;
NEXT(M) := p;
5. return.
Các thao tác trên danh sách nối kép
z Loạibỏ mộtphầntử

L
BCGH
R
L
BCGH
R
M
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 22
Các thao tác trên danh sách nối kép
z Giảithuậtloạibỏ mộtphầntử khỏi danh sách nốikép
Procedure DELETE-DOUBLE (L, R, M)
{Loạibỏ phầntử trỏ bởiM }
1. {Danh sách rỗng}
if L= R= NULL then return;
2. {Loạibỏ}
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.
Biểudiễn đathứcsử dụng danh sách
– Bài toán cộng hai đathức
z Dạng tổng quát củamột đathức
z Viếtgiảithuật tìm tổng 2 đathứctrên
01
1
1

)( axaxaxaxP
n
n
n
n
++++=


24678
278
8256)(
74352)(
xxxxxxB
xxxxxA
−+−+=
−++−=
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 23
Cách tiếpcậnsử dụng danh sách kế tiếp
z Biểudiễn đathứcsử dụng danh sách lưutrữ kế tiếp
– Mỗisố hạng của đathức ứng vớimộtphầntử củavector
lưutrữ
– Một vector có kích thước n có các phầntửđánh số từ 1
đến n thì lưutrữ đượcmột đathứccósố mũ tối đalàn-1
– Phầnhệ số a
i
củamộtsố hạng đượclưutrongchínhphần
tử củavector lưutrữ
– Phầnsố mũ i củamộtsố hạng thì ẩn trong thứ tự củaphần
tử lưutrữ

– Phầntử thứ i trong vector lưutrữ lưu thông tin về số hạng
a
i-1
x
i-1
z Phầntử thứ 1 lưutrữ thông tin a
0
z Phầntử thứ 2 lưutrữ thông tin về a
1
z …
Cách tiếpcậnsử dụng lưutrữ kế tiếp
– Ví dụ:
2-5000034-7
A[9]A[8]A[7]A[6]A[5]A[4]A[3]A[2]A[1]
65-2010-800
B[9]B[8]B[7]B[6]B[5]B[4]B[3]B[2]B[1]
24678
278
8256)(
74352)(
xxxxxxB
xxxxxA
−+−+=
−++−=
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 24
Cách tiếpcậnsử dụng lưutrữ kế tiếp
– Giảithuậtcộng hai đathứclưutrữ trên vector
Procedure ADD-POLY1(A,m, B, n, C)
Begin

{A, B là hai vector lưutrữ hai đathức đã cho;
m,n lầnlượtlàkíchthướccủaA,B, giả sử m <= n ;
C là vector lưutrữ kếtquả}
for i:= 1 to n do begin
if i<= m then
C[i] := A[i] + B[i] ;
else
C[i] := B[i] ;
end.
End
Cách tiếpcậnsử dụng lưutrữ móc nối
z Biểudiễn đathứcsử dụng lưutrữ móc nối
– Một đathức đượcbiểudiễndướidạng danh sách nối đơn
– Quy cách của 1 nút
– Ví dụ:
LINKEXPCOEF
24678
278
8256)(
74352)(
xxxxxxB
xxxxxA
−+−+=
−++−=
A
28 -57
68 5 7
32 41
-7 0
-2 6

14
-8
2
B
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp- Khoa CNTT- ĐHBKHN 25
Cách tiếpcậnsử dụng lưutrữ móc nối

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ủaC}
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}
Cách tiếpcậnsử dụng lưutrữ móc nối

4. {Trường hợpA kết thúc trước, A ngắnhơn}
while q <> NULL do begin
call ATTACH(COEF(q), EXP(q),d); q:= LINK(q);
end ;
5. {Trường hợpB kết thúc trước}
while p <> NULL do begin

call ATTACH(COEF(p), EXP(p), d) ; p := LINK(p);
end ;
6. {Kết thúc danh sách tổng} LINK(d) := NULL;
7. {Cho con trỏ C trỏ tớidanhsáchtổng}
t:= C; C:= LINK(t); call dispose(t);
8. return.

×