Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2013, 15:59   #1
Vasya94
Пользователь
 
Регистрация: 20.04.2013
Сообщений: 55
По умолчанию Двусвязные линейные списки на Си

Дано текстовый файл, содержащий информацию об игрушках. В каждой строке файла записано название игрушки и цена, которая разделена пробелами. Информация в файл заносилась длительное время, причем предварительная информация НЕ корректировалась, а новые данные дописывались до конца файла. Поэтому в файле может встречаться информация об одних и тех же игрушки, но с разной ценой. Вывести окончательную информацию об игрушках по возрастанию цены, а игрушки с одинаковой ценой вывести по алфавиту.
Vasya94 вне форума Ответить с цитированием
Старый 19.10.2013, 17:37   #2
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
#include <stdio.h>
#include <malloc.h>
#include <string.h>


typedef struct _list {
      char  name[64];
      int   price;
      struct _list* next;
      struct _list* prev;
} list;

void  add(list** head, list** tail, const char* name, int price);
void  clear(list** head, list** tail);
void  insert_sort(list** head, list** tail, int (*pred_cmp)(const list*, const list*));




//pred sort
int sort_cmp(const list* a, const list* b) {
        int n;
        if(a->price > b->price)
                return 1;
        n = a->price - b->price;
         return (!n && tolower(a->name[0]) > tolower(b->name[0])) ? 1 : 0;
}




int main(void) {
        FILE* fp;
        char  buf[64];
        int   val;
        list* i, *head = NULL, *tail = NULL;

        //...
        fp = fopen("data.txt", "rt");
        if(! fp)
               return 1;

        while(fscanf(fp, "%63s%d", buf, &val) == 2)
                 add(&head, &tail, buf, val);
        fclose(fp);

        //сортируем
        insert_sort(&head, &tail, sort_cmp);

        //вывод
        for(i = head; i != NULL; i = i->next)
                printf("name: %s\t\tprice: %d\n", i->name, i->price);
        putchar('\n');

        clear(&head, &tail);
        return 0;
}




// добавление
void add(list** head, list** tail, const char* name, int price) {
       list* p = (list*)malloc(sizeof(list));
       p->next = NULL;
       p->prev = NULL;
       strcpy(p->name, name);
       p->price = price;

       if(*head == NULL)
             *head = *tail = p;
       else {
             (*tail)->next = p;
             p->prev = *tail;
             *tail  = p;
       }
}



// чистка
void clear(list** head, list** tail) {
      list* tmp, *ptr = *head;
      while(ptr != NULL) {
             tmp = ptr;
             ptr = ptr->next;
              free(tmp);
      }
     *head = *tail = NULL;
}




//сортировка вставками
void  insert_sort(list** head, list** tail, int (*pred_cmp)(const list*, const list*)) {
       list* tmp, *pa, *pb, *ptr, *iter;

       tmp = NULL;
       for(iter = *head; iter != NULL; ) {
                pa  = iter;
                iter = iter->next;
                pb  = tmp;
                for(ptr = NULL; (pb != NULL) && (*pred_cmp)(pa, pb); ) {
                        ptr = pb;
                        pb  = pb->next;
                }
                
                if(ptr == NULL) {
                        pa->next = tmp;
                        if(tmp != NULL)
                                tmp->prev = pa;
                        tmp = pa;
                } else {
                        pa->next = pb;
                        if(pb != NULL)
                                pb->prev = pa;
                        ptr->next = pa;
                }

                pa->prev = ptr;
                if(pa->next == NULL)
                      *tail = pa;
       }

       if(tmp != NULL)
                *head = tmp;
}
Nuklon вне форума Ответить с цитированием
Старый 20.10.2013, 00:19   #3
Vasya94
Пользователь
 
Регистрация: 20.04.2013
Сообщений: 55
По умолчанию

Простите но здесь не найдено идентификатор
Код:
  return (!n && tolower(a->name[0]) > tolower(b->name[0])) ? 1 : 0;
Vasya94 вне форума Ответить с цитированием
Старый 20.10.2013, 05:06   #4
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,609
По умолчанию

У меня скомпилировался приведенный здесь код без ошибок. Код качественный.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 20.10.2013, 12:01   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
У меня скомпилировался приведенный здесь код без ошибок. Код качественный.
http://www.cplusplus.com/reference/cctype/tolower/
tolower находится в неподключенном хедере (в С++)
gcc код жует (в отличии от g++)
rrrFer вне форума Ответить с цитированием
Старый 20.10.2013, 19:01   #6
Vasya94
Пользователь
 
Регистрация: 20.04.2013
Сообщений: 55
По умолчанию

спасибо огромное)
Vasya94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
visual studio c++ Линейные двусвязные списки Aziret Общие вопросы C/C++ 2 10.06.2012 15:22
Двусвязные списки aidar9012 Помощь студентам 6 28.06.2010 02:05
Двусвязные линейные списки (С++) valdemar593 Помощь студентам 2 29.03.2010 10:43
двусвязные списки ai\ekcah^p Общие вопросы C/C++ 11 06.06.2009 19:13