Помощь - Поиск - Пользователи - Календарь
Полная версия: Упорядочивание односвязного списка (С) > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
Nikgamer
Привет. Вот дали на мою голову такую задачку, с условием, что реализую на СИ (без ++-ов). Задача формулируется так. На вход подается произвольное кол-во натуральных чисел (не по порядку, с повторами 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
Блочок добавления в серёдку/конец надо доработать....
Во внутреннем if надо break поставить, а то он будет один элемент перед всеми добавлять...

ну а вывод... Не знаю, с самым сложным справились, а вывод не можете?
Код

while(h)
{
printf("%d\n",h->data);
h=h->next;
}

Как-то так))
Nikgamer
Спасибо за отклик. А куда этот блок печати пихать? Дело в том, что если закончится ввод с клавиатуры, то он не выйдет из
Код
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
мой цикл надо ставить после Вашего, то есть вот так:
Код
while (scanf("%d", &a)==1){...}
while(h) {...}
И нужно предусмотреть конец ввода. Я завершал ввод, когда это отлаживал, комбинацией Ctrl+Z, но можно, например, выходить из цикла при a=0 или -1.
Nikgamer
Цитата(Vahappaday @ 6.5.2010, 11:50) *

мой цикл надо ставить после Вашего, то есть вот так:
Код
while (scanf("%d", &a)==1){...}
while(h) {...}
И нужно предусмотреть конец ввода. Я завершал ввод, когда это отлаживал, комбинацией Ctrl+Z, но можно, например, выходить из цикла при a=0 или -1.

Спасибо вам за помощь. Все заработало, теперь вот размышляю, что скажет препод об обязательном нажатии определенной комбинации при конце ввода, но да это как-нибудь утрясется, может я это дело в файл запихаю.
Vahappaday
пожалуйста)

Ctrl+Z - это в общем-то комбинация, эквивалентная EOF для файла, так что тут всё корректно, если потом запустить экзешник вот так:
myexe.exe << input.txt
где input.txt содержит входные числа, то всё будет отлично работать.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.