![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Nikgamer |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Продвинутые Сообщений: 9 Регистрация: 22.4.2010 Город: Novosibirsk ![]() |
Привет. Вот дали на мою голову такую задачку, с условием, что реализую на СИ (без ++-ов). Задача формулируется так. На вход подается произвольное кол-во натуральных чисел (не по порядку, с повторами etc.). Нужно, используя односвязный список, отсортировать эти числа по возрастанию, удалить повторы и распечатать, собственно, получившийся список.
Ну-с, проблемы с реализацией. Ниже будет приаттачен мой индусский быдлокод. Вопросов 2. Первый - правильно ли сортируется? Второй - как реализовать печать? Код #include <stdio.h> #include <stdlib.h> int main () { int a; struct list {int data; struct list *next;}; struct list *h, *t, *p,*r,*c=NULL,*d; h=(struct list*)malloc(sizeof(struct list)); h->data=0; h->next=NULL; while (scanf("%d", &a)==1){ p=(struct list*)malloc(sizeof(struct list)); p->data=a; p->next=NULL; if(h->data==0){ h->data=p->data; continue; } if(p->data<h->data){ p->next=h; h=p; } if(p->data>h->data){ for(t=h;t->next!=NULL;t=t->next){ if(p->data<t->next->data){ c=t->next; t->next=p; p->next=c; } } t->next=p; } } return 0; } |
![]() ![]() |
Vahappaday |
![]()
Сообщение
#2
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Блочок добавления в серёдку/конец надо доработать....
Во внутреннем if надо break поставить, а то он будет один элемент перед всеми добавлять... ну а вывод... Не знаю, с самым сложным справились, а вывод не можете? Код while(h) { printf("%d\n",h->data); h=h->next; } Как-то так)) |
Nikgamer |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Продвинутые Сообщений: 9 Регистрация: 22.4.2010 Город: Novosibirsk ![]() |
Спасибо за отклик. А куда этот блок печати пихать? Дело в том, что если закончится ввод с клавиатуры, то он не выйдет из
Код while (scanf("%d", &a)==1) а затребует еще чисел. Вследствие чего и возникает вопрос. Ведь если Код while(h) ставить внутрь { printf("%d\n",h->data); h=h->next; } Код while (scanf("%d", &a)==1) то ничего не выйдет, потому что в промежуточных шагах список еще не будет упорядоченный. Да и вообще, он много раз выведет одно и тоже. А что не так с блоком, начинающимся с Код if(p->data>h->data) Ткните пальцем, я просто может не вижу чего. Да, break нужно добавить, это я не углядел. |
Vahappaday |
![]()
Сообщение
#4
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
мой цикл надо ставить после Вашего, то есть вот так:
Код while (scanf("%d", &a)==1){...} И нужно предусмотреть конец ввода. Я завершал ввод, когда это отлаживал, комбинацией Ctrl+Z, но можно, например, выходить из цикла при a=0 или -1.while(h) {...} |
Nikgamer |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Продвинутые Сообщений: 9 Регистрация: 22.4.2010 Город: Novosibirsk ![]() |
мой цикл надо ставить после Вашего, то есть вот так: Код while (scanf("%d", &a)==1){...} И нужно предусмотреть конец ввода. Я завершал ввод, когда это отлаживал, комбинацией Ctrl+Z, но можно, например, выходить из цикла при a=0 или -1.while(h) {...} Спасибо вам за помощь. Все заработало, теперь вот размышляю, что скажет препод об обязательном нажатии определенной комбинации при конце ввода, но да это как-нибудь утрясется, может я это дело в файл запихаю. |
Vahappaday |
![]()
Сообщение
#6
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
пожалуйста)
Ctrl+Z - это в общем-то комбинация, эквивалентная EOF для файла, так что тут всё корректно, если потом запустить экзешник вот так: myexe.exe << input.txt где input.txt содержит входные числа, то всё будет отлично работать. |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 19:38 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru