IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Сортировка списка простыми вставками, что-то никак не выходит
сообщение
Сообщение #1


Гость






Посомтрите код пожалуйста! Что не так?
Код

program sort1;
uses crt;
type
    plist = ^tlist;
    tlist = record
        info: integer;
        link: plist;
    end;
var    first: plist;
procedure sort (p: plist);                    {Процедура сортировки простыми вставками}
var t: plist;
begin
    while p<>nil do
        begin
            t:=p^.link;
            if p^.info>t^.info then
                begin
                    t^.link:=p;
                    p^.link:=t;
                    sort (first);
                    break;
                end;
            p:= p^.link;
        end;
end;
procedure print(p: plist);                    {Процедура вывода списка}
begin
    while p <> nil do
        begin
            write(p^.info, ' ');
            p := p^.link;
        end;
    writeln;
end;
procedure vvod (var first: plist);                {Процедура ввода списка}
var    s: integer;
    p, last: plist;
begin
    last := first;
    repeat
        write('Введите следующий элемент: ');
        readln(s);
        if s <> 0 then
            begin
                new(p);
                p^.info := s;
                p^.link := nil;
                if first = nil
                    then
                        first := p
                    else     last^.link := p;
                last := p;
            end;
    until s = 0;
end;
begin
    clrscr;
    writeln('Введите список:');
    first:=nil;
    vvod (first);
    sort (first);
    print(first);
    readkey;
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Я же приводил уже рекурсивную функцию:
Сортировка списка простыми вставками, рекурсивный алгоритм
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Я понимаю, что пример вы приводили!
Но вот что вот в таком тексте программы не верно! Она выводит только 2 последних отсортированных! Проблема в сохранении указателя на первый элемент спика first
ПОМОГИТЕ ПЛИЗ!!!

Код
program sort1;
uses crt;
type
    plist = ^tlist;
    tlist = record
        info: integer;
        link: plist;
    end;
var    first: plist;
procedure sort (p: plist);                    {Процедура сортировки простыми вставками}
var t, t2: plist;
begin
    t:=p^.link;
    if t<>nil then
        if p^.info > t^.info then
            begin
                if first = p then
                          first:=t;
                t2:= t^.link;
                t^.link := p;
                p^.link := t2;
                sort (first);
            end
        else sort (p^.link);
end;
procedure print(p: plist);                    {Процедура вывода списка}
begin
    while p <> nil do
        begin
            write(p^.info, ' ');
            p := p^.link;
        end;
    writeln;
end;
procedure vvod (var first: plist);                {Процедура ввода списка}
var    s: integer;
    p, last: plist;
begin
    last := first;
    repeat
        write('Введите следующий элемент: ');
        readln(s);
        if s <> 0 then
            begin
                new(p);
                p^.info := s;
                p^.link := nil;
                if first = nil
                    then
                        first := p
                    else     last^.link := p;
                last := p;
            end;
    until s = 0;
end;
begin
    clrscr;
    writeln('Введите список:');
    first:=nil;
    vvod (first);
    sort (first);
    print(first);
    readkey;
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Смотри, что ты делаешь:
procedure sort (p: plist); {Процедура сортировки простыми вставками}
var t, t2: plist;
begin
t:=p^.link;
if t<>nil then
if p^.info > t^.info then begin
if first = p then first:=t;

t2:= t^.link; { <--- А если t^.link = nil ?}
t^.link := p;
p^.link := t2;
sort (first);
end
else sort (p^.link);
end;

... что будет в указанном мной случае? Ты просто "отсечешь" все последующие элементы... Один элемент ты потеряешь в любом случае...

Так что не надо здесь мудрить с указателями, работай с данными:
procedure sort (p: plist);
var
t: plist;
X: integer;
begin
t := p^.link;
if t <> nil then

if p^.info > t^.info then begin
X := t^.info;
t^.info := p^.info;
p^.info := X;

sort (first);
end
else sort (p^.link);
end;
yes2.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Да всё работает!
Но это будет как думаешь считаться првильм вариантом!?
Ведь у нас сортировка динамического списка?
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 20.09.2017 7:22
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"