Автор Тема: Упорядочивание списка  (Прочитано 4203 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Nikgamer

  • Ветеран
  • *****
  • Сообщений: 610
    • Просмотр профиля
Упорядочивание списка
« : 01 Мая 2010, 17:03:34 »
Всем привет, с вами Nikgamer.
Вчера, после трехчасового баттла в dawnofwar2 я вдруг вспомнил, что мне надо сделать программу на чистом С. Суть такова: на вход подаются целые числа с повторами в произвольном кол-ве (while scanf("%d", &a)==1), нужно распечатать список, в котором эти числа уже будут упорядочены. Т.е. прямо со входа числа попадают в список и сортируются. Собственно, вопрос такой: как организовать список (например, как задавать голову и локальную переменную) так, чтобы каждый элемент на входе, попадая в список, сразу же там сортировался и при этом отладчик не ругался. Повторы можно уже удалить потом. Главная проблема в том, что дебаггер сильно ругается, скажем, на объявление головы=NULL и последующего цикла for по списку. Поскольку это первый опыт со списками на СИ, то прошу объяснить, как нужно все хорошо задать и сделать, чтобы список нормально отсортировывался  и дебаггер не выдавал ошибок.
депрессивный зануда и социофоб.

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #1 : 02 Мая 2010, 11:19:54 »
Кстати смотри в принципе я такое же делал,но на паскале в виде двусвязного списка, могу тебе скинуть, но тут все зависит от пожеланий радиослушателя Nikgamer))   
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн Nikgamer

  • Ветеран
  • *****
  • Сообщений: 610
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #2 : 02 Мая 2010, 11:29:05 »
А вот фигу, список должен быть односвязный по заданию. С двусвязным я бы сделал сам.
Так что вопрос остается в силе. сортировать надо сразу же при подаче целых чисел. В связи с этим вопрос и возникает, что как этот список задавать и как ицкл по нему писать для сортировки?
депрессивный зануда и социофоб.

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #3 : 02 Мая 2010, 13:04:56 »
Ну будет тебе и односвязный:)
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн Nikgamer

  • Ветеран
  • *****
  • Сообщений: 610
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #4 : 02 Мая 2010, 15:59:23 »
Да просто объясните чайнику, как правильно в список записывать и сразу сортировать.
депрессивный зануда и социофоб.

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #5 : 02 Мая 2010, 19:08:36 »
Просто берешь и пишешь класс поддержки односвязанного списка )) Вот так сказать из личного опыта:
program sp;

{$APPTYPE CONSOLE}

uses
  SysUtils;
  type
  plist=^filwords;
  filwords=record
  Loadword:string;
  next:plist;
  end;
procedure Push(var pPrevios:plist;var pEnd:plist;info:string );
begin
new(pEnd^.next);
pEnd^.next^.next:=nil;
pEnd^.next^.loadword:=info;
pPrevios:=pEnd^.next;
end;
 procedure FindPlaceToIns(pBegin:plist;var pfind:plist;key:string);
 begin
while   (pBegin^.next^.Loadword<key)  do
begin
pBegin:=pBegin^.next;
end;
if pBegin<>nil then
begin
pFind:=pBegin;
end
else
begin
pFind:=nil;
end;

 end;
procedure Find(pBegin:plist;var pfind:plist;key:string);
begin
while   (pBegin^.Loadword<>key)  do
begin
pBegin:=pBegin^.next;
end;
if pBegin<>nil then
begin
pFind:=pBegin;
end
else
begin
pFind:=nil;
end;
end;
procedure InsMed(var pBegin:plist;key:string);
  var
  Med,pFind:plist;
 begin
 new(pFind);
 pFind:=pBegin;
FindPlacetoIns(pBegin,pFind,key);
 new(Med);
 Med^.Loadword:=key;
Med^.next:=PFind^.next;
PFind^.next:=Med;
 end;
procedure InsBegin(var pBegin:plist;info:string);
var
temp:plist;
begin
new(temp);
temp^.Loadword:=info;
temp^.next:=pBegin;
pBegin:=temp;
end;
procedure Pop(var pEnd:plist;pBegin:plist);
var
t,delel:plist;
begin
t:=pBegin;
delel:=PEnd;
while t^.next<>pEnd do
begin
t:=t^.next
end;
Pend:=t;
Pend^.next:=nil;
dispose(delEl);
end;
procedure Delel(var pBegin:plist;info:string);
var
t,x,dx:plist;
begin
t:=pBegin;
while t<>nil do
  if t^.Loadword=info then
    if t=pBegin then
      begin
x:=pBegin;
pBegin:=pBegin^.next;
Dispose(x);
t:=pBegin;
      end
else
begin
x:=t;
t:=t^.next;
dx^.next:=t;
Dispose(x);
end
else
begin
dx:=t;t:=t^.next;
end;
        end;
