Си задача на упорядоченный список, Помогите дорешать, пожалуйста |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
Си задача на упорядоченный список, Помогите дорешать, пожалуйста |
Eichhorn |
22.10.2011 11:13
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 50 Пол: Женский Реальное имя: Сафиуллина Алёна Репутация: 1 |
Из командной строки программе подается имя файла, содержащего слова (длины слов ограничены некой константой).
Программа считывает слова, и по очереди добавляет их в упорядоченный список, сохраняя упорядоченность списка на каждом шаге. После считывания всех строк, программа выводит список на экран - сперва в прямом, затем в обратном порядке. Для вывода списка в обратном порядке, список необходимо развернуть (сделать так, чтобы последний элемент стал первым, и т. д.). Реализацию разворота списка выполнить двумя способами: итеративно (”в цикле”) и рекурсивно. Продемонстрировать работу обоих способов. Пример: input.txt: cccc z bbb program.exe input.txt bbb cccc z z cccc bbb Код #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #define N 10 struct list{ char data; struct list*next; }; struct list * create(int data) { struct list *p = (struct list*)calloc(1,sizeof(struct list)); p->data=data; p->next=0; return p; } struct list * insert_sorted(struct list * head, int data) { struct list *i=head; struct list *k=head->next; //1. создать элемент списка с пом. create struct list *p=create(data); //2. проверить, нужно ли вставить новый элемент перед головой //3. если да, сделать так и вернуть указатель на этот элемент (новая голова) if(data<head->data){ p->next=head; return p; } //4. если нет, написать цикл, подыскивающий место для вставки нового элемента //5. вставить элемент в найденную позицию while(k!=0 && k->data<data){ k=k->next; i=i->next; } i->next=p; p->next=k; //6. вернуть "старую" голову (не потерять ее) return head; } void print_list(struct list * head) { struct list * p = head; while(p!=0){ printf("%d ", p->data); p=p->next; } } struct list * reverse_list(struct list * head) { struct list * p = head; struct list * s = head->next; struct list * t = s->next; p->next=NULL; while(s->next) { s->next = p; p = s; s = t; t = t->next; } s->next = p; head = s; p = head; while(p->next){ printf("%d ",p->data); p = p->next; } printf("%d ",p->data); } void free_list(struct list * head) { struct list * p=head; while(p!=0){ free(p); p=p->next; } } int main() { int n; struct list * p =0; //1. Завести переменную-указатель на голову списка (head). struct list * head=0; //2. Корректно открыть файл и т. д. FILE * f=fopen("fail.txt","r"); if(f==0){ printf("%s","Fail ne otkrit\n"); // return -1; } //3. Считать из файла первый элемент (число) /*fscanf(f,"%d",&n); //4. создать с этим число новый элемент списка, записать его в head. head = create(n); //5. написать цикл "пока есть что читать из файла" while(!feof(f)){ //6. в цикле - читать очередной элемент данных fscanf(f,"%d",&n); //7. добавлять элемент в список с помощью функции insert_sorted head = insert_sorted(head,n); } //8. после цикла - вывести на экран список print_list(head); //9. развернуть список reverse_list(head); //10. вывести еще раз список print_list(head); //11. освободить список free_list(head); fclose(f); */ getch(); return 0; } Не могу найти ошибку. Пишу в devcpp. Вылетает с непонятной ошибкой. Сообщение отредактировано: Eichhorn - 22.10.2011 11:14 -------------------- Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
|
IUnknown |
22.10.2011 11:37
Сообщение
#2
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Что именно вылетает? У тебя ж всё закомментировано, ничего не выполняется. Открывается файл и всё. А если имеется в виду раскомментированный код - то естественно, что программа вылетает. Смотри:
struct list{ , что происходит потом? Ты пытаешься struct list * create(int data). Ну, и наконец... Читать из файла надо слова, а это вообще char*, а не числа, и тем более не char-ы. P.S. Еще кое-что. У тебя функция reverse_list() предназначена для чего? Чтоб развернуть список. Не должна она ничего печатать. Достаточно вернуть указатель на новую "голову" списка, и потом распечатать через print_list() : struct list * reverse_list(struct list * head) Сообщение отредактировано: IUnknown - 22.10.2011 12:00 |
Eichhorn |
22.10.2011 12:19
Сообщение
#3
|
Пионер Группа: Пользователи Сообщений: 50 Пол: Женский Реальное имя: Сафиуллина Алёна Репутация: 1 |
Мм. Сори, не уточнила. Нам сказали сначала сделать с числами. Отсюда и путаница с типами данных. Там должно быть Int. Не заметила, что не везде исправила. Спасибо за подсказку. Сейчас исправлю, перепроверю.
А закомментировано потому что я искала где вылетает и забыла снять комментарий, когда сюда код копировала. Добавлено через 5 мин. Спасибо огромное!!! Всё работает! Сообщение отредактировано: Eichhorn - 22.10.2011 12:20 -------------------- Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
|
Текстовая версия | 26.09.2024 1:40 |