Pointers Pascal指针的行为不符合预期

Pointers Pascal指针的行为不符合预期,pointers,pascal,Pointers,Pascal,因为我正在为一个叫战争的纸牌游戏建立一个裁判。规则说明)。TL;DR:抽到最高牌的人将两张牌都添加到他/她的牌堆的底部。 我用Pascal建立了一个链表来存放卡片堆。但pascal指针的行为与我预期的不同: 例如,我为程序提供以下输入(稍微修改): 示例输出为: nrCards: 5 Player1: 13 14 12 6 Player2: 2 3 4 7 Player1: 14 12 6 Player2: 3 4 7 Player1: 12 6 Player2: 4 7 Player1: 6

因为我正在为一个叫战争的纸牌游戏建立一个裁判。规则说明)。TL;DR:抽到最高牌的人将两张牌都添加到他/她的牌堆的底部。 我用Pascal建立了一个链表来存放卡片堆。但pascal指针的行为与我预期的不同:

例如,我为程序提供以下输入(稍微修改):

示例输出为:

nrCards: 5
Player1: 13 14 12 6
Player2: 2 3 4 7
Player1: 14 12 6
Player2: 3 4 7
Player1: 12 6
Player2: 4 7
Player1: 6
Player2: 7
Player1:
Player2: 6 7
2 5
也就是说,最后一个元素的nextNode指针大部分没有正确更新

代码:

程序应答;
{$H+}
使用系统、数学、结构;
类型
TNode=记录
val:Int32;
下一个节点:^t节点;
结束;
TNodePtr=^TNode;
TNodePtrPtr=^TNodePtr;
变量
尺寸1:Int32;
尺寸2:Int32;
卡片:TNode数组;
player1first:TNodePtr=nil;
player1last:TNodePtr=nil;
player2first:TNodePtr=nil;
player2last:TNodePtr=nil;
winnerLast:TNodePtrPtr=nil;
i:Int32;
行:字符串;
匝数:Int32=0;
nrCards:Int32=1;
cardIt:TNodePtr=零;
函数ParseIn(i:Int32):字符串;
开始
ParseIn:=提取字(i,行,['');
结束;
函数War(pl1it,pl2it:TNodePtr):Int32;
变量
nrCards:Int32=5;
i:Int32;//不重复使用?
开始
对于i:=0到3,开始
pl1it:=pl1it^.nextNode;
pl2it:=pl2it^.nextNode;
如果(pl1it=nil)或(pl2it=nil),则
出口(0);
结束;
当(pl1it^.val=pl2it^.val)开始时
nrCards:=nrCards+4;
对于i:=0到3,开始
pl1it:=pl1it^.nextNode;
pl2it:=pl2it^.nextNode;
如果(pl1it=nil)或(pl2it=nil),则
出口(0);
结束;
结束;
如果pl1it^.val>pl2it^.val,则
//玩家1获胜
战争:=nrCards
其他的
//玩家2获胜
战争:=-NR卡;
结束;
开始
readln(行);
size1:=stroint(ParseIn(1));
设置长度(卡片,尺寸1);
对于i:=0到大小1-1,请开始
readln(行);
//书写(标准,行);
案例行[1]
“1”:卡片[i]。val:=10;
“J”:卡片[i]。val:=11;
“Q”:卡片[i]。val:=12;
“K”:卡[i]。val:=13;
“A”:卡[i]。val:=14;
else卡片[i].val:=整数(第[1]行)-48;
结束;
如果i=size1-1,则
卡片[i]。下一个节点:=nil
其他的
卡片[i]。下一个节点:=@cards[i+1];
结束;
readln(行);
size2:=stroint(ParseIn(1));
设置长度(卡片,尺寸1+2);
对于i:=size1到size1+size2-1,开始
readln(行);
//书写(标准,行);
案例行[1]
“1”:卡片[i]。val:=10;
“J”:卡片[i]。val:=11;
“Q”:卡片[i]。val:=12;
“K”:卡[i]。val:=13;
“A”:卡[i]。val:=14;
else卡片[i].val:=整数(第[1]行)-48;
结束;
如果i=size1+size2-1,则
卡片[i]。下一个节点:=nil
其他的
卡片[i]。下一个节点:=@cards[i+1];
结束;
player1first:=@cards[0];
player1last:=@cards[size1-1];
player2first:=@cards[size1];
player2last:=@cards[size1+size2-1];
//现在开始比赛
而(player1第一个零)和(player2第一个零)确实开始
如果player1first^.val player2first^.val,则开始
如果player1first^.val>player2first^.val,则开始
//玩家1获胜
writeln(StdErr,“Player1获胜”);
winnerLast:=@player1last;
结束,否则开始
//玩家2获胜
writeln(StdErr,“Player2赢”);
winnerLast:=@player2last;
结束;
winnerLast^^.nextNode:=player1first;
winnerLast^:=player1first;
player1first:=player1first^.nextNode;
winnerLast^^.nextNode:=player2first;
winnerLast^:=player2first;
player2first:=player2first^.nextNode;
winnerLast^^.nextNode:=nil;
结束,否则开始
//战争
nrCards:=战争(玩家1第一,玩家2第一);
书面文件(标准“nrCards:”,nrCards);
如果nrCards=0,则
打破
如果nrCards>0,则开始
writeln(StdErr,“Player1获胜”);
winnerLast:=@player1last;
结束,否则开始
writeln(StdErr,“Player2赢”);
winnerLast:=@player2last;
nrCards:=-nrCards;
结束;
对于i:=0到nr-1,开始
winnerLast^^.nextNode:=player1first;
winnerLast^:=player1first;
player1first:=player1first^.nextNode;
结束;
对于i:=0到nr-1,开始
winnerLast^^.nextNode:=player2first;
winnerLast^:=player2first;
player2first:=player2first^.nextNode;
结束;
winnerLast^^.nextNode:=nil;
结束;
匝数:=匝数+1;
写(StdErr,“Player1:”);
cardIt:=玩家1第一;
而卡迪特没有开始
写(StdErr,cardIt^.val,”);
cardIt:=cardIt^.nextNode;
结束;
书面形式(标准格式,”);
写(StdErr,“Player2:”);
cardIt:=player2first;
而卡迪特没有开始
写(StdErr,cardIt^.val,”);
cardIt:=cardIt^.nextNode;
结束;
书面形式(标准格式,”);
结束;
//终局
如果nrCards=0,则
//相等的
书面语(‘PAT’)
否则,如果player2first=nil,则
//玩家2赢了
写入('1',圈数)
其他的
//玩家2赢了
书写('2',圈);
冲洗(标准);刷新(输出);//不要移除
结束。
nrCards: 5
Player1: 13 14 12 6
Player2: 2 3 4 7
Player1: 14 12 6
Player2: 3 4 7
Player1: 12 6
Player2: 4 7
Player1: 6
Player2: 7
Player1:
Player2: 6 7
2 5
readln(Line);
size1 := StrToInt(ParseIn(1));
Setlength(cards, size1);
for i := 0 to size1-1 do begin
    readln(Line);
    [...]
end;

readln(Line);
size2 := StrToInt(ParseIn(1));
Setlength(cards, size1+size2);
for i := size1 to size1+size2-1 do begin
cards : Array[0..51] of TNode;