Data structures 在Pascal中搜索多级链表

Data structures 在Pascal中搜索多级链表,data-structures,pascal,singly-linked-list,Data Structures,Pascal,Singly Linked List,因此,在这个项目中,我们被要求为一所大学创建一个数据库,大学分为学院,每个学院分为部门,同样,每个部门分为课程(专业),每个课程分为年级,每个年级都有一份学生名单。我使用链表实现了这一点,在用户填充数据库后,他们会获得一些与数据库交互的选项,例如添加和删除学生等。但是,当我尝试在数据库中搜索学生时,似乎搜索不好,尽管该方法在搜索课程时效果良好(它给出了课程所在的学院和系)。当程序执行时,它会给我们一条消息(“名称”在此数据库中不存在),这表明cmp仍然设置为0 Program Liked_lis

因此,在这个项目中,我们被要求为一所大学创建一个数据库,大学分为学院,每个学院分为部门,同样,每个部门分为课程(专业),每个课程分为年级,每个年级都有一份学生名单。我使用链表实现了这一点,在用户填充数据库后,他们会获得一些与数据库交互的选项,例如添加和删除学生等。但是,当我尝试在数据库中搜索学生时,似乎搜索不好,尽管该方法在搜索课程时效果良好(它给出了课程所在的学院和系)。当程序执行时,它会给我们一条消息(“名称”在此数据库中不存在),这表明cmp仍然设置为0

Program Liked_lists_database;
Type
Node = ^T;
T = record
    age : string;
    next, link : Node;
    end;
Var
Head, Tail, Last, tmp, tmp2, tmp3, tmp4, tmp5 : Node;
y : string;
cmp : integer;

Begin

  writeln('[+] Create your database [+]');
  writeln;
 Repeat
      write('Enter the name of the faculty : ');
    readln(j);
    if (j='exit') then break;
    if (Head = nil) then
    Begin
        new(Head);
        Tail := Head;
    End
    Else
    Begin
    new(Tail^.next);
    Tail := Tail^.next;
    End;
    Tail^.age := j;
    Tail^.next := nil;
        
        Repeat
            Write('Enter the name of the department : ');
            Readln(j);
            if (j='exit') then break;

            if (Tail^.link=Nil) Then
            Begin
                new(Tail^.link);
                Last := Tail^.link;
            End
            Else
            Begin
                new(Last^.next);
                Last := Last^.next;
            End;
            Last^.age := j;
            Last^.next := Nil;

            Repeat
            Write('Enter the name of the course : ');
            Readln(j);
            if (j='exit') then break;

            if (Tail^.link^.link=Nil) Then
            Begin
                new(Tail^.link^.link);
                Last := Tail^.link^.link;
            End
            Else
            Begin
                new(Last^.next);
                Last := Last^.next;
            End;
            Last^.age := j;
            Last^.next := Nil;

            Repeat
            Write('Enter the grade : ');
            Readln(j);
            if (j='exit') then break;

            if (Tail^.link^.link^.link=Nil) Then
            Begin
                new(Tail^.link^.link^.link);
                Last := Tail^.link^.link^.link;
            End
            Else
            Begin
                new(Last^.next);
                Last := Last^.next;
            End;
            Last^.age := j;
            Last^.next := Nil;

            Repeat
            Write('Enter the name of the student : ');
            Readln(j);
            if (j='exit') then break;

            if (Tail^.link^.link^.link^.link=Nil) Then
            Begin
                new(Tail^.link^.link^.link^.link);
                Last := Tail^.link^.link^.link^.link;
            End
            Else
            Begin
                new(Last^.next);
                Last := Last^.next;
            End;
            Last^.age := j;
            Last^.next := Nil;
        Until false;
        
        Until false;
        
        Until false;
        
        Until false;
        
Until false;
  
writeln;
writeln('...The database has been created successfully!');

// Search for a student
writeln('[+] Search for a student');
write('Enter the name of the student to Search for : ');
readln(y);
tmp := Head;
cmp := 0;
if (cmp=0) then
    While (tmp^.next<>Nil) Do
    Begin
        tmp2 := tmp^.link;
        While (tmp2^.next<>Nil) Do
        Begin
            tmp3 := tmp2^.link;
            While (tmp3^.next<>Nil) Do
            Begin
                tmp4 := tmp3^.link;
                While  (tmp4^.next<>Nil) Do
                Begin
                    tmp5 := tmp4^.link;
                    While (tmp5^.next<>Nil) Do
                    Begin
                        if (tmp5^.age=y) then
                            cmp := cmp + 1;
                        tmp5 := tmp5^.next;
                    End;
                    if (cmp>0) then
                        tmp4^.next := Nil
                    Else
                        tmp4 := tmp4^.next;
                End;
                if (cmp>0) then
                    tmp3^.next := Nil
                Else
                    tmp3 := tmp3^.next;
            End;
            if (cmp>0) then
                tmp2^.next := Nil
                Else
                    tmp2 := tmp2^.next;
        End;
        if (cmp>0) then
            tmp^.next := Nil
            Else
                tmp := tmp^.next;
    End;
