Ошибка сегментации при создании списка - 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 элементов, затем он сортируется и выводится на экран. После этого список очищается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д