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