Pascal 帕斯卡列表问题

Pascal 帕斯卡列表问题,pascal,Pascal,我现在面临一个与Pascal中的列表相关的问题。 当我添加一个人时,它会成功,但当我要添加下一个人时,它会抛出一个错误: 艾德:拉扎勒斯 代码(在代码开头,头部等于零): 类型 个人=记录 名称:字符串[15]; 姓氏:字符串[15]; 年龄:整数; 结束; pListElement=^listedelement; ListElement=记录 人:^人; 下一步:pListElement; 结束; 程序负责人(var负责人:PLISTELENT); 程序展示人员(var负责人:PLISTELE

我现在面临一个与Pascal中的列表相关的问题。 当我添加一个人时,它会成功,但当我要添加下一个人时,它会抛出一个错误:

艾德:拉扎勒斯

代码(在代码开头,头部等于零):

类型
个人=记录
名称:字符串[15];
姓氏:字符串[15];
年龄:整数;
结束;
pListElement=^listedelement;
ListElement=记录
人:^人;
下一步:pListElement;
结束;
程序负责人(var负责人:PLISTELENT);
程序展示人员(var负责人:PLISTELENT);
实施
程序负责人(var负责人:PLISTELENT);
Var NewPerson:pListElement;
开始
新人;
写('Podaj imie:');
readln(NewPerson^.Person^.name);
写('Podaj nazwisko:');
readln(NewPerson^.Person^.last_name);
写('Podaj wiek:');
readln(新人年龄);
如果(水头=零),则
开始
头:=新人;
NewPerson^.next:=nil;
结束其他
开始
NewPerson^.next:=头;
新人:=人头;
结束;
结束;
程序展示人员(var负责人:PLISTELENT);
开始
如果(头零)那么
开始
作者(“|”,head^.Person^.姓名:15,“|”,head^.Person^.姓氏:15,“|”,head^.Person^.年龄:3,”);
演艺人员(负责人^下一位);
结束;
结束;

问题在于,当您在Addperson中创建一个新的ListElement记录时,您假定此人已神奇地初始化。事实并非如此。需要查找或创建(new()'ed),这取决于它的实际用途。

我们看不到您的屏幕。当错误发生时,具体执行哪一行?ide不知道哪一行。屏幕是可见的。我很惊讶它不能告诉你哪一行。无论如何,如果是这样的话,请按照我们过去的做法—注释掉过程中的所有行,然后逐个重新引入它们,直到错误再次出现。调试器会准确地告诉您是哪一行导致了问题。学会使用它。我不懂,所以我也应该创造一个新的人?还是什么?我不知道。你把那个人变成了一个指针。为什么不直接将person字段放在listelement中?您现在这样做可能是因为,例如,当多个ListElement项可以指向同一个人或类似的对象时,您需要两个新的()s。一个用于
NewPerson
pListElement,一个用于它包含的
person
指针。它们都是指针,因此需要为它们分配内存,New()就是这样做的。
TYPE

  Person = RECORD
    name: STRING[15];
    last_name: STRING[15];
    age: INTEGER;
  end;

  pListElement = ^ListElement;

  ListElement = RECORD
    person: ^Person;
    next: pListElement;
  end;




PROCEDURE AddPerson(var head: pListElement);
PROCEDURE ShowPersons(var head: pListElement);



implementation

PROCEDURE AddPerson(var head: pListElement);
 Var NewPerson: pListElement;
   Begin
     new(NewPerson);
     Write(' Podaj imie: ');
     readln(NewPerson^.Person^.name);
     Write(' Podaj nazwisko: ');
     readln(NewPerson^.Person^.last_name);
     Write(' Podaj wiek: ');
     readln(NewPerson^.Person^.age);
     if (head = NIL) THEN
     begin
       head:= NewPerson;
       NewPerson^.next:= nil;
     end else
     begin
       NewPerson^.next:= head;
       NewPerson:= head;
     end;
   End;


  PROCEDURE ShowPersons(var head: pListElement);
   Begin
    if (head <> NIL) THEN
      begin
        WriteLn(' | ', head^.Person^.name:15, ' | ', head^.Person^.last_name:15, ' | ', head^.Person^.age:3, '  |');
        ShowPersons(head^.next);
      end;
    End;