我们正在学校学习pascal编程,我无法理解链接列表的操作。如果你能提供帮助,我将非常感激。
我有两个由这些记录组成的链接列表:
TYPE
pa = A^;
A = record
v : integer; {the value}
f : integer; {frequency}
next : pa; {points to next item in the list, last item points to nil}
end;
我想将它们联合到一个新的链表中,而不会破坏旧列表。
旧列表按值(v)排序,新订单也应按顺序排序。如果两个先前列表中存在相同的值,那么在新列表中它将只有一次,但频率(f)加在一起。
所以我对如何做到这一点的想法是这样的:
这会有用吗?你会怎么编码?
所以我试着把它写下来,这就是我得到的:
procedure Unite(list1,list2,var result : pa)
var head,akt,l1,l2 : pa;
begin
l1 := list1; {current position in list1}
l2 := list2; {current position in list2}
if(l1 <> nil and l2 <> nil) then begin
new(head); {head of our new list}
akt := head; {current position in new list}
while (l1 <> nil OR l2 <> nil) do begin
if(l1 = nil and not l2 = nil) then begin
akt^.v := l2^.v;
akt^.f := l2^.f;
l2 := l2^.next;
akt := new(akt^.next);
Continue;
end;
if(l2 = nil and not l1 = nil) then begin
akt^.v := l1^.v;
akt^.f := l1^.f;
l1 := l1^.next;
akt := new(akt^.next);
Continue;
end;
if(l1^.v = l2^.v) then begin
akt^.v = l1^.v;
akt^.f = l1^.f + l2^.f;
l1 := l1^.next;
l2 := l2^.next;
end else if(l1^.v < l2^.v) then begin
akt^.v := l1^.v;
akt^.f := l1^.f;
l1 := l1^.next;
end else
akt^.v := l2^.v;
akt^.f := l2^.f;
l2 := l2^.next;
end;
akt := new(akt^.next);
end;
end;
end;