z=h
p=h
q=link(h)
while (link(p)!= null)
{
while(q!=null)
{
if (data(q)==data(p))
{
link(z)=link(q)
free(q)
q=link(z)
else
{
z=q
q=linq(q)
}
p=link(p)
}
uses crt;
type
list = ^list_item;
item = ^record_item;
list_item = record
start : item;
end;
record_item = record
value : string;
next : item;
end;
var
L : list;
function first (L : list) : item;
begin
first := L^.start;
end;
procedure create (L : list);
begin
L^.start := nil;
end;
function next (L : list; P : item) : item;
begin
next := P^.next;
end;
function retrieve (L : list; P : item) : string;
begin
retrieve := P^.value;
end;
function last (L : list) : item;
var
P : item;
begin
P := first (L);
if P <> nil then
while (next (L, P) <> nil) do
P := next (L, P);
last := P;
end;
function add (L : list; S : string) : item;
var
newitem : item;
begin
new (newitem);
newitem^.value := S;
newitem^.next := nil;
if first (L) = nil then
L^.start := newitem
else
last (L)^.next := newitem;
add := newitem;
end;
function remove (L : list; P : item) : item;
var
R : item;
begin
R := first (L);
if R <> nil then
if R = P then
begin
L^.start := next (L, P);
remove := first (L);
dispose (P);
end
else
while (next (L, R) <> nil) do
if next (L, R) = P then
begin
R^.next := next (L, P);
remove := next (L, P);
dispose (P);
break;
end
else
R := next (L, R);
end;
procedure clean (L : list; S : string);
var
P: item;
begin
P := first (L);
while (P <> nil) do
if S = retrieve (L, P) then
P := remove (L, P)
else
P := next (L, P);
end;
procedure cleanup (L : list);
var
P, R : item;
begin
P := first (L);
while (P <> nil) do
begin
R := next (L, P);
while (R <> nil) do
if retrieve (L, P) = retrieve (L, R) then
R := remove (L, R)
else
R := next (L, R);
P := next (L, P);
end;
end;
procedure print (L : list);
var
P : item;
begin
P := first (L);
while (P <> nil) do
begin
write( retrieve (L, P), ' > ');
P := next (L, P);
end;
writeln ('Null');
end;
begin
clrscr;
create (L);
print (L);
add (L, '0');
add (L, '1');
add (L, '2');
add (L, '4');
add (L, '2');
add (L, '2');
add (L, '4');
add (L, '1');
add (L, '3');
add (L, '4');
print (L);
remove (L, first (L));
print (L);
remove (L, last (L));
print (L);
clean (L, '4');
print (L);
cleanup (L);
print (L);
readkey;
end.
uses crt;
type
list = ^list_item;
item = ^record_item;
list_item = record
start : item;
end;
record_item = record
value : string;
next : item;
end;
var
L : list;
function first (L : list) : item;
begin
first := L^.start;
end;
procedure create (L : list);
begin
L^.start := nil;
end;
function next (L : list; P : item) : item;
begin
next := P^.next;
end;
function retrieve (L : list; P : item) : string;
begin
retrieve := P^.value;
end;
function last (L : list) : item;
var
P : item;
begin
P := first (L);
if P <> nil then
while (next (L, P) <> nil) do
P := next (L, P);
last := P;
end;
function add (L : list; S : string) : item;
var
newitem : item;
begin
new (newitem);
newitem^.value := S;
newitem^.next := nil;
if first (L) = nil then
L^.start := newitem
else
last (L)^.next := newitem;
add := newitem;
end;
function remove (L : list; P : item) : item;
var
R : item;
begin
R := first (L);
if R <> nil then
if R = P then
begin
L^.start := next (L, P);
remove := first (L);
dispose (P);
end
else
while (next (L, R) <> nil) do
if next (L, R) = P then
begin
R^.next := next (L, P);
remove := next (L, P);
dispose (P);
break;
end
else
R := next (L, R);
end;
procedure clean (L : list; S : string);
var
P: item;
begin
P := first (L);
while (P <> nil) do
if S = retrieve (L, P) then
P := remove (L, P)
else
P := next (L, P);
end;
procedure cleanup (L : list);
var
P, R : item;
begin
P := first (L);
while (P <> nil) do
begin
R := next (L, P);
while (R <> nil) do
if retrieve (L, P) = retrieve (L, R) then
R := remove (L, R)
else
R := next (L, R);
P := next (L, P);
end;
end;
procedure print (L : list);
var
P : item;
begin
P := first (L);
while (P <> nil) do
begin
write( retrieve (L, P), ' > ');
P := next (L, P);
end;
writeln ('Null');
end;
begin
clrscr;
create (L);
print (L);
add (L, '0');
add (L, '1');
add (L, '2');
add (L, '4');
add (L, '2');
add (L, '2');
add (L, '4');
add (L, '1');
add (L, '3');
add (L, '4');
print (L);
remove (L, first (L));
print (L);
remove (L, last (L));
print (L);
clean (L, '4');
print (L);
cleanup (L);
print (L);
readkey;
end.