14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258

Динамический кольцевой список. Вывести n раз. Ошибка не выдает 1-ый символ.

18.02.2012, 15:26. Показов 2876. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте всем. Дана следующая задача:

Текст, заканчивающийся точкой, занести в динамический кольцевой список. Вывести на экран монитора текст из кольцевого списка n раз. n ввести с клавиатуры.

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

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
type
  TPElem=^TElem;
  TElem=record
  Data:Char;
  PNext:TPElem;
  end;
  TQ=record
  PFirst,PLast:TPElem;
  end;
 
procedure QAdd(var aQ:TQ; var aPElem:TPElem);
begin
  if aPElem=nil then Exit;
  aPElem^.PNext:=nil;
  if aQ.PFirst=nil then
    aQ.PFirst:=aPElem
  else
    aQ.PLast^.PNext:=aPElem;
  aQ.PLast:=aPElem;
end;
 
function QDel(var aQ:TQ; var aPElem:TPElem):Boolean;
begin
  QDel:=False;
  if aQ.PFirst=nil then Exit;
  aPElem:=aQ.PFirst;
  aQ.PFirst:=aPElem^.PNext;
  if aQ.PFirst=nil then aQ.PLast:=nil;
  QDel:=True;
end;
 
procedure QFree(var aQ:TQ);
var
  PDel:TPElem;
begin
  while QDel(aQ,PDel) do Dispose(PDel);
end;
 
procedure QPrint(var aQ:TQ);
var
  QQ:TQ;
  PElem:TPElem;
  i:Integer;
begin
  QQ.PFirst:=nil;
  QQ.PLast:=nil;
  i:=0;
  while QDel(aQ,PElem) do begin
    QAdd(QQ,PElem);
    Inc(i);
    if i>1 then Write(PElem^.Data);
  end;
  Writeln;
  while QDel(QQ,PElem) do QAdd(aQ,PElem);
end;
 
var
  QSp:TQ;
  PElem:TPElem;
  i,n:Integer;
  S:String;
begin
  QSp.PFirst:=nil;
  QSp.PLast:=nil;
  repeat
    Writeln('Введите текст:');
    Readln(S);
    for i:=1 to Length(S) do begin
    New(PElem);
        PElem^.Data:=S[i];
        QAdd(QSp,PElem);
    end;
    Writeln('Сколько раз повторить введенный текст: ');
    Readln(n);
    for i:=1 to n do begin
    QPrint(QSp);
      end;
    Writeln('Повтор - Enter. Выход - Esc.');
    Readln(S);
  until S <> '';
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.02.2012, 15:26
Ответы с готовыми решениями:

Используя кольцевой односвязный список найти введённый с клавиатуры символ, удалить символ стоящий перед найденным за 1
Используя кольцевой односвязный список найти введённый с клавиатуры символ, удалить символ стоящий перед найденным за 1 позицию и вставить...

Текст заканчивающийся точкой занести в динамический кольцевой список.
Текст заканчивающийся точкой занести в динамический кольцевой список. вывести на экран монитора текст из кольцевого списка n раз, n ввести...

Вывести строки, в которых символ «*» встречается не менее 2 раз и заменить символ «*» на символ «_»
День добрый. Имеется условие лабы. Написать программу, в которой с клавиатуры вводится до 10 символьных строк. Вывести строки, в...

4
14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
20.02.2012, 15:07  [ТС]
Подскажите, что не так в моем коде. Нужно сдавать. Заранее спасибо.
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
20.02.2012, 15:28
Строка 51.
Pascal
1
 if i>0 then Write(PElem^.Data);
0
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
20.02.2012, 17:02
Ребята, здесь требуется переделка. Дело в том, что представленный список не является кольцевым. И, соответственно, при распечатке не происходит обхода кольца.
В текущем виде задача представляет собой распечатку обыкновенного однонаправленного списка, которая выполняется в цикле N раз.
---
Решение этой задачи на кольцевом однонаправленном списке будет выглядеть так:
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
97
98
99
100
101
102
103
104
105
106
program Project1;
 
