如何在pascal的单链表中切换两个节点?
procedure List.switch(var n1,n2 : pNode);
var aux : pNode;
begin
aux := n1;
p1:= n2;
n2 := aux;
end;
(这里pNode是列表中节点的指针。)
节点的定义如下:
pNode = ^Node;
Node = record
data : data;
next : pNode;
end;
此代码不起作用。它要么不编译,要么说“不能采用常量表达式的地址”,要么就是不做任何事情。我想这与指针的工作原理有关...
我找到了相关信息here,但我没有读过C.
感谢您的任何建议!
答案 0 :(得分:2)
我认为这样的事情会起作用:
function SwapNodes(first: pNode): pNode;
begin
Result := first.next;
first.next := Result.next;
Result.next := first;
end;
答案 1 :(得分:1)
这样的事情对你有用。它使用Node类型的局部变量(可能是PNode指向的那个)作为占位符。
procedure List.Switch(NodeA, NodeB: PNode);
var
Temp: Node;
begin
Temp.Data := NodeB^.Data;
Temp.Next := NodeB^.Next;
NodeB^.Data := NodeA^.Data;
NodeB^.Next := NodeA^.Next;
NodeA^.Data := Temp.Data;
NodeA^.Next := Temp.Next;
end;
这是一个不是对象方法的版本,有一个测试它的控制台应用程序:
program Project1;
uses
System.SysUtils;
type
PNode = ^Node;
Node = record
Data: Integer;
Next: PNode;
end;
procedure Swap(NodeA, NodeB: PNode);
var
Temp: Node;
begin
Temp.Data := NodeB^.Data;
Temp.Next := NodeB^.Next;
NodeB^.Data := NodeA^.Data;
NodeB^.Next := NodeA^.Next;
NodeA^.Data := Temp.Data;
NodeA^.Next := Temp.Next;
end;
var
A, B: Node;
pA, pB: PNode;
begin
New(pA);
pA^.Data := 1;
pA^.Next := nil;
New(pB);
pB^.Data := 2;
pB^.Next := @A;
WriteLn('Before - pA^.Data: ', pA^.Data, ' pB^.Data: ', pB^.Data);
Swap(pA, pB);
WriteLn('After - pA^.Data: ', pA^.Data, ' pB^.Data: ', pB^.Data); // Outputs 2 and 1
Readln;
Dispose(pA);
Dispose(pB);
end.