Pascalist+

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Pascalist+ » Помощь в решении задач » Динамический линейный список


Динамический линейный список

Сообщений 1 страница 3 из 3

1

Здравствуйте. Помогите решить одну задачу!
Условие задачи:
1. Создание упорядоченного линейного динамического списка.
2. Добавление элементов (или узлов) в список без нарушения упорядоченности.
3. Поиск в упорядоченном списке заданной информации с выводом ее на экран.
4. Удаление заданных элементов из списка.
5. Вывод линейного списка на экран производить в графическом режиме после выполнения пунктов 1,2 и 4.
6. Выбор решаемых задач (1-5) производить с помощью разработанного меню.
По каркасу задания:

"Поиск в линейном списке и вывод на экран записей о всех студентах, имеющих шифр, начинающийся с символа "В". Удаление из списка записей о студентах с шифром, начинающимся с символа "С". Упорядочение линейного списка по возрастанию года рождения. Вставка записей в список без нарушения упорядочения.
Вот пример списка студентов:

Код:
1 Иванов Иван Иванович CBD 1994
2 Геннадьев Геннадий Геннадьевич BCD 1995
3 Шарамазов Кира Испанович DBC 1997
4 Васильев Василий Васильевич DCB 1993

Очень прошу помочь в решении этой задачи! Заранее огромное спасибо!!!

Отредактировано smith87 (2011-08-19 09:55:52)

0

2

Решение:

Код:
Program SpisInfo;
uses crt, graph;
type spis = ^dp;
     dp = record
      next: spis;
      data: string;
     end;
var p, p2, p3, begin_sp, end_sp: spis;
    gd, gm, err: integer;
    ans, st, key: string;
    f: text;
procedure Realization; { Реализация графического режима }
begin
 gd:=detect;
 initgraph ( gd, gm, '' );
 err:=graphresult;
 if err <> grok then begin
  writeln ( 'Произошла ошибка реализации графического режима!' );
  exit;
 end;
 setcolor ( 14 );
 setbkcolor ( 2 );
 cleardevice;
end;
procedure Menu;        { Навигационное меню }
begin
 outtextxy ( 5, 5, ' *1. Добавить информацию ' );
 outtextxy ( 5, 15, ' *2. Удалить информацию ' );
 outtextxy ( 5, 25, ' *3. Вывести информацию ' );
 outtextxy ( 5, 35, ' *4. Найти информацию ' );
 readln ( key );
end;
procedure AddInfo; { Добавление информации }
begin
 new ( p );          { Создаём место в памяти и заносим путь в переменную }
 p^.data:='';        { Удаляем всё лишнее из переменной }
 writeln ( ' * --- Введите номер студента --- * ' );         { Считываем данные и заносим в память }
  readln ( st );
 p^.data:=p^.data + st + ' ';
 writeln ( ' * --- Введите ФИО студента --- * ' );
  readln (st);
 p^.data:=p^.data + st + ' ';
 writeln ( ' * --- Введите Шифр студента --- * ' );
  readln ( st );
 p^.data:=p^.data + st + ' ';
 writeln ( ' * --- Введите год рождения студента --- * ' );
  readln ( st );
 p^.data:=p^.data + st;
 end_sp^.next:=p;          { Добавляем информацию в список как последнюю запись }
 assign ( f, 'info.txt' ); { Заносим всю информацию в файл }
  append ( f );
   writeln ( f );
   write ( f, p^.data );
  close ( f );
end;
procedure ReadInfo;        { Считывание информации из файла }
begin
 assign ( f, 'info.txt' );      { Открываем файл и считываем информацию }
  reset ( f );
   new ( p );                   { Создаём место в памяти и заносим путь в переменную }
   begin_sp:=p;                 { Запоминаем начальный путь }
   while not eof ( f ) do begin { Пока не конец файла делай }
    readln ( f, p^.data );      { Считываем в память информацию }
    new ( p2 );                 { Выделяем в памяти ещё место и заносим путь в переменную }
    p^.next:=p2;                { Заносим в память путь к следующему участку памяти }
    p:=p2;                      { Передаём переменной путь от следующего участка памяти }
   end;
  close ( f );
 p^.data:='';                   { Удаляем всё лишнее из памяти по последнему пути }
end;
Procedure DeleteInfo;           { Удаление информации }
var st: string;
    i: integer;
begin
 p:=begin_sp;                   { Заносим в переменную начальный путь }
 p2:=p;                         { Запоминаем этот путь в ещё одной переменной }
 while p^.data <> '' do begin   { Пока данные не равны пустым делай }
  st:='';
  i:=length ( p^.data );        { Ищем в строке шифр - он второй от конца }
  while p^.data[i] <> ' ' do
   dec ( i );
  dec ( i );
  while p^.data[i] <> ' ' do begin     { Вырезаем его в переменную задом на перёд }
   st:=st + p^.data[i];
   dec ( i );
  end;
  { Проверяем, если шифр на С, то удаляем запись из списка }
  if ( st[length ( st )] = 'C' ) or ( st[length ( st )] = 'c' ) or ( st[length ( st )] = 'С' ) or ( st[length ( st )] = 'с' ) then
   if p = begin_sp then begin { Если начальный путь, то }
    begin_sp:=p^.next;        { Начальный путь теперь следуюющий после начального }
    p2:=p^.next;              { Запоминаем в переменной путь к начальным данным }
   end else                   { Если нет, то }
    p2^.next:=p^.next         { Предыдущие данные будут ссылаться на следующие после имеющихся }
  else                        { Если шифр нормальный, то }
   p2:=p;                     { Запоминаем предыдущий путь, для удаления данных с не правильным шифром }
  p:=p^.next;                 { Переходим на следующие данные меняя путь }
 end;
