Ошибка сегментации при создании списка - C (СИ)
Формулировка задачи:
Здрасти)))
Вот такая небольшая проблема со списком)))) список читаем из файла и сортируем его)) список из целых чисел)) и прост на экран вывести)) у нас пока 1 лекция ток была по си.. и самому интересно стало и сам начал разбираться вот дошел до списков и застрял((...
вот он чет не создает этот список(( ошибка сегментации((
еще если можно не смогли б подсказать как узнать сколько чисел в файле записанно))
struct Node { int ch; Node *next; }; typedef Node *pNode; main(){ clrscr(); int i; pNode First = NULL, Curr = NULL, Last = NULL; FILE *f; f=fopen("file.txt", "r"); if ((f=fopen("file.txt", "r"))==NULL) { printf("\n Fayla net!!!"); getch(); return 1; } ................. ................ First = new Node; Curr = First; for (i=0; i<count; i++) if (fscanf(f, "%d", Last->ch)==0) { Last->next = new Node; Last = Last->next; } Curr = First; do { printf(" %3d",Curr->ch); Curr = Curr->next; } while (Curr == NULL); fclose(f); ............
Решение задачи: «Ошибка сегментации при создании списка»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> typedef struct Item* pItem; struct Item { int value; pItem next; }; pItem new_item(int value) { pItem newp = (pItem)malloc( sizeof(struct Item) ); newp->value = value; newp->next = NULL; return newp; } //------------- pItem push_back(pItem listp, pItem newp) { pItem p; if(listp == NULL) return newp; for(p = listp; p->next != NULL; p = p->next); p->next = newp; return listp; } //------------- void print_list(pItem listp) { while(listp) { printf("%d ", listp->value); listp = listp->next; } putchar('\n'); } //------------- void sort(pItem listp) { int i; pItem p1, p2; for(p1 = listp; p1; p1 = p1->next) { for(p2 = listp; p2; p2 = p2->next) { if(p1->value < p2->value) { i = p1->value; p1->value = p2->value; p2->value = i; } } } } void clean_up(pItem listp) { pItem p; while(listp) { p = listp->next; free(listp); listp = p; } } //------------- int main() { int i; pItem listp = NULL; for(i = 10; i >= 1; --i) listp = push_back(listp, new_item(i)); puts("Before:"); print_list(listp); puts("After:"); sort(listp); print_list(listp); clean_up(listp); return 0; }
Объяснение кода листинга программы
Код представляет собой реализацию односвязного списка в языке C. Список начинается с NULL, то есть пуст. Функция new_item() создает новый элемент списка с заданным значением и добавляет его в конец списка (функция push_back()). Функция print_list() проходит по всем элементам списка и выводит их значения. Функция sort() сортирует элементы списка по возрастанию. Функция clean_up() освобождает память, выделенную под каждый элемент списка, начиная с последнего и двигаясь к первому. В функции main() создается список из 10 элементов, затем он сортируется и выводится на экран. После этого список очищается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д