type
  //Кольцевой список.
 
  //Тип указателя на элемент списка.
  TPElem = ^TElem;
  //Тип элемента списка.
  TElem = record
    Data : Char;
    PNext : TPElem;
  end;
  //Для кольцевого списка не будем заводить отдельный тип.
  //Кольцевой список будет представлен указателем типа PList : TPElem.
  //Этот указатель указывает на последний элемент списка.
  //Соответственно, указателем на первый элемент списка является: PList^.PNext.
 
//Добавление элемента в конец однонаправленного кольцевого списка.
procedure AddL(var aPList, aPElem : TPElem);
begin
  if aPElem = nil then Exit;
 
  if aPList = nil then
    aPElem^.PNext := aPElem //Единственный элемент указывает сам на себя.
  else begin
    //Добавляем новый элемент после последнего в списке.
    aPElem^.PNext := aPList^.PNext;
    aPList^.PNext := aPElem;
  end;
  //Указатель списка переводим на добавленный элемент. - Теперь он является
  //последним в списке.
  aPList := aPElem;
end;
 
//Удаление однонаправленного кольцевого списка из памяти и инициализация.
procedure ListFree(var aPList : TPElem);
var
  PLast, PDel : TPElem;
begin
  if aPList = nil then Exit;
 
  PLast := aPList;
  repeat
    PDel := aPList;
    aPList := aPList^.PNext;
    Dispose(PDel);
  until aPList = PLast;
  aPList := nil;
end;
 
//Распечатка кольцевого однонаправленного списка aN раз.
procedure ListPrint(const aPList : TPElem; const aN : Word);
var
  PElem : TPElem;
  i, Cnt : Integer;
begin
  if aPList = nil then begin
    Writeln('Список пуст.');
    Exit;
  end;
 
  PElem := aPList^.PNext; //Указатель на первый элемент списка.
  i := 0;
  Cnt := 0; //Счётчик пройденных колец.
  while Cnt < aN do begin
    Inc(i);
    if i > 1 then Write(', ');
    Write(PElem^.Data);
    if PElem = aPList then Inc(Cnt); //Подсчёт пройденных колец.
    PElem := PElem^.PNext;
  end;
  Writeln;
end;
 
var
  PList, PElem : TPElem;
  S : String;
  i : Integer;
  N : Word;
begin
  //Начальная инициализация списка.
  PList := nil;
 
  repeat
    Writeln('Задайте строку:');
    Readln(S);
    Writeln('Задайте количество распечаток:');
    Readln(N);
 
    //Создаём кольцевой список.
    for i := 1 to Length(S) do begin
      New(PElem);
      PElem^.Data := S[i];
      AddL(PList, PElem);
    end;
    //Распечатка.
    Writeln('Распечатка кольцевого списка N раз:');
    ListPrint(PList, N);
    //Удаление списка из памяти.
    ListFree(PList);
    Writeln('Список удалён из памяти. Работа завершена.');
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
0
14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
20.02.2012, 18:45  [ТС]
Спасибо большое Mawrat, Puporev. Вы меня оба выручили. Теперь я начинаю врубаться как на практике наглядно отличается однонаправленный список от кольцевого. Спасибо всем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2012, 18:45
Помогаю со студенческими работами здесь

На базе массива создать кольцевой список, отсортировать его, вывести содержание списка на форму
Вот задание: Работа с динамическими структурами Дан массив . Работа с кольцевым динамическим списком : На базе этого массива...

Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз этот символ
Помогите с задачей на C# Ввести строку символов. Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз этот...

Вывести символ n раз
Подскажите, как вывести в ответе число или символ n раз?

Вывести символ n раз
Всем доброго времени суток. Ребята как в java вывести скажем 10 раз символ &quot;*&quot;? Меня интересует, что то, что бы работал где то так: ...

Как вывести динамический список?
как вывести динамический список? void printWorkerList(Worker* List) { while(List!=NULL) { ...


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

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

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru