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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5