R-список, Нужна помощь |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
R-список, Нужна помощь |
Dunkel_L |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: 0 |
Нужно написать процедуру в R-списе(info:string) (кольцевой список), которая меняет местами слова с четными номерами и нечетными (1-е со 2-м и т.д.)
|
volvo |
Сообщение
#2
|
Гость |
Твою реализацию кольцевого списка - в студию !!!
|
Dunkel_L |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: 0 |
Код uses crt; type ptr=^node; node=record info:string; link:ptr; end; var front,fin:ptr; procedure inqueue(c:string); var p:ptr; begin new(p); p^.info:=c; p^.link:=nil; if fin<>nil then begin fin^.link:=p; end else front:=p; fin:=p; end; function outqueue:string; var p:ptr; begin if front<>nil then begin outqueue:=front^.info; p:=front^.link; dispose(front); front:=p; if front=nil then fin:=nil; end else begin TextColor(red); writeln(' Ошибка! Список пуст'); outqueue:=' '; TextColor(7); writeln(' Для продолжения работы нажмите Enter '); end end; procedure show; var p,q:ptr; var inf:string; begin q:=front; repeat p:=q^.link; inf:=q^.info; write(inf,'; '); q:=p; until(q=nil); end; procedure out; var p:ptr; begin if front<>nil then repeat p:=front^.link; dispose(front); front:=p; until(front=nil); end; procedure pe(p:ptr); Вот сама процедура var r:ptr; begin if front<>nil then begin new(r); r^.info:=p^.info; r^.link:=p^.link; p^.link:=r; pe(r^.link); end; end; ----конец---- var n,i:integer; var k,z:string; begin front:=nil; fin:=nil; repeat clrscr; writeln('Выберете деиствие'); writeln('1-Ввести элемент'); writeln('2-Убрать элемент'); writeln('3-Посмотреть все'); writeln('4-Перестановка'); writeln('5-Выход'); writeln; write(' Введите команду и нажмите ВВОД: '); readln(n); if n=1 then begin writeln(' Введите символ'); write(' '); readln(k); inqueue(k); end else if n=2 then begin write(outqueue); readln; end else if n=3 then begin write(' Список: '); show; readln; end else if n=4 then begin pe(front); end until(n=5); out; end. |
volvo |
Сообщение
#4
|
Гость |
Вот так:
procedure pe(p:ptr); |
Dunkel_L |
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: 0 |
Спасибо. Все работает. Но правда это у меня не кольцевой список.
Вот правильная реализация с твоей процедурой Код uses CRT; type ptr=^node; node=record info:string; link:ptr; end; var top,w2:ptr; a:word; b:string; procedure Push(n:string); var w1,w2:ptr; begin new(w1); w1^.info:=n; w2^.link:=w1^.link; w1^.link:=top; top:=w1; end; procedure vid(w1:ptr); begin if (w1<>w2) then begin; vid(w1^.link); write(w1^.info,' ') end; end; {__________инверсия списка__________} procedure pe(p:ptr); var q:ptr; T: string; begin q := p; while (p <> nil) and (p^.link <> nil) do begin T := p^.info; p^.info := p^.link^.info; p^.link^.info := T; p := p^.link^.link; end; end; {__________удаления списка__________} function Pop:string; var l:ptr; begin if top <> l then begin l:=top^.link; Pop:=top^.info; dispose (top); top:=l; end else begin Writeln(' Ошибка! Список пуст '); pop:=' '; end; end; {__________конец удаления__________} begin repeat clrscr; writeln(' 1-Ввод числа в список'); writeln(' 2-Удаление числа из списка'); writeln(' 3-Вывод списка на экран'); writeln(' 4-Вывод инвертированного списка'); writeln(' 5-Выход из программы'); write(' Введите команду '); readln(a); if a=1 then begin write(' Введите слово: '); readln(b); Push(b); end else if a=2 then begin Writeln; Write(Pop); writeln(' удалено из стека'); readln; end else if a=3 then begin Write(' Список:'); vid(top); Writeln; readln; end else if a=4 then begin Write(' Исходный список:'); vid(top); Writeln; Write(' Инвертированный список:'); pe(top); Writeln; readln; end else if a>5 then Begin Writeln(' Неправильный ввод! '); end; until(a=5) end. Но теперь, если в лоб ставить твою процедуру, то перевернутый список не выводиться на экран. Помоги разобраться, в чем беда. |
volvo |
Сообщение
#6
|
Гость |
Ну, так ты же его не выводишь...
Write(' Исходный список:'); |
Dunkel_L |
Сообщение
#7
|
Новичок Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: 0 |
Да я слепой...
Теперь у меня возник другой вопрос: если вводишь чётное количество элементов всё работает нормально, а если нечётное ,то первый элемент остается на месте ,а все остольные меняються. Может нужно через счётчик? |
-Dunkel_L- |
Сообщение
#8
|
Гость |
В кольцевом списке недолжно быть указателя nil на поля ввода.А должен быть указатель на хвост(q).
Код procedure pe(p:ptr); var q:ptr; T: string; begin q := p; while (p^.link <> q) do begin T := p^.info; p^.info := p^.link^.info; p^.link^.info := T; p := p^.link^.link; end; end; Вот так попробовал но при выводе на экран вылетает. Помоги. |
volvo |
Сообщение
#9
|
Гость |
Ты меня конечно извини, но твоя программа у меня вообще не работает (даже не добавляет элементы)... И ошибки очень грубые:
1) procedure Push(n:string); Чему по-твоему равно W2 там где я показал, и какое право ты имеешь обращаться к полю неинициализированного указателя? 2) procedure vid(w1:ptr); Что ты делаешь в выделенной строке? Турбо Паскаль не позволяет производить с указателями никаких действий, кроме сравнения с nil... Сравнения адресов между собой - это в 32-битных компиляторах (а так как для них есть специальный раздел, а ты создал тему здесь - то твоя программа неправильна, и в TP работать если и будет - то некорректно)... Исправляй. |
Dunkel_L |
Сообщение
#10
|
Новичок Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: 0 |
Код procedure pe(p:ptr); var q:ptr; T: string; begin q := p; while {(p <> nil ) недолжно быть :(} (p = q) and (p^.link <> q) do begin T := p^.info; p^.info := p^.link^.info; p^.link^.info := T; p := p^.link^.link; end; end; Тогда меняются местами только последнии два эл-та. Насчет 1) так по лекциии создается кольцевой список 2) мы сравниваем и после этого выводим на экран Насчёт 32 битных компеляторов незнаю, мы работаем в обычном Borland Pascal 7.0 Вот так |
volvo |
Сообщение
#11
|
Гость |
Цитата Насчет 1) так по лекциии создается кольцевой список Выброси эту лекцию... Кольцевой список создается точно так же, как обычный (first - начало, last - конец), просто последним действием идет:last^.next := first; { Теперь это уже "кольцо" } , а работать с неинициализированными переменными тебя никакой нормальный лектор учить не будет... |
volvo |
Сообщение
#12
|
Гость |
Вот тебе принцип работы с R-списком (меню добавишь сам):
type |
Dunkel_L |
Сообщение
#13
|
Новичок Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: 0 |
С НОВЫМ ГОДОМ!!!
Спасибо за твою реализацию списка. Если мы создаём два указателя(prev, link) то это Д-список, правельно? Код type PList = ^TList; TList = record info: string; prev, link: PList; end; |
volvo |
Сообщение
#14
|
Гость |
Да... Твоя же задача для D-списка тоже решена на форуме (пользуйся поиском, я точно ее выкладывал...)
|
Текстовая версия | 21.12.2024 21:17 |