Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
6 / 6 / 1
Регистрация: 06.09.2011
Сообщений: 100
1

Проверить, работает ли очистка списка

12.03.2012, 11:11. Показов 1703. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Была задача на работу с динамической структурой данных, точнее списком. Я её написал, но сомневаюсь в одном месте. По условию после работы со списком программа должна его полностью удалить. Я её как бы написал, но не знаю работает ли она.
Вот программа:
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
program Links;
type
Link = ^Number;
Number = record
ID: integer; 
Cislo : integer; 
NextRec: Link; 
end;
var
i, c, j: integer;
Last, First, Curr, spisok, tmp : Link; 
 
 
procedure ShowList;
begin
      Writeln('Список элементов:');
      Curr := First; 
      while Curr <> Last do 
          begin
             Writeln(Curr^.Cislo);
             Curr := Curr^.NextRec;
          end;
end;
begin
      Writeln('Укажите длину списка: ');
      Readln(c);
      Last := New(Link); 
      First := Last; 
      Writeln('Введите целые числа:');
      for i := 1 to c do
          begin
          Last^.ID := i;
          Readln(Last^.Cislo);
          Last^.NextRec := New(Link); 
          Last := Last^.NextRec; 
end;
ShowList; 
Writeln('Укажите индекс элемента для удаления: ');
readln(j);
Curr := First;
for i := 1 to j - 2 do Curr := Curr^.NextRec;
if (j > c) or (j<=0) then writeln('Нету такого индекса.')
    else
    if j = 1
         then First := First^.NextRec
              else if j = c 
                  then begin
                      Curr^.NextRec := Nil; 
                      Last := Curr^.NextRec; 
                      end else 
                          Curr^.NextRec := Curr^.NextRec^.NextRec;
                          ShowList;
                          Dispose(First);
begin
  while spisok<>nil do
  begin
    tmp:=spisok;
    spisok:=spisok^.NextRec;
    FreeMem(tmp,SizeOf(Number));
  end;
end;
Writeln('Список удалён');
readln;
end.

Волнующее меня место:
Pascal
1
2
3
4
5
6
7
8
9
begin
  while spisok<>nil do
  begin
    tmp:=spisok;
    spisok:=spisok^.NextRec;
    FreeMem(tmp,SizeOf(Number));
  end;
end;
Writeln('Список удалён');
Поможете пожалуйста посмотреть работает ли очищение списка, если нет, то помогите поправить или предложите свой способ.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2012, 11:11
Ответы с готовыми решениями:

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

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

Очистка списка
Доброго всем времени суток. Ребят, помогите с очисткой списка, а то я наглухо запутался с ним....

Корректная очистка списка
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

5
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
12.03.2012, 15:29 2
Ох, что-то как-то тут все не по-стандартному
Немного по исправлял, т.к. abcpascal успешно отказался компилировать.
В частности, эта строчка:
Pascal
1
Last := New(Link);
Тут выделение памяти под что происходит? Под все элементы этого типа?
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
program Links;
uses crt;
type
Link = ^Number;
Number = record
 ID: integer;
 Cislo : integer;
 NextRec: Link;
end;
var i, c, j: integer;
    Last, First, Curr, spisok, tmp : Link;
 
procedure add(var first: link; dob:integer);
var kur: link;
begin
 new(kur);
 kur^.nextrec:=first;
 kur^.cislo:=dob;
 first:=kur;
end;
 
procedure del(var first:link);
var kur: link;
begin
 kur:=first;
 first:=first^.nextrec;
 dispose(kur);
end;
 
procedure ShowList(first: link);
begin
 Writeln('Список элементов:');
 if first=nil then writeln('V spiske net elementov')
 else
  begin
   while first<>nil do
    begin
     writeln(first^.cislo);
     first:=first^.nextrec;
    end;
 end;
end;
 
begin
      Writeln('Укажите длину списка: ');
      Readln(c);
      first:=nil;
      Writeln('Введите целые числа:');
      for i := 1 to c do
           add(first,i);
ShowList(first);
Writeln('Укажите индекс элемента для удаления: ');
readln(j);
Curr := First;
for i := 1 to j - 2 do Curr := Curr^.NextRec;
if (j > c) or (j<=0) then writeln('Нету такого индекса.')
    else
    if j = 1
         then First := First^.NextRec
              else if j = c
                  then begin
                      Curr^.NextRec := Nil;
                      Last := Curr^.NextRec;
                      end else
                          Curr^.NextRec := Curr^.NextRec^.NextRec;
                          ShowList(first);
 
 if first=nil then
  writeln ('V spiske net elementov')
  else
   while first<>nil do
    del(first);
Writeln('Список удалён');
readln;
showlist(first);
readln;
end.
Это на обоих паскалях компилируется. Я не стал вручную вводить элементы, автозаполнение идет. И еще добавил в конце тот же showlist для проверки. А также пару своих процедур.
1
6 / 6 / 1
Регистрация: 06.09.2011
Сообщений: 100
12.03.2012, 21:26  [ТС] 3
BumerangSP, спасибо. Вот только что означают?
Pascal
1
2
kur: link
dob:integer
Насчёт оформления, то мне оно тоже казалось немного странным, просто я делал по примерам из книги.
0
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
12.03.2012, 22:49 4
1)kur - это вспомогательный указатель, все равно что Curr у Вас.
2)
Pascal
1
2
for i := 1 to c do
           add(first,i);
dob (по-русски "добавить" ) в процедуре - это все равно что параметр i в вызове процедуры. Т.е. он принимает значения i и подставляет в подпрограмму.
1
6 / 6 / 1
Регистрация: 06.09.2011
Сообщений: 100
13.03.2012, 00:03  [ТС] 5
А как убрать автозаполнение? Это?
Pascal
1
add(first,i);
0
4311 / 1422 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
13.03.2012, 00:40 6
К примеру, так:
Pascal
1
2
3
4
5
for i := 1 to c do
 begin           
  read(a);
  add(first,a);
 end;
где a - какая-нибудь переменная.
1
13.03.2012, 00:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2012, 00:40
Помогаю со студенческими работами здесь

Очистка списка пользователей
Добрый день. Хочу почистить форум от ботов, жму &quot;Очистка списка пользователей&quot; в админке и ничего...

Очистка списка от повторяющихся атомов
Построить рекурсивную функцию средствами элементарного лиспа, которая принимает список. И...

Очистка списка Windows Forms C++
Добрый день! Подскажите пожалуйста как сделать чтобы я мог очистить список(см. код с...

Очистка текста от слов из списка
Есть список вида и текстовый файл. Как удалить из файла все слова, содержащиеся в списке? p.s....


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

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