226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
1

Линейные списки

25.11.2013, 00:08. Показов 614. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вечер добрый! Видимо не далась мне тема про списки. Прошу помощи:
Список вводится через StringGrid1, по нажатию на кнопку "Ввод" (Button1) и список выводится в Memo1;
Можно нажать кнопку "Random" и StringGrid1 заполнится случайными числами;
По нажатию кнопки "Сумма нечетных" в Memo1 выводится сумма нечетных элементов списка;
По нажатию кнопки "Вывод" выводит как выглядит список в данный момент;

Мне необходимо, чтобы по нажатию кнопки "Удалить все четные" из списка удалялись все четные элементы, у меня вместо этого либо удаляет непонятные числа, либо выдает Access Violation. Исходник прилагаю:
Для тех кому не охота качать архив исходный код процедуры:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure DelList(var first: PElem);
var p,q:PElem;
begin
  p:=first;
  while p<>nil do
  begin
    q:=p^.next;
    if q.int mod 2=0 then
    begin
      p^.next:=q^.next;
      dispose(q);
    end;
    p:=p^.next;
  end;
end;
Вложения
Тип файла: zip Списки.zip (230.2 Кб, 8 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2013, 00:08
Ответы с готовыми решениями:

Линейные списки
Помогите пожалуйста!!! Дан линейный список, содержащий имена,фамилии и отчества. Отсортировать...

Линейные списки
Имеется линейный список с последовательным хранением , элементами которого являются окружности....

Списки. Линейные массивы
Дано линейную таблицу A, которая состоит из целых чисел. Записать алгоритм и составить программу,...

Однонаправленные линейные списки
Помогите с одноправленным линейным списком.Происходит ошибка на этапе выполения.

7
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
25.11.2013, 09:33  [ТС] 2
Я вроде бы все объяснил... Не нужно говорить, что в интернете все есть... Мне нужно именно по моему номеру, чтобы я мог понять...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32928 / 21254 / 8160
Регистрация: 22.10.2011
Сообщений: 36,508
Записей в блоге: 8
25.11.2013, 13:21 3
Вот это попробуй:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure DelList(var first: PElem);
var p,q,t:PElem;
begin
  while (first <> nil) and not odd(first^.int) do
  begin
    t := first; first := first^.next; dispose(t);
  end;
 
  p:=first;
  while (p <> nil) and (p.next<>nil) do
  begin
    q:=p^.next;
    if q.int mod 2=0 then
    begin
      p^.next:=q^.next;
      t := q; q := q^.next;
      dispose(t);
    end
    else p:=p^.next;
  end;
end;
2
13106 / 5887 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
25.11.2013, 13:47 4
UI, хороший способ.
Кстати, вместо 16 и 17 строк можно записать так:
Delphi
1
Dispose(q);
2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32928 / 21254 / 8160
Регистрация: 22.10.2011
Сообщений: 36,508
Записей в блоге: 8
25.11.2013, 13:49 5
Ну, да... Я сначала пробовал без 12-ой строки, так что надо было сохранять указатель... А теперь можно убрать, естественно...
2
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
25.11.2013, 18:22  [ТС] 6
Приеду вечером домой - посмотрю. Спасибо

Добавлено через 4 часа 2 минуты
Уважаемые, что скажете по такому коду:
Delphi
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
procedure DelList(var first: pelem);
var
  P, Q: PElem;
begin
  p := first;
  q := first;
  while p^.next <> nil do
  begin
    p := q^.next;
    if p^.inf mod 2 = 1 then
    begin
      q^.next := p^.next;
      dispose(p);
      p := q;
    end
    else
      q := p;
  end;
  p := first;
  if p^.inf mod 2 = 1 then
  begin
    first := p^.next;
    dispose(p);
  end;
end;
0
13106 / 5887 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
26.11.2013, 09:57 7
Этот код правильно написан. Кстати, надо заметить, что код удаляет нечётные положительные элементы. А по заданию требуется удалять четные элементы.
Ещё предложу такой вариант решения. Удаляться будут чётные элементы.
Delphi
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
procedure DelList(var first: pelem);
var
  p, q: PElem;
begin
  p := nil;   //Указатель на предыдущий элемент.
  q := first; //Указатель на следующий элемент.
  while q <> nil do
    if q^.inf mod 2 = 1 then
    begin
      if p <> nil then
      begin
        p^.next := q^.next;
        dispose(q);
        q := p^.next;
      end
      else
      begin
        first := q^.next;
        dispose(q);
        q := first;
      end;
    end
    else //Переходим к следующей паре элементов.
    begin
      p := q;
      q := q^.next;
    end;
end;
1
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
26.11.2013, 17:57  [ТС] 8
Mawrat,

Не по теме:

нечётные, четные тут это роли не играет)


Спасибо за коды, буду разбираться
0
26.11.2013, 17:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2013, 17:57
Помогаю со студенческими работами здесь

Курсач, тема: линейные списки
Текст помощи для некоторой программы организован как линейный список. Каждая компонента текста...

Линейные списки \ Реализация некоторых функции
Прошу помощи : Имеется линейный список с последовательным хранением , элементами которого являются...

Delphi линейные списки и записи,не могу разобраться
Создать запись &quot;Станция&quot; (хранит номер или название). Создать запись &quot;Поезд&quot; (хранит номер поезда,...

Линейные списки(перевести вроде с Си++ на Delphi [console application])
Здравствуйте, переведите, пожалуйста, программу с вроде Си ++ на Delphi; Си еще не проходили(((.


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

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

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