Здравствуйте.
Нужно создать программу, в которой будет создаваться односвязный линейный список студентов. И нужно сделать возможность изменения имени заданного студента.
При компиляции, выходят ошибки:
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка (активно) E0137 выражение должно быть допустимым для изменения левосторонним значением Student Work C:\Users\John\source\repos\Student Work\Student Work\main.c 87
Ошибка (активно) E1072 объявлению не может быть назначена метка Student Work C:\Users\John\source\repos\Student Work\Student Work\main.c 111
Ошибка C2106 =: левый операнд должен быть левосторонним значением Student Work C:\Users\John\source\repos\Student Work\Student Work\main.c 87
Как можно исправить эти ошибки?
И дополнительно, посоветуйте, как я могу улучшить мой код? Может, что-то можно написать проще, лучше или эффективнее?
Код main.c:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#define MAX 3
#define KOL 15
struct Student
{
int id;
char Name[KOL];
int Age;
float AverageRaiting;
struct Student* nextStudent;
};
void InitStudentList(struct Student** student)
{
*student = (struct Student*)
malloc(sizeof(struct Student));
(*student)->id = 1;
printf("Введіть ім’я 1-го студента: ");
scanf("%s", (*student)->Name);
printf("Введіть вік 1-го студента: ");
scanf("%d", &(*student)->Age);
printf("Введіть середній рейтинг 1-го студента: ");
scanf("%f", &(*student)->AverageRaiting);
printf("\n");
(*student)->nextStudent = NULL;
struct Student* endStudent = *student;
for (int i = 2; i <= MAX; i++)
{
endStudent->nextStudent =
(struct Student*) malloc(sizeof(struct Student));
endStudent = endStudent->nextStudent;
endStudent->id = i;
printf("Введіть ім’я %d-го студента: ", i);
scanf("%s", endStudent->Name);
printf("Введіть вік %d-го студента: ", i);
scanf("%d", &endStudent->Age);
printf("Введіть середній рейтинг %d-го студента: ", i);
scanf("%f", &endStudent->AverageRaiting);
printf("\n");
endStudent->nextStudent = NULL;
}
}
void PrintList(struct Student* student)
{
struct Student* printStudent = student;
printf("==========================\n");
printf("Номер Ім’я Вік Рейтинг \n");
printf("==========================\n");
while (printStudent)
{
printf("%d", printStudent->id);
printf("%-15s", printStudent->Name);
printf("%4d", printStudent->Age);
printf("%8.2f", printStudent->AverageRaiting);
printf("\n");
printStudent = printStudent->nextStudent;
}
printf("==========================\n");
}
void FreeList(struct Student** student)
{
if (*student == NULL)
return;
struct Student* tmp = *student;
struct Student* curr_stud;
while (tmp)
{
curr_stud = tmp;
tmp = tmp->nextStudent;
free(curr_stud);
}
*student = NULL;
}
void ChangeStudentName(int n, char name[KOL], struct Student* student)
{
struct Student* changingStudent = student;
while (changingStudent)
{
if (changingStudent->id == n)
{
changingStudent->Name = name;
printf("зміни записані");
break;
}
}
}
int main(void)
{
int command;
struct Student* BaseStudent = NULL;
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
InitStudentList(&BaseStudent);
for (;;)
{
printf("Введіть команду:\n 1 - Виведення списку студентів,\n 2 - Змінити прізвище зазначеного студента,\n 3 - вихід\n");
scanf("%d", &command);
switch (command)
{
case 1:
PrintList(BaseStudent);
break;
case 2:
int n;
char name[KOL];
printf("Введіть номер студента: ");
scanf("%d", &n);
printf("Введіть нове ім'я студента: ");
scanf("%s", &name);
ChangeStudentName(n, name, BaseStudent);
break;
case 3:
FreeList(&BaseStudent);
return 0;
break;
default:
printf("Помилка вводу...");
FreeList(&BaseStudent);
return 0;
break;
}
}
return 0;
}
Заранее благодарен!