end;
Procedure SortInfo;           { Процедура сортировки }
var i, n, n2, c: integer;
    st, st2, num, num2: string;
    save: spis;
    flag: boolean;
begin
 repeat                 { Будем сортировать пузырьковым методом }
  flag:=true;                   { Флаг - правда }
  p:=begin_sp;                  { Заносим начальный путь }
  p2:=p^.next;                  { Заносим в переменную путь к следующим данным для сравнения }
  while p2^.data <> '' do begin { Пока данные не равны пустым делай }
   st:='';                      { Опусташаем все данные }
   st2:='';
   num:='';
   num2:='';
   i:=length ( p^.data );
   while p^.data[i] <> ' ' do begin { Выризаем из файла год рождения задом на перёд }
    st:=st + p^.data[i];
    dec ( i );
   end;
   i:=length ( p^.next^.data );
   while p^.next^.data[i] <> ' ' do begin { По второму пути тоже вырезаем год рождения }
    st2:=st2 + p^.next^.data[i];
    dec ( i );
   end;
   for i:=length ( st ) downto 1 do { Так как они задом на перёд, то делаем их нормальными }
    num:=num + st[i];
   for i:=length ( st2 ) downto 1 do
    num2:=num2 + st2[i];
   val ( num, n, c );    { Переводим год в числовые данные }
   val ( num2, n2, c );
   if n > n2 then        { Если год следующего меньше нынешнего, то меняем данные в списке местами, то есть пути }
    if p = begin_sp then begin  { Если начальный путь, то }
     begin_sp:=p2;       { Запоминаем как начальный путь следующий путь }
     save:=p2^.next;     { Сохраняем путь к следующим данным от второго пути }
     p2^.next:=p;        { Второй путь теперь будет ссылаться на первый }
     p^.next:=save;      { А первый на третий, то есть мы поменяли их местами }
     flag:=false;        { Флаг - ложь }
    end else begin       { Иначе }
     p^.next:=p2^.next;  { Данные из первого пути будут ссылаться на данные следующие после второго пути }
     p2^.next:=p;        { Данные из второго пути будут ссылаться на первый }
     p3^.next:=p2;       { Предыдущие данные будут ссылаться на вторые, теперь уже первые }
     flag:=false;        { Флаг - ложь }
    end;
   p3:=p;                { Запоминаем предыдущий путь }
   p:=p^.next;           { Переходим на следующие данные }
   if p^.data = '' then
    break
   else
    p2:=p^.next;         { Заносим путь к третим данным через первый }
  end;
 until flag = true;
 end_sp:=p;              { Запоминаем конец списка, для добавления новых данных }
end;
procedure Search;
var i, count: integer;
begin
 cleardevice;
 count:=0;
 p:=begin_sp;            { Заносим в переменную путь к начальным данным }
 while p^.data <> '' do begin      { Пока данные не равны пустым }
  i:=length ( p^.data );           { Проверяем начинаеться ли шифр на B }
  while p^.data[i] <> ' ' do
   dec ( i );
  dec ( i );
  while p^.data[i] <> ' ' do begin
   st:=st + p^.data[i];
   dec ( i );
  end;
  if st[length ( st )] = 'B' then begin { Если да, то }
   count:=count+10;
   outtextxy ( 5, count, p^.data );           { Вывод }
  end;
  p:=p^.next;
 end;
end;
procedure WriteInfo;     { Вывод информации }
var st: string;
    i, count: integer;
begin
 cleardevice;
 count:=0;
 p:=begin_sp;            { Заносим в переменную путь к начальным данным }
 while p^.data <> '' do begin    { Пока данные не равны пустым }
  count:=count + 10;
  outtextxy ( 5, count, p^.data );           { Вывод }
  p:=p^.next;
 end;
end;
begin
 Realization;        { Реализуем графический режим }
 ReadInfo;           { Считываем информацию из файла }
 DeleteInfo;         { Удаляем из списка все записи с шифром C }
 SortInfo;           { Сортируем оставшиеся записи по году }
 repeat
  Menu;                                  { Вывод меню }
 until ( key = '1' ) or ( key = '2' ) or ( key = '3' ) or ( key = '4' );
 if key = '1' then begin
         AddInfo;       { Добавляем информацию студента в файл }
         ReadInfo;      { Считываем заново всю информацию }
         SortInfo;      { Сортируем оставшиеся записи по году }
         WriteInfo;     { Выводим информацию на экран }
 end;
 if key = '2' then begin
         ReadInfo;      { Считываем заново всю информацию }
         DeleteInfo;    { Удаляем все записи с шифром С }
         SortInfo;      { Сортируем оставшиеся записи по году }
         WriteInfo;     { Выводим информацию на экран }
 end;
 if key = '3' then begin
         ReadInfo;      { Считываем заново всю информацию }
         SortInfo;      { Сортируем оставшиеся записи по году }
         WriteInfo;     { Выводим информацию на экран }
 end;
 if key = '4' then begin
         ReadInfo;      { Считываем заново всю информацию }
         SortInfo;      { Сортируем оставшиеся записи по году }
         Search;
 end;
 readln;
end.

Комментарии к решению:
Решение получилось довольно большим, поэтому я написал комментарии в коде, чтобы Вы не запутались в нём.
Что получилось:
Инициализация графического режима и вывод меню на экран.
Функции сортировки, удаления, добавления и вывода студентов...
Для выбора пункта в меню вводим с клавиатуры число, равняющееся пункту меню.

0

3

Ого, спасибо огромное!!!
Очень выручили! :rolleyes:

0


Вы здесь » Pascalist+ » Помощь в решении задач » Динамический линейный список


Рейтинг форумов | Создать форум бесплатно