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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2016, 16:23   #1
Reversi
 
Регистрация: 06.05.2016
Сообщений: 8
По умолчанию двусвязные, двунаправленные списки

посмотрите пожалуйста ошибки, удаление n-го элемента почему то не работает, а так же нужно сделать:
- объединение 2 списков по операции "ИЛИ"
- объединение 2 упорядоченных списков в 1 упорядоченный,
- Создание списка, содержащего элементы, общие для двух других
списков,
- Вставка элемента после η-го элемента списка.
- Удаление из списка каждого второго элемента,
- Перемещение элемента node(p) на η позиций вперед по списку,
- Создание копии списка.

заранее спасибо!





Код:
uses crt;

type
  data = integer;
  spisok = ^spisoktype;
  spisoktype = record
   number: data;
   next: spisok;
  end;
  
var 
  tek,tek1: spisok;
  first,last: spisok;
  vop:integer;
  i,c: word;
 
 
{процедура добавления в конец списка}  
procedure addlast(var tek, last: spisok; j: word);
 var
    point:spisok;
    t:spisok;
 begin
    new(point);
    writeln ('введите элемент: ');
    readln (point^.number);
    writeln;
    point^.next :=nil;
    
      if tek = nil then begin
          tek := point;
          first := tek;
      end
      else begin
          t := tek;
    while (t^.next <> nil) do
      t := t^.next;
    t^.next := point;
    last := point;
  end;
  writeln('Элемент успешно добавлен!');
  writeln;
  end;

{процедура вывода списка}  
procedure Print(tek:spisok);
var
d: word;
begin
d := 0;
  if tek=nil then
  begin
    writeln('Список пуст.');
  end;
  while tek<>nil do
  begin
  inc(d);
    writeln(d, ' элемент списка: ', tek^.number);
    tek:=tek^.next
  end;
end;

{процедура удаления последнего элемента списка}
procedure dellast(var tek: spisok; var first, last: spisok);
 begin
    if (tek^.next = nil) then 
     first := nil else
     while (tek^.next^.next <> nil) do
     tek := tek^.next;
     dispose(tek^.next);
     tek^.next := nil;
     writeln('элемент удален');
     writeln;
 end;
 
 {процедура удаления n-го элемента}
 procedure deln(var tek, first, last: spisok);
var
  key: word; prev, del: spisok;
 
begin
  prev := nil;
  tek := first;
  writeln('Введите значение удаляемого элемента: ');
  
  readln(key); // ключ для поиска элемента
  writeln;
  while tek <> nil do 
    if tek^.number = key then begin{Если обнаружен элемент, который требуется удалить}
      if tek = first then {Если удаляемый элемент является первым элементом списка, то первым элементом списка назначаем следующий элемент}
        first := tek^.next
      {Если удаляемый элемент не является первым элементом списка, то поле
      Next предыдущего элемента теперь должно указывать на элемент, который
      является следующим относительно tek}
      else
        prev^.next := tek^.next;
      {Если удаляемый элемент является последним элементом списка, то последним
           элементом списка назначаем предыдущий элемент}
      if tek = last then
        last := prev; {Указатель на удаляемый элемент}
      del := tek;{Указатель на следующий элемент}
      Dispose(Del); {Освобождение памяти, занятой под элемент}
    end
    else {Переход к следующему элементу списка.}
    begin
      prev := tek;
      tek := tek^.next;
    end;
  writeln('Элемент успешно удален!');
  writeln;
end;

{сцепление двух списков}
procedure interflow(var tek, tek1, first: spisok);
var
  pred1, first1: spisok;
  f, o, n, g: word;
begin
  
  writeln;
  writeln('Чтобы выполнить сцепление сначала заполните второй список!');
  writeln;
  writeln('Сколько элементов вставляем? '); 
  readln(f);
  writeln;
  new(tek1); // заполнение второго списка
  writeln;
  writeln('Введите элемент: ');
  writeln;
  readln(tek1^.number);
  tek1^.next := nil;
  
  first1 := tek1;
  pred1 := tek1;
  
  for o := 2 to f do 
  begin
    new(tek1);
    writeln('Введите элемент: ');
    writeln;
    pred1^.next := tek1;
    readln(tek1^.number);
    tek1^.next := nil;
    pred1 := tek1;
  end;
  writeln;
  writeln('Первый список: ');
  writeln;
  print(tek);
  writeln;
  writeln('Второй список: ');
  writeln;
  n := 0; 
  tek1 := first1;
  if tek1 = nil then 
    writeln('Список пуст. ')
  else
    while tek1 <> nil do 
    begin
      inc(n);
      writeln(n, ' элемент списка: ', tek1^.number);
      tek1 := tek1^.next;
    end;
    
  tek := first;
  while (tek^.next <> nil) do tek := tek^.next;
  
  tek^.next := first1; 
  tek1 := nil; 
  writeln;
  writeln('Сцепление: ');
  writeln;
  g := 0;
  tek := first;
  Writeln('Содержимое списка:');
  if tek = nil then 
    writeln('Список пуст. ')
  else
    while tek <> nil do 
    begin
      inc(g);
      writeln(g, ' элемент списка: ', tek^.number);
      tek := tek^.next;
    end;