if (cmp>0) then
Begin
writeln('Name : ',y);
writeln('Faculty : ', tmp^.age);
writeln('Department : ', tmp2^.age);
writeln('Speciality : ', tmp3^.age);
writeln('Grade : ', tmp4^.age);
End
Else
writeln(y, ' does not exist in this database');
  
End.
程序列表\u数据库;
类型
Node=^T;
T=记录
年龄:弦;
下一步,链接:节点;
结束;
变量
头、尾、尾、尾、tmp、tmp2、tmp3、tmp4、tmp5:节点;
y:字符串;
cmp:整数;
开始
writeln(“[+]创建数据库[+]”);
书面语;
重复
写('输入教员姓名:');
readln(j);
如果(j='exit'),则中断;
如果(水头=零),则
开始
新(首长);;
尾:=头;
终点
其他的
开始
新的(尾^下一个);
Tail:=Tail^.next;
结束;
尾^年龄:=j;
Tail^.next:=nil;
重复
填写('输入部门名称:');
Readln(j);
如果(j='exit'),则中断;
如果(Tail^.link=Nil),则
开始
新的(尾链接);
最后:=Tail^.link;
终点
其他的
开始
新的(上一次^下一次);
Last:=Last^.next;
结束;
最后年龄:=j;
Last^.next:=Nil;
重复
写('输入课程名称:');
Readln(j);
如果(j='exit'),则中断;
如果(Tail^.link^.link=Nil),则
开始
新的(尾部链接);
最后:=Tail^.link^.link;
终点
其他的
开始
新的(上一次^下一次);
Last:=Last^.next;
结束;
最后年龄:=j;
Last^.next:=Nil;
重复
写(‘输入成绩:’);
Readln(j);
如果(j='exit'),则中断;
如果(Tail^.link^.link^.link=Nil),则
开始
新增(尾链接^.link^.link^.link);
最后:=Tail^.link^.link^.link;
终点
其他的
开始
新的(上一次^下一次);
Last:=Last^.next;
结束;
最后年龄:=j;
Last^.next:=Nil;
重复
写('输入学生姓名:');
Readln(j);
如果(j='exit'),则中断;
如果(Tail^.link^.link^.link^.link^.link=Nil),则
开始
新建(Tail^.link^.link^.link^.link^.link);
最后:=Tail^.link^.link^.link^.link^.link;
终点
其他的
开始
新的(上一次^下一次);
Last:=Last^.next;
结束;
最后年龄:=j;
Last^.next:=Nil;
直到错误;
直到错误;
直到错误;
直到错误;
直到错误;
书面语;
writeln(“…数据库已成功创建!”);
//寻找学生
writeln(“[+]搜索学生”);
写('输入要搜索的学生的姓名:');
readln(y);
tmp:=水头;
cmp:=0;
如果(cmp=0),则
而(tmp^.nextNil)呢?
开始
tmp2:=tmp^.link;
而(tmp2^.nextNil)呢
开始
tmp3:=tmp2^.link;
而(tmp3^.nextNil)呢
开始
tmp4:=tmp3^.link;
而(tmp4^.nextNil)呢
开始
tmp5:=tmp4^.link;
而(tmp5^.nextNil)呢
开始
如果(tmp5^.age=y),则
cmp:=cmp+1;
tmp5:=tmp5^.next;
结束;
如果(cmp>0),则
tmp4^.next:=Nil
其他的
tmp4:=tmp4^.next;
结束;
如果(cmp>0),则
tmp3^.next:=Nil
其他的
tmp3:=tmp3^.next;
结束;
如果(cmp>0),则
tmp2^.next:=Nil
其他的
tmp2:=tmp2^.next;
结束;
如果(cmp>0),则
tmp^.next:=Nil
其他的
tmp:=tmp^.next;
结束;
如果(cmp>0),则
开始
writeln('名称:',y);
书面语(“教员:”,tmp^.年龄);
书面文件(‘部门:’,tmp2^年龄);
书面语(“专业:”,tmp3^.年龄);
书面语(‘年级:’,tmp4^.年龄);
终点
其他的
writeln(y,‘此数据库中不存在’);
结束。
编辑:问题在于多级链表和搜索算法的实现

Program Liked_lists_database;
Type
Node = ^T;
T = record
    age : string;
    next, link : Node;
    end;
