2015-10-21 3 views
0

У меня есть функцияСоздание связанного списка из файла в C

Bell* reading(FILE* fp, int* numbptr) 
{ 


Bell* newPtr; 
newPtr = malloc(sizeof(Bell)); 
if (newPtr == NULL){ 
    printf("Error"); 
} 

while(newPtr!= NULL){ 


fread(newPtr->brand, sizeof(Bell), sizeof(newPtr->brand), fp); 
fread(&newPtr->price, sizeof(Bell), sizeof(newPtr->price), fp); 
} 

, который, кажется, чтобы создать первый узел, но я не знаю, как связать первый узел к следующему. Я понимаю, что еще не создал второй узел. Связанные списки для меня совершенно новые.

Кроме того, с приведенным выше кодом я получаю ошибку stackdump. Не знаю, почему это так.

структура выглядит следующим образом:

typedef struct bell 
{ 
    char brand[20]; 
    int price; 
    struct Bell* nextBell; 
} Bell; 

ответ

0

В этом контексте, вы обычно устанавливается next элемент 0 (NULL) в этой функции. Это полностью инициализирует один элемент (хотя вы должны проверить, что вызовы fread() преуспевают, а ваше сообщение об ошибке должно заканчиваться символом новой строки и печататься со стандартной ошибкой - stderr предназначен для использования для сообщения об ошибках).

Ваш while цикл не подходит. Или, если это уместно, вам нужно сделать выделение памяти внутри цикла; в противном случае каждая новая запись просто перезапишет последнее, что приведет к хаосу. Вам также нужно добавить каждый элемент в список внутри цикла и узнать, что указывает на заголовок списка. Глобальная переменная является общим ответом в коде для начинающих; это не очень хороший ответ (но он работает, потому что код не должен адаптироваться для обработки нескольких списков одновременно и т. д.).

Ваша функция не использует аргумент numptr. Лучше всего оставить неиспользованные параметры, пока не найдете, что вам нужно. (Конечно, если вы кодируете интерфейс, вам может понадобиться это немедленно, даже если вы его не используете.)

Ваш вызывающий код отвечает за соединение единственной структуры Bell в списке. Часто это делается с:

Bell *head = 0; 

Bell *node; 
while ((node = reading(fp)) != 0) 
{ 
    node->next = head; 
    head = node; 
} 

Это неоднократно читает одну запись (я предполагаю, что соответствующим образом пересмотренный интерфейс и функции тела) и добавляет его к передней части списка (на сегодняшний день самый простой способ, чтобы добавить его к списку).

Я бы, вероятно, переименовал функцию read_bell или около нее. И если вы хотите инкапсулировать чтение многих колоколов в одну функцию, тогда у меня будет функция для чтения одной записи колокола, а другая функция содержит цикл, который повторно вызывает функцию «читать один звонок».

Если у вас есть разные требования, вы должны сказать это заранее. Неполные спецификации приводят к неправильным программам.

Смежные вопросы