Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 4
1

Вставка элемента в двунаправленный список

03.03.2013, 20:34. Показов 1367. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе время суток, форумчане. Есть такая задача: дан двунаправленный список целый чисел. Если встречается нечётный элемент, то после и перед ним вставить элемент 0.
Я пытался написать решение, но оно не коректное и если делать проход в двух направлениях (прямой и обратный), то они не совпадают. Прошу помочь
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
Type
TPElSpisok = ^TElement;
TElement = record
key:integer;
next:TPElSpisok;
last:TPElSpisok;
end;
procedure creator(var x:TPElSpisok);
begin
  new(x);
  x^.key:=0;
  x^.next:=nil;
  x^.last:=nil;
end;
procedure insert(var head:TPElSpisok)
var pp,wp,x:tpelspisok;
begin
wp:=head; pp:=nil; x:=nil;
while wp<>nil do
  begin
    if (wp^.key mod 2 = 1) then
       begin
         if wp^.last=nil then
           begin
             creator(x);
             x^.next:=head;
             head^.last:=x;
             head:=x;
             creator(x);
             x^.next:=wp^.next;
             wp^.next^.last:=x;
             wp^.next:=x;
             wp^.last:=wp;
           end;
          if wp^.next=nil then
           begin
             creator(x);
             x^.next:=x;
             x^.last:=wp;
             creator(x);
             x^.next:=wp;
             x^.last:=pp;
             pp^.next:=x;
             wp^.last:=x;
           end;
           if ((wp^.last<>nil)and(wp^.next<>nil)) then
           begin
            creator(x);
             x^.next:=wp^.next;
             wp^.next^.last:=x;
             wp^.next:=x;
             wp^.last:=wp;
              creator(x);
             x^.next:=wp;
             x^.last:=pp;
             pp^.next:=x;
             wp^.last:=x;
           end;
       end;
  pp:=wp; wp:=wp^.next;
  end;
Добавлено через 2 часа 8 минут
Задачу переделал, но почему то опять работает не идеально
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
procedure InsertItem(var head:TPRec);
        var prev,cur,next:TPRec; ins1,ins2:TPRec;
        begin
           prev:=nil;
           cur:=head;
           next:=head^.next;
 
                while next^.next <> nil do
                begin
                     if (cur^.num mod 2 = 1) and (prev = nil) then
                       begin
                      new(ins1);
                      ins1^.next:=cur;
                      head^.prev:=ins1;
                      ins1^.num:=0;
                      new(ins2);
                      next^.prev:=ins2;
                      ins2^.num:=0;
                      ins2^.prev:=cur;
                      ins2^.next:=cur^.next;
                      head:=ins1;
                       end;
                       if (cur^.num mod 2 = 1) then
                       begin
                           new(ins1);
                           ins1^.num:=0;
                           prev^.next:=ins1;
                           ins1^.prev:=prev;
                           ins1^.next:=cur;
                           cur^.prev:=ins1;
                           new(ins2);
                           ins2^.num:=0;
                           ins2^.prev:=cur;
                           cur^.next:=ins2;
                           ins2^.next:=next;
                           next^.prev:=ins2
                       end;
                       prev:=cur;
                       cur:=next;
                       next:=next^.next;
                end;
                 if (next^.next = nil) and (next^.num mod 2 = 1) then
                 begin
                          new(ins1);
                          ins1^.num:=0;
                          ins1^.prev:=cur;
                          cur^.next:=ins1;
                          ins1^.next:=next;
                          next^.prev:=ins1;
                          new(ins2);
                          ins2^.num:=0;
                          ins2^.next:=nil;
                          ins2^.prev:=next;
                          next^.next:=ins2;
                 end;
        end;
Добавлено через 11 минут
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
        procedure InsertItem(var head:TPRec);
        var prev,cur,next:TPRec; ins1,ins2:TPRec;
        begin
           prev:=nil;
           cur:=head;
           next:=head^.next;
 
                while next <> nil do
                begin
                     if (cur^.num mod 2 = 1) and (prev = nil) then
                       begin
                      new(ins1);
                      ins1^.next:=cur;
                      head^.prev:=ins1;
                      ins1^.num:=0;
                      new(ins2);
                      next^.prev:=ins2;
                      ins2^.num:=0;
                      ins2^.prev:=cur;
                      ins2^.next:=cur^.next;
                      head:=ins1;
                       end;
                       if (cur^.num mod 2 = 1) then
                       begin
                           new(ins1);
                           ins1^.num:=0;
                           prev^.next:=ins1;
                           ins1^.prev:=prev;
                           ins1^.next:=cur;
                           cur^.prev:=ins1;
                           new(ins2);
                           ins2^.num:=0;
                           ins2^.prev:=cur;
                           cur^.next:=ins2;
                           ins2^.next:=next;
                           next^.prev:=ins2
                       end;
                       prev:=cur;
                       cur:=next;
                       next:=next^.next;
                end;
                 if (cur^.num mod 2 = 1) and (next = nil) then
                 begin
                      new(ins1);
                      ins1^.num:=0;
                      ins1^.prev:=prev;
                      ins1^.next:=cur;
                      prev^.next:=ins1;
                      cur^.prev:=ins1;
                      new(ins2);
                      ins2^.next:=nil;
                      ins2^.num:=0;
                      ins2^.prev:=cur;
                      cur^.next:=ins2;
                 end;
        end;
Работает, но только когда первый элемент четный. Может кто подсказать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2013, 20:34
Ответы с готовыми решениями:

Двунаправленный список
У меня дана информация про спортсмена:ФИО, вес, рост.Создать процедуру для создание нового списка,...

Кольцевой двунаправленный список
Пусть L обозначает кольцевой двунаправленный список с заглавным звеном. Используя функцию или...

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

Массив целых чисел, двунаправленный список
Дан массив целых чисел. Поместить все элементы этого массива в двунаправленный список . Вывести все...

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

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

Двунаправленный неупорядоченный список. Ошибка Встречено '=', а ожидалось ';'
делал задачку и вот возникла проблемка: Строка 162 : Встречено '=', а ожидалось ';' Сама...

Двунаправленный линейный список. Не могу найти ошибку
Программа, которая выполняет следующие операции с двунаправленным линейным списком: -добавление...

Кольцевой двунаправленный список: удалить все элементы, у которых одинаковые соседи
Дан кольцевой двунаправленный список. Из списка L удалить все элементы у которых одинаковые соседи...


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

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