微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Pascal 中搜索多级链表

如何解决在 Pascal 中搜索多级链表

所以在这个程序中我们被要求为一所大学创建一个数据库,大学分为院系,每个院系又分为系,同样,每个系分为课程(专业),每门课程分为年级,并且每个年级都有一个学生列表。我使用链表实现了这一点,在用户填充数据库后,他们会获得一些与数据库交互的选项,例如添加删除学生等。 但是,当我尝试在数据库搜索学生时,似乎没有搜索很好,尽管该方法搜索课程时效果很好(它给出了课程所在的学院和部门)。当程序执行时,它会给我们一条消息(“name”在这数据库中不存在),表明 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.

编辑:问题在于多级链表和搜索算法的实现

Program Liked_lists_database;
Type
Node = ^T;
T = record
    age : string;
    next,Last : Node;
j: string;
num : integer;

Procedure searchCourse;
Var
cmp : integer;
y : string;
tmp,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 ('[','] : 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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。