1 / 1 / 0
Регистрация: 25.09.2014
Сообщений: 125
1

Сортировка отрицательных элементов односвязного списка

01.05.2015, 02:05. Показов 739. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вообщем так: нужно создать список односвязный, и отсортировать только отрицательные элементы.
Не могу понять, в чём проблема?
По логике смотрю, вроде как, правильно. Но, вроде как.
Rangecheck - для проверки включал, всё-равно вылетает.
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
//{$RANGECHECKS OFF}
Program listpr;
uses    crt;
const   n=7;
type    list=^lt;
        lt=record
        inf:integer;
        link:list;
        End;
var     P,Pk,BegL,EndL,d1,d2,p1:list;
        i,t,v,c,x,y,tmp:integer;
 
Begin
textbackground(lightgray);
textcolor(black);
clrscr;
{creating list with one element}
writeln('Creating list with one element.');
{inital condition}
BegL:=nil;
Endl:=nil;
{allocation memory for new element}
new(p);
t:=1;
{entering information in first element}
write('Enter ',t,' element of the list ');
readln(p^.inf);
P^.link:=nil;
{setting pointers to the end of the list}
BegL:=p;
Endl:=p;
{adding elements to the end of the list}
for i:=2 to n do
Begin
inc(t);
new(p);
write('Enter ',t, ' element of the list: ');
readln(p^.inf);
EndL^.link:=P;
EndL:=P;
End;
{printing initiasl list}
writeln('Initial list with ',t,' elements: ');
P:=BegL;
while P<>nil do
Begin
write(p^.inf,' ');
P:=p^.link;
End;
 
{================================sortirovka==================================}
 
x:=0;//proverka prohoda po otricatel'nomy elementy
P:=BegL; //ystanovka ykazatel'ya na nachalo
while p<>nil do //poka p!=nil
Begin
if p^.inf>=0  //esli element polozhytel'niy
then P:=p^.link //to peredvinyt' ykazatel'
else
Begin
inc(x); //v protivnom slychae yvelichit' schetchik prohoda
if x=1 then //esli element odin
Begin
d1:=p; //to zapomnit' ego
p:=p^.link; //i zapomnit' ego adres /peredvinyt' ykazatel'
End else //esli elementov bol'she
if p^.inf>d1^.inf then //to esli odin element bol'she drygogo
Begin //to nachat'sortirovky
tmp:=p^.inf; //zanesti element v dopolnitel'nuy yacheyky
p^.inf:=d1^.inf; //smenit' mestami
d1^.inf:=tmp; //vernyt' na mesto perviy elemnt
d1:=p;
p:=p^.link;
End;
End;
End;
if p^.inf<0 then
Begin
tmp:=p^.inf; //zanesti element v dopolnitel'nuy yacheyky
p^.inf:=d1^.inf; //smenit' mestami
d1^.inf:=tmp; //vernyt' na mesto perviy elemnt
End;
 
{==============================konec sortirovki==============================}
 
writeln;
write('Sorted list: ');
p:=BegL;
while p<>nil do
Begin
write(p^.inf,' ');
P:=p^.link;
End;
 
readln;
End.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2015, 02:05
Ответы с готовыми решениями:

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

Сортировка односвязного списка
Доброго времени суток. Третий день пытаюсь понять как мне отсортировать сведения структуры,...

Сортировка односвязного списка
Добрый день форумчанам! Есть задача но не знаю как написать ее так как не знаю динамического...

Сортировка односвязного списка
Здравствуйте уважаемые киберфорумщики! Нужна срочная помощь!!! В общем у меня есть задача которую...

3
395 / 370 / 111
Регистрация: 03.02.2013
Сообщений: 1,131
01.05.2015, 04:37 2
ужас, а не код!!! срочно переходи на fpc или изучи STL, тут всё намного проще можно сделать
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
01.05.2015, 08:07 3

Не по теме:

Похоже, что это и есть FPC...


Magestian, сильно рекомендую, привести код в порядок, а именно:
1. Добавление, удаление и очистку списка оформить процедурами и функциями (см. примеры).
2. Пользоваться автоматическими форматтерами кода (поищи JCF (JEDI Code Format) и описание,как с ним работать, в состав fpc входит штатный ptop - описание на оф сайте).
3. По алгоритму сортировки - у тебя должно получиться подобие "пузырька": идёшь по списку, находишь 1-й отрицательный элемент, идешь дальше - 2-й, сравниваешь-обмениваешь, просматриваешь далее, находишь 3-й - сравниваешь-обмениваешь со 2-м и т.д.

А пока - мешанина кода, читать и разбираться тяжело...
0
395 / 370 / 111
Регистрация: 03.02.2013
Сообщений: 1,131
01.05.2015, 18:25 4
Ну если это fpc... то там есть шаблоны типа http://www.freepascal.org/docs... tlist.html
в любом случае, ковырятся с указателями сейчас не модно, это не то чтобы моветон, просто кучу ошибок можно допустить, не заметев, вот набросал пример решения этой задачи как следует писать код на fpc:
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
type
TGList = class
private
  Items: array of LongInt;
public
  procedure Add(Item: LongInt);
  function Get(index:word):LongInt;
  procedure NegativeSort;
end;
  TListInteger = class(TGList)
end;
 
procedure TGList.Add(Item:LongInt);
begin
  SetLength(Items, Length(Items) + 1);
  Items[Length(Items) - 1] := Item;
end;
 
function TGList.Get(index:word):LongInt;
begin
  Result:=Items[index-1];
end;
 
procedure TGList.NegativeSort;
var
   i,j,minindex:word;
   temp:LongInt;
begin
     for i:=0 to Length(Items)-1 do
     begin
       if (Items[i]<0) then
       begin
          minindex:=i;
          for j:=i+1 to Length(Items)-1 do
             if (Items[j]<0) and (Items[j]<Items[minindex]) then
                  minindex:=j;
             if (Items[i]>Items[minindex]) then
             begin
                temp:=Items[minindex];
                Items[minindex]:=Items[i];
                Items[i]:=temp;
             end;
       end;
     end;
end;
 
const
   ListLength=7;
var
  List: TListInteger;
  val : LongInt;
  i:word;
begin
  try
    List := TListInteger.Create;
    for i:=1 to ListLength do
    begin
      Write('Enter #',i,' element : ');
      Readln(val);
      List.Add(val);
    end;
    List.NegativeSort;
    Writeln('Result:');
    for i:=1 to ListLength do write(List.Get(i),' ');
    readln;
  finally
    List.Free;
  end;
end.
с этой отправной точки автор может дальше улучшать, ибо здесь не полноценный TList из Classes
0
01.05.2015, 18:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2015, 18:25
Помогаю со студенческими работами здесь

Сортировка односвязного списка
Прошу сразу не ругаться ,знаю что на форуме миллион разных кодов сортировки ,но я не понимаю как их...

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

Сортировка односвязного списка
Как можно реализовать сортировку(быструю и пузырьковою в виде функций) структуры односвязного...

Сортировка односвязного списка
В условии задачи нужно считать из файла неопределенное количество студентов и занести их в...


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

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

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