Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Hardip
1 / 1 / 1
Регистрация: 24.08.2010
Сообщений: 44
1

Копирование из списка в массив

24.08.2010, 21:01. Просмотров 947. Ответов 3
Метки нет (Все метки)

Есть двусвязный список с вносимыми в него данными простым вводом чисел

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type
  plist = ^tlist;
  tlist = record
          data : double;
          next, prev : plist;
  end;
  p2list = ^plist;
 
 
procedure Add (list : p2list; d : double);
var
  l : plist;
begin
   if list^ = nil then
   begin
      AddToEnd (list, d);
      exit
   end;
 
   New (l);
   l^.data := d;
   l^.prev := list^;
   l^.next := list^^.next;
   (list^)^.next := l
end;
Нужно перенести дынные из списка который тоже выводится на экран по процедуре

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure Display (list : plist);
var
  p : plist;
begin
  if list = nil then
     writeLn ('Spisok pust')
  else
  begin
    p := list;
 
    while p^.prev <> nil do
       p := p^.prev;
 
    while p <> nil do
    begin
       if p = list then
         write ('*');
       write (p^.data, #32);
       p := p^.next;
    end;
  end;
end;
в массив.. Делаю вот так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure PerenosIsSpiskavMassiv (list : plist);
var
  p : plist;
  var A: array [0..10] of double;
  i:integer;
begin
 
  if list = nil then
     writeLn ('Spisok pust')
  else
    begin
     p := list;
    { "перематываем" список, что бы list стал последним элементом }
     for i:=0 to 10 do
 
      while p^.next <> nil do
      begin
         p := p^.next;
         a[i]:=p^.data;
         writeln(a[i]);
         end;
    end;
 
  end;
но ничего путёвого не получается... Прошу помочь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2010, 21:01
Ответы с готовыми решениями:

Создание списка, печать списка на экран, добавления элемента в начало списка, конец списка
Построить динамическую структуру типа список . Необходимо реализовать следующие...

Копирование элементов 1 и 2-го массивов, которых нет в 3-м в 4-й массив
Массивы A,B,C задаются рандомно, причём количество элементов массива выбирает...

Ассемблерная вставка: копирование содержимого массива типа char в n-раз больший массив
Собственно задание: Написать программу, осуществляющую копирование содержимого...

Добавление и удаление элементов списка, очистка списка, просмотр списка
Добрый вечер! помогите пожалуйста с решением не простой задачи. ...

Ввод данного списка из файла в массив записей
Помогите мне пожалуйста. Вот моё задание: 1. Занести список , содержащий не...

3
Puporev
Модератор
54717 / 42123 / 29086
Регистрация: 18.05.2008
Сообщений: 99,430
24.08.2010, 21:24 2
Непонятно для чего массив, если его просто вывести. Если нужно создать массив для каких-то действий с ним, то примерно в этом направлении
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type mass=array[1..100] of double;
procedure PerenosIsSpiskavMassiv (list : plist;var a:mass;var n:byte);
//передаем в программу созданный массив и его размер, мы же заранее можем и не знать сколько 
//элементов в списке
var
  p : plist;
  i:integer;
begin
   if list = nil then
     writeLn ('Spisok pust')
  else
    begin
     p := list;
    { "перематываем" список, что бы list стал последним элементом }
    n:=0;
    while p^.next <> nil do
      begin
         n:=n+1;
         p := p^.next;
         a[n]:=p^.data;
         writeln(a[n]:0:2,' ');
         end;
   end;
1
Hardip
1 / 1 / 1
Регистрация: 24.08.2010
Сообщений: 44
24.08.2010, 22:30  [ТС] 3
Да, спасибо! Понятно почему так! Массив будет использоваться дальше. Ещё есть оператор case of в конце, который в меню позволяет выбрать нужную процедуру например

Pascal
1
2
3
4
5
 1: begin
            write ('Vvedite chislo: ');
            readLn (i);
            Add (@list, i);
          end;
который добавляет элемент. А вот при выборе моей функции

Pascal
1
11:PerenosIsSpiskavMassiv (@list, i);
пишет что - Types of actual and formal var parameters must be identical. Что там может не хватать?

Если var-ы перенести во внутрь, то работает, но список всё равно не выводит.

Добавлено через 45 минут
На самом деле, ошибка кроется где-то в цикле
Pascal
1
while p^.next <> nil do
потому что добавив простую строку
Pascal
1
2
3
4
    while p^.next <> nil do
      begin
      writeln('PRIVET');
         n:=n+1;...
он не выводит слова привет, хотя если добавить до цикла то всё ок.
0
Puporev
Модератор
54717 / 42123 / 29086
Регистрация: 18.05.2008
Сообщений: 99,430
25.08.2010, 06:10 4
У меня в процедуре объявлено 3 параметра, три и должно быть фактически, при чем типы должны совпадать

Pascal
1
11:PerenosIsSpiskavMassiv (list, a,n);
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2010, 06:10

Копирование списка в массив без лишних телодвижений
Помогите плиз! Мне надо чтобы каждый массив по порядку заносился элемент...

Копирование списка
Кто может помочь? У меня есть функция которая на основе изначального списка...

Копирование односвязного списка
в классе содержится односвязный список. соответственно пишу для него оператор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru