Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2012, 22:25   #1
Npwas
Форумчанин
 
Аватар для Npwas
 
Регистрация: 26.09.2011
Сообщений: 158
Восклицание Списки с указателями!!! Ошибка!!!(Delphi)

У меня проблемы с выводом, может и добавляет подтермин не правильно, толком не могу никак разобраться с ошибкой!!! Уже не первый день долблюсь, исправьте ошибку(ошибки) кто может!!! НАЙДИТЕ ОШИБКУ КТОНИБУДЬ, ПОЖ*Л*ЙСТА, МОЙ МОЗГ ПРОСТО КЛИНИТ ПРИ ПОПЫТКЕ ВНИКНУТЬ В РАБОТУ СО СПИСКАМИ!!!
Код:
program Slovarik;

{$APPTYPE CONSOLE}

uses
  SysUtils;

TYPE
  Ukazatel = ^LIST;
  LIST = record
    termin:string;
    next:Ukazatel;
    sub :Ukazatel;
  end;

VAR
  term_list,Mt:Ukazatel;
  term_dop:string;
  g:Integer;
  ololo:boolean;

{ПРОЦЕДУРА ДОБАВЛЕНИЯ ТЕРМИНА В СПИСОК}
PROCEDURE Vvod_term(term_pr:string);
 Var
   tmp:Ukazatel;
 BEGIN
  IF term_list=nil Then
    Begin
      new(term_list);
      tmp:=term_list ;
      Mt:=term_list;
    End
  Else
   Begin
     tmp:=term_list;
     Mt:=term_list;
     While tmp^.next <> nil Do
               tmp:=tmp^.next;
     new(tmp^.next);
     tmp:=tmp^.next;
     Mt:=term_list;
   End;
  tmp^.next:=nil;
  tmp^.termin:=term_pr;
 END;

{ПРОЦЕДУРА ДОБАВЛЕНИЯ ПОДТЕРМИНА В СПИСОК}
procedure Vvod_subterm(main_term:Ukazatel;term_pr:string);
var tmp:Ukazatel;
begin
  if term_list=nil then
    // нет терминов для добавления подтерминов
    exit;
  if main_term=nil then begin
    // неопределен термин верхнего уровня
    exit;
  end;
  if main_term^.sub = nil then begin
    // список подтерминов пуст, создаем новый
    new(main_term^.sub);
    main_term^.sub:=term_list;
  end
  else begin
    // список подтерминов существует, ищем последний элемент и к нему вяжем новый
    tmp:=main_term^.sub;
    while tmp^.next <> nil do
      tmp:=tmp^.next;
    new(tmp^.next);
    tmp:=tmp^.next;
  end;
  tmp^.next:=nil;
  tmp^.termin:=term_pr;
end;


{ПРОЦЕДУРА ВЫВОДА}
PROCEDURE Vivod;
 BEGIN
  term_list:=Mt;
  IF term_list<>nil Then
    While term_list<>nil Do
      Begin
        Writeln(term_list^.termin);
        term_list:=term_list^.sub;
           While term_list<>nil Do
             Begin
              Writeln(term_list^.termin);
              term_list:=term_list^.next;
             End ;
        term_list:=term_list^.next;
      End
  Else
    Writeln('Spisok pust');
  term_list:=Mt;
  writeln;
 END;
{ПРОЦЕДУРА ПОИСКА ТЕРМИНА}
PROCEDURE Found(term_pr:string);
Var
  found_termin:Ukazatel;
 BEGIN
   ololo:=true;
   term_list:=Mt;
   While term_list <> nil Do
     Begin
      IF (term_list^.termin=term_pr) and (ololo) then
        Begin
         Writeln;
         Writeln('Vi etot termin iskali:  ',term_list^.termin);
          found_termin:=term_list^.next;
         ololo:=false
        End
      Else
       term_list:=term_list^.next;
     End;
     term_list:=found_termin;
   Writeln;
 END;

{ПРОЦЕДУРА УДАЛЕНИЯ УКАЗАННОГО ТЕРМИНА}
PROCEDURE Del(term_pr : string);
 Var
   x, dx : Ukazatel ;
 BEGIN
  Found(term_pr);
  IF ololo Then
   Begin
    Writeln('Takogo termina net v spiske');
    Writeln
   End
  Else
   Begin
    x:=term_list;
    While x<>Nil do
      IF x^.termin=term_pr Then
          Begin
            IF x=term_list Then
                Begin
                  term_list:=term_list^.Next;
                  Dispose(x);
                  x:=term_list
                End
            Else
                Begin
                  dx^.Next:=x^.Next;
                  Dispose(x);
                  x:=dx^.Next
                End
          End
      Else
          Begin
            dx:=x;
            x:=x^.Next
          End;
    Writeln('Teper dannij temin udalen');
    Writeln
   End
 END;


BEGIN
  g:=1;
  While g<>0 Do
   Begin
     Writeln('1.Vvod termina');
     Writeln('2.Vivod vsego');
     Writeln('3.Poisk termina');
     Writeln('4.Udalenije termina');
     Writeln('5.Vvod subtermina');
     Writeln('0.Vihod iz programmi');
     Readln(g);
     Writeln;
     Case g of
        1: Begin
            Write('Vvedite termin:  ');
            Readln(term_dop);
            Vvod_term(term_dop)
           End;
        2: Vivod;
        3: Begin
            Write('Vvedite iskomij termin:  ');
            Writeln;
            Readln(term_dop);
            Found(term_dop)
           End;
        4: Begin
            Write('Kakoj termin vi hotite udalitj:  ');
            Readln(term_dop);
            Del(term_dop)
           End;
        5: Begin
            Write('Vvedite termin:');
            Readln(term_dop);
            Found(term_dop);
            Write('Vvedite subtermin:');
            Readln(term_dop);
            Vvod_subterm(term_list,term_dop);
           End
     End
   End;
END.
<----Весы Там.

Последний раз редактировалось Npwas; 15.04.2012 в 22:33.
Npwas вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Списки с указателями,исправьте ошибку!(Delphi) Npwas Помощь студентам 0 14.04.2012 22:36
Спсики с указателями, список в списке?!(Delphi) Npwas Помощь студентам 3 28.03.2012 02:09
Списки с указателями!(Delphi) Npwas Помощь студентам 2 27.03.2012 13:32
Списки с указателями, как пользоватьс?(Delphi) Npwas Помощь студентам 0 26.03.2012 13:27
Работа с указателями. Ошибка сегментации. agronomchek Помощь студентам 1 24.08.2010 14:51