Я пытался сделать пример связанного списка. Сначала я добавил значения к переменным, и проблем не было. Но когда я попытался получить значения от пользователя, программа вылетела при входе в промежуточный 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;
}
1
FlyingTurtle 4 Апр 2014 в 12:50

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 требуется для чтения область памяти с данными.

Удачи

0
Tanmay Patil 4 Апр 2014 в 13:27
Спасибо я исправил их, но основная проблема все еще существует
 – 
FlyingTurtle
4 Апр 2014 в 13:07
Рад узнать, что это помогло.
 – 
Tanmay Patil
4 Апр 2014 в 14:05

В вашем коде несколько ошибок.

Начнем с того, что в первом scanf("%s", node->name) отсутствует завершающая точка с запятой.

Далее, ваши сигнатуры функций неаккуратны. main() должно быть int main(void). addStudent() должно быть int addStudent(void). (Или избавьтесь от его return 0 и позвольте ему вернуть void.) Поскольку вы не объявляете заранее addStudent(), вы должны определить его до main(), чтобы { {X8}} может знать об этом.

Однако сбой происходит из-за того, что вы не выделили память для node->name. Вы выделили память для node, но это не дает вам места для ввода имени.

0
Alex Trebek 4 Апр 2014 в 13:02
Спасибо за помощь. Я знаю, что есть много ошибок. я исправлю их позже. Итак, как я могу выделить память для узла?
 – 
FlyingTurtle
4 Апр 2014 в 13:16