Giáo trình bài t p Pascal
Ch ng 9 ươ
D LI U KI U CON TR
I. KHAI BÁO
Type
<Tên ki u con tr > = ^ <Ki u c a bi n đ ng>; ế
Var<Tên bi n>:<Tên ki u con tr >;ế
Ví d 1:
Type
TroNguyen : ^integer;
Varp, q: TroNguyen;
Sau khai báo này các bi n p và q là các bi n con tr có th tr đ n các bi n đ ng có ki u integer.ế ế ế ế
Ch ng trình s c p phát 4 byte cho m i bi n con tr . Còn vùng nh c a các bi n đ ng ch a đ cươ ế ế ư ượ
c p phát.
Ví d 2:
Type
TroSv = ^ Sinhvien;
Sinhvien = Record
Hoten: String[20];
Diem: real;
Tiep: TroSv;
End;
Varp: TroSv;
Trong ví d này, p là bi n tr có th tr đ n các b n ghi có ki u Sinhvien, trong b n ghi này l i có ế ế
tr ng Tiep là m t bi n tr có th tr đ n bi n đ ng khác cũng có ki u Sinhvien. ườ ế ế ế
II. LÀM VI C V I BI N Đ NG
2.1. C p phát vùng nh
Dùng th t c New theo cú pháp:
New(<bi n tr >); ế
Phép gán gi a hai bi n tr đ c th c hi n n u chúng có cùng ki u. Sau phép gán p:=q; các con tr ế ượ ế
p và q cùng tr đ n m t đ a ch . Do đó m i thay đ i c a p^ cũng làm thay đ i q^. Nh v y, c n phân ế ư
bi t hai phép gán p:=q và p^:=q^. Ngoài ra, các con tr cùng ki u có th đ c so sánh v i nhau b ng ượ
các toán t quan h = và <>.
Turbo Pascal cũng khai báo s n m t con tr không tr t i m t bi n đ ng nào g i là ế
con tr Nil. Giá tr con tr Nil là t ng h p v i m i ki u con tr . Nil có th đ c gán ươ ượ
cho bi n con tr đ ch ra r ng con tr y hi n không đ c s d ng. Chúng ta cũng có ế ượ
th s d ng Nil trong các phép so sánh.
2.2. Gi i phóng vùng nh
Dùng th t cDispose( p);
Trong đó p là m t bi n con tr . Th t c Dispose cho phép tr l i b nh đ ng đã ế
đ c c p phát b i th t c New. ượ
III. DANH SÁCH Đ NG
3.1. Khái ni m
Chúng ta đã t ng làm quen v i ki u m ng, l u danh sách g m nhi u thành ph n có cùng ki u. M i ư
thành ph n là m t bi n tĩnh và s l ng thành ph n c a danh sách là c đ nh. đây chúng ta đ c p ế ượ
đ n m t d ng danh sách đ ng theo nghĩa: m i thành ph n là m t bi n đ ng và s l ng thành ph nế ế ượ
c a danh sách có th thay đ i. M i bi n đ ng trong danh sách đ c g i là m t nút. ế ượ
3.2. Khai báo
Đ khai báo m t danh sách đ ng tr c h t ta khai báo ki u c a m i nút trong danh ướ ế
sách.
Type <Tr nút> = ^ <Nút>;
<Nút> = Record
Data: DataType;
Next: <Tr Nút>;
End;
Var First: <Tr Nút>;
First là đ a ch c a nút đ u tiên trong danh sách, d a vào tr ng Tiep c a nút này ta b t đ c đ a ườ ế ượ
ch c a nút th hai, c nh v y ta bi t đ c đ a ch c a t t c các nút trong danh sách. Danh sách ư ế ượ
d ng này đ c g i là danh sách liên k t đ n. ượ ế ơ
3.3. Các thao tác th ng g p trên danh sách liên k t đ n ườ ế ơ
Trong ph n này chúng ta gi thi t r ng m i nút trong danh sách có hai tr ng: tr ng Info (l u n i ế ườ ườ ư
dung c a bi n đ ng) và tr ng Next (l u đ a ch c a nút ti p theo). ta có khai báo danh sách nh sau ế ườ ư ế ư
Type TroNut = ^Nut;
Nut = Record
Info: data; {data là ki u d li u đã đ nh nghĩa tr c} ướ
Next: TroNut;
End;
Var First:TroNut;
3.3.1. Kh i t o danh sách
First:=Nil;
3.3.2. B sung m t nút vào đ u danh sách
{1. T o ra nút m i}
New(p);
p^.Info:=X;
{2. B sung vào đ u danh sách}
p^.Next:=First;
First:=p;
3.3.3. B sung m t nút vào cu i danh sách
Xu t phát danh sách không có nút nào c . Nút m i thêm vào s n m cu i danh sách.
Khi đó ta c n hai bi n con tr First và Last l n l t tr đ n các nút đ u và cu i danh ế ượ ế
sách.
Procedure Khoitao;
var p: TroNut;
Begin
First:= nil; Last:= nil;
While <còn thêm nút m i vào danh sách> do
Begin
New(p);
Readln(p^.Info);
p^.Next:= Nil;
If First = Nil then
First:= p
Else
Last^.next:= p;
Last:= p;
End;
End;
3.3.4. Duy t danh sách
Duy t danh sách là thăm và x lý t ng nút trong danh sách.
Procedure Duyet;
Var p: Tronut;
Begin
p:= First;
While p <> nil do
Begin
<X lý p>;
p:= p^.Next; {duy t qua nút ti p theo} ế
End;
End;
3.3.5. B sung m t nút vào sau nút đ c tr b i p ượ
Th t c sau th c hi n vi c b sung m t nút có n i dung x vào sau nút đ c tr b i p. ượ
Procedure Bosung(p,x);
Giáo trình bài t p Pascal
Var q: TroNut;
Begin
New(q);
q^.info:=x;
if first = nil then
begin
q^.next := nil;
first := q;
end
else
begin
q^.next:= p^.next;
p^.next:= q;
end;
End;
3.3.6. Xoá m t nút kh i danh sách
Th t c sau th c hi n vi c xóa m t nút tr b i p ra kh i danh sách.
Procedure Xoa(p);
Var q: TroNut;
Begin
if First = nil then
exit;
if p = First then
First := First^.next
else
begin
q:= First;
While q^.next <> p do
q:= q^.next;
q^.next:= p^.next;
end;
Dispose(p);
End;
BÀI T P M U
Bài t p 9.1: Trong các bài t p t 9.1 đ n 9.4, dùng danh sách liên k t đ n l u m t dãy s nguyên. Nút ế ế ơ ư
đ u tiên trong danh sách đ c tr b i First. Cho khai báo m i nút trong danh sách nh sau: ượ ư
Type TroNut = ^ Nut;
Nfut = Record
GiaTri: Integer;
Tiep: TroNut;
End;
Var First: TroNut;
Vi t ch ng trình th c hi n các yêu c u sau: ế ươ
a. Nh p dãy các s nguyên và l u vào danh sách có nút đ u tr b i First, quá trình ư
nh p d ng khi d li u đ a vào không ph i là s nguyên. ư
b. In giá tr các nút l n h n 0. ơ
Program Vi_du_1;
TypeTroNut = ^ Nut;
Nut = Record
GiaTri: Integer;
Tiep: TroNut;
End;
Var First: TroNut;
p: pointer;
Procedure Nhap;
Var
n:integer;
kq:boolean;
last,p: tronut;
begin
first:=nil;
last:= nil;
repeat
write(‘Nhap gia tri mot nut – Ket thuc bang ky tu Q: ‘);
{$I-}
readln(n);
{$I+}
kq:= IOResult=0;
if kq then
begin
new(p);
p^.Giatri:=n;
p^.Tiep:=nil;
if first = nil then
first:= p;
else
last^.Tiep:= p;
last:=p;
end;
until not kq;
end;
Procedure In_so_duong;
Var
p: Tronut;
begin
p:= first;
while p <> nil do
begin
if p^.Giatri > 0 then
write(p^.Giatri:8);
p:=p^.Tiep;
end;
end;
Begin
Mark(p);
Nhap;
In_so_duong;
Release(p);
Readln;
End.
Bài t p 9.2: Vi t th t c đ m s nút có giá tr l n h n 0 và tính giá tr trung bình c ng ế ế ơ
c a các nút đó.
Procedure Nut_duong(var dem: word; tb:real);
Var
p: Tronut;
tong:longint;