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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2012, 02:18   #1
netiv
Пользователь
 
Регистрация: 12.10.2011
Сообщений: 33
По умолчанию Напишите программу с использованием динамических структур

Здравствуйте.

Вот сделал 1 задание
Составьте программу, которая формирует список студентов, добавляя фамилии в начало списка. Данные вводятся с клавиатуры. Если вместо ввода фамилии нажата клавиша <Enter>, что равно вводу пустой строки, то программа показывает и распечатывает введенный список.

Код:
Program z1;
type
p_student=^student;
student=record
name:string[20];
next:p_student;
end;
var
head: p_student; 
curr: p_student; 
buf: string[20]; 
begin
repeat
write ('familiya->');
readln (buf);
if length (buf)<>0 then
begin
new (curr);
curr^.name:=buf;
curr^.next:=head;
head:=curr;
end;
until length (buf)=0;
writeln ('**Vvedenniy spisok**');
curr:=head;
while curr<>NIL do begin
writeln (curr^.name);
curr:=curr^.next;
end;
readln;
end.
В коде выше, фамилии добавляются в начало списка.
Собственно вопрос: Как сделать тоже задание, но чтобы фамилии добавлялись не в начало списка, а в середину?
Буду благодарен за помощь.
netiv вне форума Ответить с цитированием
Старый 02.03.2012, 11:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а что не получается? В середину, это после какой записи?

общий принцип добавления после какой-то записи будет (в случае однонаправленного списка, как у Вас, выглядеть так:
Код:
program z1;
type
  p_student = ^student;
  student = record
    name: string[20];
    next: p_student;
  end;

var
  head : p_student;
  curr, tmp : p_student;
  buf  : string[20];
  i, k : integer;
begin
  head := nil;
  repeat
    write('familiya->');
    readln(buf);
    if length(buf) <> 0 then
    begin
      new(curr);
      curr^.name := buf;
      curr^.next := head;
      head := curr;
    end;
  until length(buf) = 0;

  writeln('**Vvedenniy spisok**');
  curr := head;
  i := 1;
  while curr <> nil do begin
    writeln(i:2,' ', curr^.name);
    curr := curr^.next;
    inc(i);
  end;
  WriteLn;

  {теперь добавим фамилии после K-й записи}
  WriteLn('после какой вставить: ');
  readln(K);

  i:=1;
  curr := head;
  while (curr <> nil) and (i<K) do begin
    curr := curr^.next;
    inc(i);
  end;
  if curr=nil then
    WriteLn('Нет столько записей в списке! (там всего ',i-1,' запись(-и)(-ей) )')
  else begin
     WriteLn('Вставлять будем после ',i,'-й записи. Введите вставляемые фамилии.');
     repeat
       write('familiya->');
       readln(buf);
       if length(buf) <> 0 then
       begin
         new(tmp);
         tmp^.name := buf;
         tmp^.next := curr^.next;
         curr^.next := tmp;
       end;
     until length(buf) = 0;

    WriteLn;
    writeln('** Vvedenniy spisok posle **');
    i := 1;
    curr := head;
    while curr <> nil do begin
       writeln(i:2,' ', curr^.name);
       curr := curr^.next;
       inc(i);
    end;
    WriteLn;

  end;



  readln;
end.
p.s. если вы обратит внимание, то вставка ДО самой первой записи не сделана специально! В этом случае ещё надо будет корректировать head. впрочем, если Вы разберёте пример, то, в случае необходимости, легко сможете модифицировать программу...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.03.2012, 12:51   #3
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

принцип прост:
- при добавлении в конец массива (очередь), нужно помимо ссылки на первый элемент запоминать и ссылку на последний элемент. тогда добавление организуется в три этапа:
1. создаём новый элемент
2. устанавливаем указатель из последнего элемента на вновь созданный.
3. устанавливаем указатель конца массива на созданный элемент

- при добавлении в начало массива (стек), добавление элемента происходит так:
1. создаём новый элемент
2. устанавливаем указатель созданного элемента = указателю вершины массива
3. устанавливаем указатель вершины массива на созданный элемент.

- при добавлении в середину массива происходит чуть больше операций. но тоже несложно:
1. создаём новый элемент
2. устанавливаем указатель созданного элемента = указателю на элемент, перед которым будет вставка (или указателю элемента, за которым будет вставка).
3. устанавливаем указатель элемента, за которым происходит вставка, на новый элемент.

главное - не путать порядок действий, чтобы не потерять какой-либо элемент или указатель. Т.е. сначала присваиваем указателю созданного элемента адрес уже существующего(или nil если это требуется), а лишь после этого в существующих элементах делаем ссылку на текущий.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 02.03.2012 в 12:54.
DiemonStar вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Напишите программу с использованием рекурсии для поиска наименьшего элемента массива netiv Паскаль, Turbo Pascal, PascalABC.NET 4 17.02.2012 13:57
Описать одну из сложных динамических структур данных Sobaka_ru Помощь студентам 3 18.01.2012 21:18
Разработка динамических структур данных CW_13 Помощь студентам 0 18.12.2011 22:46
Массив динамических структур. Проблема с выделением памяти. Алексей Емеля Общие вопросы C/C++ 6 15.07.2011 19:24
Создание и использование динамических структур Oksana11 Помощь студентам 5 09.01.2008 19:39