end;

{Освобождение всех элементов списка}
procedure releaseall(var tek, first: spisok);
var
  temp: spisok;
begin
  tek := first; 
  while (tek <> nil) do 
  begin
    temp := tek^.next; 
    dispose(tek); 
    tek := temp; 
  end;
  first := nil; 
  writeln;
  writeln('Все элементы списка успешно освобождены!');
  writeln;
end;

{инвертирование списка}
procedure invert(var tek, first, last: spisok);
var
  p, t: spisok;
begin
  p := nil;
  last := first;
  while first <> nil do 
  begin
    t := first^.next;
    first^.next := p;
    p := first;
    first := t;
  end;
  first := p;
  writeln;
  writeln('Список успешно инвертирован!');
  writeln;
end;
     
  
        
    
    
   

begin
  repeat
   writeln('1: Создание списка, добавление элемента в конец списка.');
   writeln('2: Вывод списка на экран.');
   writeln('3: Удаление поседнего элемента списка.');
   writeln('4: Удаление n-го элемента списка.');
   writeln('5: Сцепление двух списков.');
   writeln('6: Очижение списка.');
   writeln('7: Инвертирование списка.');
   writeln('0: Выход');
   writeln('');
   readln(vop);
   writeln('');
  case vop of
   
   1:
   begin
     writeln('сколько элементов вставляем?');
     readln(c);
     for i := 1 to c do 
            addlast(tek, last, i); 
        end;
   2: print(tek);
 
   3: dellast(tek, first, last);
   
   4: deln(tek, first, last);
   
   5:
     begin
      if first = nil then begin
       writeln('сначала нужно заполнить первый список!');
       end else interflow(tek, tek1, first); 
     end;
     
   6: releaseall(tek, first); 
   
   7: 
     begin
      if (first = nil) or (first^.next = nil) then begin
            writeln('Ошибка, список пуст или имеет один элемент!');
          end else invert(tek, first, last);  
     end;
   end;
   until (vop = 0);
end.
Reversi вне форума Ответить с цитированием
Старый 06.05.2016, 16:40   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

код весь не смотрел и, тем более, не проверял.
но что сразу бросилось в глаза - не стоит смешивать передачу переменных через параметры процедуры/функции и использование глобальных переменных.

Чтобы просто и быстро выявить подобные вещи, опустите блок описания переменных НИЖЕ описания всех процедур и функций:

Код:

......
  writeln('Список успешно инвертирован!');
  writeln;
end;
     
var 
  tek,tek1: spisok;
  first,last: spisok;
  vop:integer;
  i,c: word;


begin
  repeat
   writeln('1: Создание списка, добавление элемента в конец списка.');
   writeln('2: Вывод списка на экран.');
.....
тогда компилятор сразу Вам укажет на ваши огрехи.


И если речь идёт о двух списках, то где у Вас в коде работа со вторым списком ? (где его можно заполнить/посмотреть/очистить и т.д.?)
увидел, что второй список заполняется в процедуре {сцепление двух списков}. Это не логично!! Нужно делать работу со списками через меню!


И ещё, ваш список не соответствует заданию!
"двухсвязные" списки - это списки, в элементах которых хранится ссылка и на следующий элемент (как у Вас) и на предыдущий элемент - а у Вас этого нет!
.

Последний раз редактировалось Serge_Bliznykov; 06.05.2016 в 16:48.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двунаправленные списки Hitchi Помощь студентам 20 13.05.2014 11:53
Двунаправленные (двусвязные) списки dusya9992 Паскаль, Turbo Pascal, PascalABC.NET 4 30.01.2011 10:13
Двунаправленные (двусвязные) списки DrDre9991 Паскаль, Turbo Pascal, PascalABC.NET 1 27.12.2010 16:53
двунаправленные списки в С++ zven_ Общие вопросы C/C++ 22 29.10.2008 18:07
Двунаправленные списки в с++ Марсель059 Общие вопросы C/C++ 0 29.10.2008 15:32