List 如何从Pascal中的输入形成链表?

List 如何从Pascal中的输入形成链表?,list,pascal,turbo-pascal,List,Pascal,Turbo Pascal,我有一个格式为的输入文件: (a n),(a n-1)。。。(a0) 如何在Pascal中形成如下列表 type tt = ^t; t = record a: Integer; n: Integer; next: tt end; 例如: (510),(59),(58),(57),(56),(55),(54),(53),(52),(51),(50) 应该与图像上的类似: 新代码(按预期工作): program ex4_19; type

我有一个格式为的输入文件:

(a n),(a n-1)。。。(a0)

如何在Pascal中形成如下列表

type
  tt = ^t;
  t = record
       a: Integer;
       n: Integer;
       next: tt
  end;
例如:
(510),(59),(58),(57),(56),(55),(54),(53),(52),(51),(50)
应该与图像上的类似:

新代码(按预期工作):

program ex4_19;

type
  tt = ^t;
  t = record
       a: Integer;
       n: Integer;
       next: tt
  end;

var
  ukzv, ukrs: tt;
  inp: text;
  raDone: boolean;
  i: integer;
  str: string;
begin
  assign(inp, 'f1.txt'); reset(inp);
  assign(output, 'out.txt'); rewrite(output);

  new(ukzv);
  ukrs:=ukzv; 

  read(inp, str);
  writeln(str);

  for i:=1 to length(str) do
  begin
    case str[i] of
      '(':
      begin
         raDone:=false;
         new(ukzv^.next);
         ukzv:=ukzv^.next;
         ukzv^.a:=0;
         ukzv^.n:=0;
      end;
      '0' .. '9':
      begin
         if raDone = false then
            ukzv^.a:=ukzv^.a * 10 + (ord(str[i]) - ord('0'))
         else
            ukzv^.n:=ukzv^.n * 10 + (ord(str[i]) - ord('0'));
      end;
      ' ':
      begin
         if raDone = false then
         begin
            raDone:=true;
         end;
      end;
      ')':
      begin
         ukzv^.next:=nil;
      end;
    end;
  end;

   ukzv:=ukrs;

   while ukzv^.next <> nil do
   begin
     writeln(ukzv^.next^.a, ' ', ukzv^.next^.n);
     ukzv:=ukzv^.next;
   end;
end.
程序ex4_19;
类型
tt=^t;
t=记录
a:整数;
n:整数;
下一个:tt
终止
变量
ukzv,ukrs:tt;
inp:文本;
raDone:布尔型;
i:整数;
str:字符串;
开始
赋值(inp,'f1.txt');复位(inp);
赋值(输出'out.txt');重写(输出);
新的(ukzv);
ukrs:=ukzv;
读(inp,str);
writeln(str);
对于i:=1到长度(str)do
开始
案件str[i]
'(':
开始
raDone:=假;
新的(ukzv^下一个);
ukzv:=ukzv^.next;
ukzv^.a:=0;
ukzv^.n:=0;
终止
'0' .. '9':
开始
如果raDone=false,则
ukzv^.a:=ukzv^.a*10+(ord(str[i])-ord('0'))
其他的
ukzv^.n:=ukzv^.n*10+(ord(str[i])-ord('0');
终止
' ':
开始
如果raDone=false,则
开始
raDone:=真;
终止
终止
')':
开始
ukzv^.next:=nil;
终止
终止
终止
ukzv:=ukrs;
而ukzv^。下一个零做
开始
书面形式(ukzv^.next^.a',,ukzv^.next^.n);
ukzv:=ukzv^.next;
终止
终止

我有错误“无效的数字格式”,因为在第二个数字后面有“')。直到',我才知道如何读取数字,因为数字可以不同(1-1000)。

有不同的方法,其中一种方法如下。从将文件读入字符串变量开始

'(5 10), (5 9), (5 8), (5 7), (5 6), (5 5), (5 4), (5 3), (5 2), (5 1), (5 0)'
然后使用循环(
for..do
repeat..till
while..do
)逐个遍历字符。使用案例陈述来决定操作

下面是每个字符的处理过程,应该直接作为
case
语句实现

您需要一个布尔值(例如,
raDone:boolean
)来指示记录中的新数字是指向
a
还是
n

Get next char, '(', you know it's time to link in a new record (`r` in the following).
Get next char, '5', it's a digit and `not raDone`, so you accumulate `r.a` with it. See below!
Get next char, ' ', it's a space and `not raDone`, you know that entry for `r.a` has ended, set `raDone` to indicate next digits belong to `r.n`.
Get next char, '1', it's a digit and `raDone`, so you accumulate `r.n` with it.
Get next char, '0', it's a digit and `raDone`, so you accumulate `r.n` with it.
Get next char, ')', you know the entry for the current record is ready. 
Get next char, comma, nothing to do, just skip it
Get next char, ' ', space, nothing to do, just skip it
用十进制数字(从字符转换而来)累加二进制值(如r.n):


您可能希望在输入字符串中添加错误检查以查找错误内容。

您尝试了什么,以及如何失败?不是代码编写服务;你应该提供一份关于你的具体问题的报告,并描述你为解决这个问题所做的努力以及这些努力是如何不足的。请看一个好问题。@JeffZeitlin抱歉,已更新。我不知道如何执行那项任务。我不认为我上面的代码会对某人有所帮助,因为它只是一点点。开始提示:你需要纯粹地以字符串的形式读取输入,然后将其解析出来以得到你的数字。@JeffZeitlin我已经尝试过了,我已经删除了所有的“)”,“(“,”,“,”,但我不知道如何读取这个字符串。我有一个字符串“5 10 5 5 8…5 0”。我该怎么办?我希望它可以与不同的数字一起使用,例如“15 399 15 398…15 0”。它通常被称为乘法累加(或仅累加)。谢谢@Rudy,累加在这种情况下感觉很合适。@TomBrunberg我忘了说谢谢。谢谢:)
r.n := r.n * 10 + (ord(decimal character) - ord('0');