Я пытался сделать пример связанного списка. Сначала я добавил значения к переменным, и проблем не было. Но когда я попытался получить значения от пользователя, программа вылетела при входе в промежуточный 2-й класс. Я пробовал другие функции ввода, но результат тот же. В чем проблема?
#include <stdio.h>
struct student
{
char *name;
int m1,m2,final;
struct student* next;
};
main()
{
addStudent();
system("PAUSE");
}
addStudent()
{
struct student *node = NULL;
struct student *firstnode;
firstnode = (struct student *)malloc(sizeof(struct student));
node = firstnode;
printf("press 0 to exit \n");
while(1)
{
printf("Student name: ");
scanf("%s", node->name)
if(node->name == "0") break;
printf("Midterm 1: ");
scanf("%d", node->m1);
printf("Midterm 2: ");
scanf("%d", node->m2);
printf("Final: ");
scanf("%d", node->final);
node->next = (struct student *)malloc(sizeof(struct student));
node = node->next;
}
node->next = NULL;
node = firstnode;
while(node->next);
while(node->next != NULL)
{
printf("%s - ",node->name);
printf("%d ", node->m1);
printf("%d ", node->m2);
printf("%d ", node->final);
node = node->next;
}
system("PAUSE");
return 0;
}
2 ответа
Исправить 1
Удалите строку
while(node->next);
Причина: в большинстве случаев это приведет к бесконечному циклу, и в этом нет необходимости.
Исправить 2
Заменить петлю
while(node->next != NULL) {
}
С участием
if (node->next != NULL) {
while (node->next->next != NULL) {
}
}
Причина: вы каждый раз выделяете одну дополнительную структуру и оставляете ее пустой для чтения в следующий раз. Таким образом, связанный список закончится до того, как следующий станет NULL.
Исправить 3
Заменить следующее в структуре
char *name;
С участием
char name[80];
Причина: память не выделяется.
Исправить 4
Заменить при всех вхождениях scanf
(кроме name
)
scanf("%d", node->m1);
С участием
scanf("%d", &node->m1);
Причина: scanf
требуется для чтения область памяти с данными.
Удачи
В вашем коде несколько ошибок.
Начнем с того, что в первом scanf("%s", node->name)
отсутствует завершающая точка с запятой.
Далее, ваши сигнатуры функций неаккуратны. main()
должно быть int main(void)
. addStudent()
должно быть int addStudent(void)
. (Или избавьтесь от его return 0
и позвольте ему вернуть void
.) Поскольку вы не объявляете заранее addStudent()
, вы должны определить его до main()
, чтобы { {X8}} может знать об этом.
Однако сбой происходит из-за того, что вы не выделили память для node->name
. Вы выделили память для node
, но это не дает вам места для ввода имени.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.