Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
3 / 3 / 5
Регистрация: 26.12.2013
Сообщений: 197
1

Процедура добавления строк в линейный список

08.07.2015, 07:36. Показов 2637. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста, вот задание
Используйте представление последовательности строк в виде линейного списка и опишите процедуру ДОБАВИТЬ(L , i , j), добавляющую после i-ой строки списка L копию j-й строки.
Помогите найти причину того, что в результате добавляется пустая строка а не копия.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
uses crt;
type
  List = ^Tlist;
  Tlist = record
    next: List;
    s: String;
    info:integer;
  end;
procedure Vvod(var l: list);
var
  p: ^list;
  ss: String;
begin
  p:=@l;
  WriteLn('Vvedite stroki, okonchanie vvoda .');
  repeat
    ReadLn(ss);
     if ss='.' then break;
    New(p^); p^^.s:=ss; p:=@p^^.next;
  until False;
  p^:=nil;
end;
 
function ykaz(l: list; n: integer): list;
begin
  while (l <> nil) and (n > 1) do begin
    l := l^.next; dec(n);
  end;
ykaz := l
end;
 
procedure add(var q: list; i, j: integer);
var
  pred,posl: list;
  T: list;
begin
 
  posl := ykaz(q, i);
  pred := ykaz(q, j);
  if (posl = nil) or (pred = nil) then
  begin
    writeln('Index za predelami svyazi'); exit
  end;
 
  new(T);
  T^.info := pred^.info;
 
  T^.next := posl^.next;
  posl^.next := T;
 
end;
procedure Vivod(p: list);
begin
  WriteLn('Sodergimoe spiska:');
  while p<>nil do with p^ do begin
    WriteLn(s); p:=next;
  end;
end;
var h:List; i,j:integer;
begin
clrscr;
       Vvod(h);
   Write('Vvedite i - ');
readln(i);
Write('Vvedite j - ');
readln(j);
 
add(h,i,j);
Vivod(h);
readln;
end.
Добавлено через 18 часов 50 минут
ну пожалуйстаааа гляньте

Добавлено через 24 секунды
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2015, 07:36
Ответы с готовыми решениями:

Двунаправленный линейный список строк. Вставить строку, удалить строку и заменить строку
3 двунаправленный линейный список строк.требуется вставить строку после строки с номером и удалить...

Сформировать новый линейный список однонаправленный список, содержащий только нечетные элементы
Даны 2 линейных однонаправленных списка с элементами целого типа. Количество элементов и их...

Процедура добавления числа к программному счетчику
Доброго времени суток. Столкнулся с такой проблемой: никак не получается решить эту задачу. На...

Процедура добавления данных в конец списка.
Добрый вечер. Нужна помощь в преобразовании процедуры добавления данных в начало списка на...

3
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
08.07.2015, 08:50 2
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Запутано и неправильно оформлен ввод. Попробуйте "потренироваться" не со строками, а с числами ими легче заполнять список при отладке.
Как корректнее оформить ввод списка посмотрите здесь, в закреплённой теме.

Добавлено через 7 минут
Хотя там несколько замороченно. Это очередной образец, посмотрите. Когда разберётесь, замените определение TInfo = string и работайте со строками.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
type
  TInfo = integer;
  PList = ^TList;
 
  TList = record
    Info: TInfo;
    Next: PList;
  end;
 
  procedure ListAdd(var root: PList; info: TInfo);
  var
    p: PList;
    Last: PList;
  begin
    new(p);
    p^.Info := Info;
    p^.Next := nil;
    if Assigned(root) then
    begin
      Last := root;
      while Assigned(Last^.Next) do
        Last := Last^.Next;
      Last^.Next := p;
    end
    else
      root := p;
  end;
 
  procedure ListFree(var root: PList);
  var
    p: PList;
  begin
    while Assigned(root) do
    begin
      p := root;
      root := root^.Next;
      Dispose(p);
    end;
  end;
 
  procedure ListShow(root: PList);
  begin
    Write('<');
    while Assigned(root) do
    begin
      Write(root^.Info: 3);
      root := root^.Next;
    end;
    writeln('>');
  end;
 
var
  i: integer;
  root: PList;
begin
  randomize;
  root := nil;
  ListShow(root);
  for i := 1 to 10 do
    ListAdd(root, i);
  ListShow(root);
  ListFree(root);
  ListShow(root);
end.
1
3 / 3 / 5
Регистрация: 26.12.2013
Сообщений: 197
08.07.2015, 10:59  [ТС] 3
спасибо буду разбираться!
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
11.07.2015, 15:17 4
Лучший ответ Сообщение было отмечено mysteria-m как решение

Решение

Для чисел это будет так
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
program tak;
 
type
  TInfo = integer;
  PList = ^TList;
 
  TList = record
    Info: TInfo;
    Next: PList;
  end;
 
  procedure ListAdd(var root: PList; info: TInfo);
  var
    p: PList;
    Last: PList;
  begin
    new(p);
    p^.Info := Info;
    p^.Next := nil;
    if Assigned(root) then
    begin
      Last := root;
      while Assigned(Last^.Next) do
        Last := Last^.Next;
      Last^.Next := p;
    end
    else
      root := p;
  end;
 
  procedure ListFree(var root: PList);
  var
    p: PList;
  begin
    while Assigned(root) do
    begin
      p := root;
      root := root^.Next;
      Dispose(p);
    end;
  end;
 
  procedure ListShow(root: PList);
  begin
    Write('<');
    while Assigned(root) do
    begin
      Write(root^.Info: 3);
      root := root^.Next;
    end;
    writeln('>');
  end;
 
  function ListGetPointerByIndex(root: PList; aIndex: integer): PList;
  begin
    if aIndex <= 0 then
      root := nil;
    while Assigned(root) do
    begin
      if aIndex = 1 then
        break;
      Dec(aIndex);
      root := root^.Next;
    end;
    ListGetPointerByIndex := root;
  end;
 
  function ListInsert(var root: PList; IndexI, IndexJ: integer): boolean;
  var
    ItemI, ItemJ, ItemNew: PList;
  begin
    ItemI := ListGetPointerByIndex(root, IndexI);
    ItemJ := ListGetPointerByIndex(root, IndexJ);
    if Assigned(ItemI) and Assigned(ItemJ) then
    begin
      new(ItemNew);
      ItemNew^.Info := ItemJ^.Info;
      ItemNew^.Next := ItemI^.Next;
      ItemI^.Next := ItemNew;
    end;
    ListInsert := Assigned(ItemI) and Assigned(ItemJ);
  end;
 
var
  i: integer;
  root: PList;
begin
  root := nil;
  ListShow(root);
  for i := 1 to 10 do
    ListAdd(root, i);
  ListShow(root);
  if ListInsert(root, 10, 10) then
    writeln('ListInsert - Ok!')
  else
    writeln('ListInsert - fault');
  ListShow(root);
  ListFree(root);
end.
1
11.07.2015, 15:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2015, 15:17
Помогаю со студенческими работами здесь

Опишите и постройте через двумерный массив Sps линейный однонаправленный список из семи целых чисел и сделайте этот список пустым
Сама задача: Опишите и постройте с помощью двумерного массива Sps линейный однонаправленный список...

линейный список
в линейном однонаправленном списке, содержащем в качестве данного целые числа, проверить,...

Связный (линейный) список
Люди , помогите плиз!!!!!!!!!!!!!!!!!! не могу решить задачу на список. может кто-нидь подскажет...

Двусвязный линейный список.
Нужно создать линейный двусвязный список....Нужно чтобы были такие процедуры или функции: Init -...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru