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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2011, 15:19   #1
WarDen14
 
Регистрация: 25.12.2011
Сообщений: 7
По умолчанию Линейные списки

Помогите, пожалуйста, найти ошибку в коде. Выводит только первый элемент линейного списка и последний под "*".
Дан линейный список с информацией о студентах(ФИО, стипендия, группа, номер зачетки)
Вложения
Тип файла: txt ы.txt (1.6 Кб, 119 просмотров)
WarDen14 вне форума Ответить с цитированием
Старый 26.12.2011, 15:59   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) зачем Вы используете ДВУНАПРАВЛЕННЫЕ списки? Вы же всё равно используете их как простые однонаправленные.
Ну, например, переменную TAIL вы вообще не зайдействовали.

2) ну это ещё всё полбеды.
Процедура добавления элементов в список после текущего реализована не совсем корректно.

а в остальном у Вас всё более менее правильно.


я предлагаю так изменить процедуру:
Код:
procedure InsAfterCur(var pCur: plist; st: stud); {Вставка после текущего}
var ptr, tmpNext: plist;
begin
  new(ptr);
  ptr^.data := st;
  tmpNext := pCur^.next;
  pCur^.next := ptr;
  ptr^.prev := pCur;
  ptr^.next := tmpNext;
  pCur := ptr;
end;

Последний раз редактировалось Serge_Bliznykov; 26.12.2011 в 16:10.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.12.2011, 16:04   #3
WarDen14
 
Регистрация: 25.12.2011
Сообщений: 7
По умолчанию ...

а не могли бы вы, пожалуйста, подкорректировать процедуру дополнения списка?
WarDen14 вне форума Ответить с цитированием
Старый 26.12.2011, 16:24   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

мой пост выше...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.12.2011, 16:35   #5
WarDen14
 
Регистрация: 25.12.2011
Сообщений: 7
По умолчанию

спасибо большое!
WarDen14 вне форума Ответить с цитированием
Старый 26.12.2011, 18:30   #6
WarDen14
 
Регистрация: 25.12.2011
Сообщений: 7
По умолчанию

не могли бы еще чем помочь.. нашел процедуру удаления узла в списке, но вот с какими параметрами к ней обращаться?

Код:
procedure DelCur( var H,T,pCur : plist); 
 var ptr  : plist;
 begin
  if (pCur<>H) and (pCur<>T) then begin
   ptr:=pCur;
   ptr^.prev^.next:=pCur^.next;
   pCur^.next^.prev:=pCur^.prev;
   pCur:=pCur^.next;
   dispose(ptr);
   end
  else
   if (pCur=H) and (pCur<>T) then begin
    ptr:=pCur;
    ptr^.next^.prev:=NIL;
    pCur:=pCur^.next;
    dispose(ptr);
    H:=pCur;
    end
   else if (pCur<>H) and (pCur=T) then begin
    ptr:=pCur;
    ptr^.prev^.next:=NIL;
    pCur:=pCur^.prev;
    dispose(ptr);
    T:=pCur;
    end
   else if (pCur=T) and (pCur=H) then begin
    ptr:=pCur;
    dispose(ptr);
    pCur:=NIL;
    H:=NIL;
    T:=NIL;
    end;
end;

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 27.12.2011 в 00:04.
WarDen14 вне форума Ответить с цитированием
Старый 26.12.2011, 21:02   #7
WarDen14
 
Регистрация: 25.12.2011
Сообщений: 7
По умолчанию

ап________________
WarDen14 вне форума Ответить с цитированием
Старый 27.12.2011, 00:09   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

очевидно, что в неё передаются три параметра:
H - указатель на "голову" списка (у Вас это Head)
T - это указатель на "хвост" списка (у Вас это Tail - только нужно дописать, чтобы он в вашей программе корректно иницилизировался и изменялся. Иначе ничего не будет работать!
у вас работа с хвостом не реализована!
ну и pCur - это указатель на тот элемент списка, который необходимо удалить.


ps. сам код удаления я не смотрел...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.12.2011, 01:12   #9
WarDen14
 
Регистрация: 25.12.2011
Сообщений: 7
По умолчанию

спасибо...!
WarDen14 вне форума Ответить с цитированием
Старый 27.12.2011, 03:10   #10
WarDen14
 
Регистрация: 25.12.2011
Сообщений: 7
По умолчанию

а не могли бы, пожалуйста, помочь с инициализацией хвоста списка в основной программе, где tail-это хвост списка, intail-процедура вставки в конец списка. Пытаюсь прогонять в цикле, но почему-то после ввода второго узла программа вылетает



Код:
var Tail:plist;
writeln('FIO');
readln(st.fio);
writeln('Stipendia');
readln(st.stip);
writeln('Group');
readln(st.group);
writeln('Zachetka');
readln(st.nz);
 intail(tail,st)
 while tail^.Next <> nil do
      tail := tail^.Next;
Сама процедура
Код:
rocedure InTail(var L: pList; item: stud);
var
  p, q: plist;
begin
  p := New(plist);
  p^.Data := item;
  p^.Next := nil;
  if L = nil then begin
     p^.Prev := nil;
     L := p;
    end
  else begin
     q:= L;
     while q^.Next <> nil do
      q := q^.Next;
     q^.Next := p;
     p^.Next := nil;
     p^.Prev := q;
    end;
end;
WarDen14 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Линейные списки stck Общие вопросы C/C++ 0 02.06.2011 22:00
Линейные списки Anny_Apple Паскаль, Turbo Pascal, PascalABC.NET 0 04.04.2011 22:18
Линейные списки Dead Romantic Помощь студентам 0 30.05.2010 21:35
Линейные списки ManU Помощь студентам 1 03.11.2008 21:20