Var
Head, Tail, tmp, Last : Node;
j: string;
num : integer;

Procedure searchCourse;
Var
cmp : integer;
y : string;
tmp, tmp2, tmp3 : Node;
Begin
writeln('[+] Search for a course');
write('Enter the name of the course to Search for : ');
readln(y);
tmp := Head;
cmp := 0;

if (tmp^.next=Nil) Then
    new(tmp^.next);
While (tmp^.next<>Nil) Do
Begin
    tmp2 := tmp^.link;
    if (tmp2^.next=Nil) Then
        new(tmp2^.next);
    While (tmp2^.next<>Nil) Do
    Begin
        tmp3 := tmp2^.link;
        While (tmp3<>Nil) Do
        Begin
            if (tmp3^.age=y) Then
            Begin
                writeln('[', y, '] is found in faculty of [ ', tmp^.age, ']', ' department of [', tmp2^.age, ']');
                cmp := 1;
            End;
            tmp3 := tmp3^.next;
        End;
        if (cmp=0) Then
        Begin
            tmp2 := tmp2^.next;
            if (tmp2^.next=Nil) Then
            new(tmp2^.next);
        End
        Else
            tmp2^.next := Nil;
    End;
    if (cmp=0) Then
        Begin
            tmp := tmp^.next;
            if (tmp^.next=Nil) Then
            new(tmp^.next);
        End
        Else
            tmp^.next := Nil;
End;           

if (cmp=0) Then
    writeln ('[', y, '] : there is no such course');

End;

Begin
    // Fillin in the database
  writeln('[+] Create your database [+]');
  writeln;

        Repeat
          write('Enter the name of the faculty : ');
        readln(j);
        if (j='exit') then break;
        if (Head = nil) then
        Begin
            new(Head);
            Tail := Head;
        End
        Else
        Begin
        new(Tail^.next);
        Tail := Tail^.next;
        End;
        Tail^.age := j;
        Tail^.next := nil;
            
            Repeat
                Write('Enter the name of the department : ');
                Readln(j);
                if (j='exit') then break;

                if (Tail^.link=Nil) Then
                Begin
                    new(Tail^.link);
                    Last := Tail^.link;
                End
                Else
                Begin
                    new(Last^.next);
                    Last := Last^.next;
                End;
                Last^.age := j;
                Last^.next := Nil;

                Repeat
                Write('Enter the name of the course : ');
                Readln(j);
                if (j='exit') then break;

                if (Tail^.link^.link=Nil) Then
                Begin
                    new(Tail^.link^.link);
                    Last := Tail^.link^.link;
                End
                Else
                Begin
                    new(Last^.next);
                    Last := Last^.next;
                End;
                Last^.age := j;
                Last^.next := Nil;

                Repeat
                Write('Enter the grade : ');
                Readln(j);
                if (j='exit') then break;

                if (Tail^.link^.link^.link=Nil) Then
                Begin
                    new(Tail^.link^.link^.link);
                    Last := Tail^.link^.link^.link;
                End
                Else
                Begin
                    new(Last^.next);
                    Last := Last^.next;
                End;
                Last^.age := j;
                Last^.next := Nil;

                Repeat
                Write('Enter the name of the student : ');
                Readln(j);
                if (j='exit') then break;

                if (Tail^.link^.link^.link^.link=Nil) Then
                Begin
                    new(Tail^.link^.link^.link^.link);
                    Last := Tail^.link^.link^.link^.link;
                End
                Else
                Begin
                    new(Last^.next);
                    Last := Last^.next;
                End;
                Last^.age := j;
                Last^.next := Nil;
            Until false;
            
            Until false;
            
            Until false;
            
            Until false;
            
    Until false;

writeln;
writeln('...The database has been created successfully!');

searchCourse;

Readln;
End.
程序列表\u数据库;
类型
Node=^T;
T=记录
年龄:弦;
下一步,链接:节点;
结束;
变量
头部、尾部、tmp、最后:节点;
j:弦;
num:整数;
程序和课程;
变量
cmp:整数;
y:字符串;
tmp,tmp2,tmp3:节点;
开始
writeln(“[+]搜索课程”);
write('输入要搜索的课程名称:');
readln(y);
tmp:=水头;
cmp:=0;
如果(tmp^.next=Nil),则
新的(tmp^下一个);
而(tmp^.nextNil)呢?
开始
tmp2:=tmp^.link;
如果(tmp2^.next=Nil),则
新的(tmp2^下一个);
而(tmp2^.nextNil)呢
开始
tmp3:=tmp2^.link;
而(tmp3Nil)呢
开始
如果(tmp3^.age=y),则
开始
writeln(“[”,y,”)可在[”,tmp^.age,“]”的教员中找到,