procedure View(pBegin:plist);
var
count:integer;
begin
count:=0;
while pBegin<>nil do
begin
writeln(pBegin^.Loadword);
pBegin:=pBegin^.next;
count:=count+1;
writeln(count);
end;
end;
procedure CreateList(var pBegin:plist;info:string);
begin
new(pBegin);
pBegin^.Loadword:=info;
PBegin^.next:=nil;
end;
procedure Ins(var pBegin:plist;var pEnd:pList;var pFind:plist;info:string);
begin
if info>=Pend^.Loadword then
Push(pEnd,Pend,info)
else
begin
if info<=pBegin^.Loadword then
begin
InsBegin(pBegin,info);
end
else
begin
new(pFind);
pFind:=pBegin;
InsMed(pFind,info);
end;
  end;
    end;
  var
  pBegin,Pend,pFind:plist;
  begin
CreateList(pBegin,'a');
new(PEnd);
pEnd:=pBegin;
Ins(pBegin,pEnd,pFind,'c');
Ins(pBegin,pEnd,pFind,'b');
Ins(pBegin,pEnd,pFind,'d');
Find(pBegin,pFind,'b');
view(pBegin);
readln;
end.
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #6 : 02 Мая 2010, 19:15:35 »
А так вобще то Google есть на свете и учебники. И принцип такой, есть указатель на начало и конец Когда список создается приравниваешь между собой два указателя, а как вставлять в конец смотри процедуру push. Сортировки же мы можем добиться, если сразу при вставке будем сравнивать ключ с начальным значением и конечным. Соответственно если начальный элемент меньше вставляемого, то вставка в начало, а если меньше конечного то в конец 
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн Nikgamer

  • Ветеран
  • *****
  • Сообщений: 610
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #7 : 02 Мая 2010, 19:45:55 »
А если больше головы, но меньше конечного, м? Без цикла никуда.
Я в курсе, что есть гугл. Да и про учебники в курсе. Вот только ежкин же кот, но в них про списки сказано пара слов и все.
Кстати, еще вопрос. Если есть цикл
for(t=h;t->next!=NULL;t=t->next)то почему, на последнем значении, он выходит не из цикла, а говорит "необработанное исключение" ?
депрессивный зануда и социофоб.

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #8 : 02 Мая 2010, 19:55:08 »
Да ты прав тогда нужен цикл смотри процедуры Ins_Med и сопутствующие. А так Nikgamer не те учебники смотришь)) Стивена прату посмотри для С, а так паскалевский учебник Окулова Основы программирования. приведи более полный фрагмент программы с циклом   
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн Nikgamer

  • Ветеран
  • *****
  • Сообщений: 610
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #9 : 05 Мая 2010, 16:40:50 »
Репортинг ин.
С сортировкой я вроде бы разобрался. Теперь проблема с печатью. Дело в том, что в своей программе использую такой оператор
while (scanf("%d", &a)==1и дело в том, что когда собственно, программисту надоедает вводить числа, я хочу, чтобы он выходил из while и шел дальше. Вместо этого он требует повторно вводить числа. Внимание, вопрос. Какой альтернативной структурой можно заменить это дело или как из нее все же выйти? Вводятся произвольное (в рамках разумного) кол-во целых чисел. Надо это реализовать.
депрессивный зануда и социофоб.

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #10 : 05 Мая 2010, 19:01:39 »
Вот небольшой примерчик
#include <ctype.h>
#include <stdio.h>
int main(void)
{
   char ch;
   for(;;)
   {
      ch = getc(stdin);
      if (ch == '.') break;
      if (isdigit(ch)) printf ("%c является цифрой\n", ch);
   }
return 0;
}
Используется функция символьного анализа, которая проверяет символ на вхождение в интервал от '0'..'9'
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

Оффлайн Nikgamer

  • Ветеран
  • *****
  • Сообщений: 610
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #11 : 06 Мая 2010, 20:48:09 »
Все решил.
депрессивный зануда и социофоб.

Оффлайн InfStudent

  • Модератор
  • *****
  • Сообщений: 1356
  • Куба любовь моя))
    • Просмотр профиля
Re: Упорядочивание списка
« Ответ #12 : 08 Мая 2010, 02:32:32 »
Молодец, скушай пирожок ;D
Прежде чем задавать вопрос в раздел по программированию повтори теорию и посмотри FAQ! Просьба не кидайте задания в ЛС и не надо мне писать: "посмотри мою задачу!!!" Я смотрю все задачи в разделе когда на форуме
Учтите что подобные ЛС будут оставлены без внимания!
УКАЗЫВАЙТЕ ЯЗЫК ПРОГРАММИРОВАНИЯ НА КОТОРОМ ДОЛЖНА БЫТЬ РЕШЕНА ЗАДАЧА
Вам в помощь:
∫ ¼ ½ ¾ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ² ³ ± ~ ‰ ∞ √ ∑ ∆ ℮ ∩ ≡ ≤ ≥ ≈ ∩

 

Написал поразрядную сортировку односвязного списка строк

Автор holloloh

Ответов: 0
Просмотров: 2499
Последний ответ 05 Октября 2011, 23:09:44
от holloloh
Упорядочивание видеорежимов.

Автор Tankograd

Ответов: 0
Просмотров: 3939
Последний ответ 17 Октября 2010, 21:15:03
от Tankograd