Доброе время суток, форумчане. Есть такая задача: дан двунаправленный список целый чисел. Если встречается нечётный элемент, то после и перед ним вставить элемент 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; |
|
Работает, но только когда первый элемент четный. Может кто подсказать?