Выделение памяти для вложенных структур
Уже весь интернет облазила пока эту программу писала, но всё равно выдают ошибки.
const expr auto MAXS = 125;
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <string.h>
struct year {
char name[64];//содержит имя работников
char surname[10];//содержит фам. работников
struct year* NextYear;//указатель на следующий эл
};
struct profession {
struct profession* NextProfes;//указатель на следующий эл
int num;
char profes[30];//содержит профессии работников
char age[10];//содержит стаж работников
struct year* firstYear; //указатель на следующий эл
//struct year* lastYear;//указатель на предыдущ эл
};
struct profession* Head = NULL;
/////////////////////////////////
struct profession* FindTailProfes(struct profession* Head)
{
struct profession* temp = Head;
while (temp->NextProfes != NULL)
{
temp = temp->NextProfes;
}
return temp;
}
////////////////////////////////
struct profession* GetProfesData()
{
/*char data[30];
int data_num[20];*/
struct profession* temp;
struct profession pro[MAXS];
temp = (struct profession*)malloc(sizeof(struct profession)); // выделение памяти под корень списка
const int amounOfInf = 5;
if (temp) {
for (int i = 0; i < amounOfInf; i++) {
printf("Введите профессию работника: ");
scanf("%s", &pro[i].profes);//scanf("%s",data);-предыдущий код
/*strcpy(temp->profes, data);*/
printf("Стаж: ");
scanf("%s", &pro[i].age);//scanf("%s",data_num);-предыдущий код
/*strcpy(temp->age, data);*/
temp->NextProfes = NULL;
}
}
return temp;
}
/////////////////////////////
struct year* GetYearData()
{
struct year* temp;
struct year years[MAXS];
//char data[30];
temp = (struct year*)malloc(sizeof(struct year)); // выделение памяти под корень списка
const int amounOfInf = 5;
if (temp)
{
for (int i = 0; i < amounOfInf; i++)
{
printf("Введите имя работника: ");
scanf("%s", &years[i].name);// scanf("%s", data) -предыдущ код
//strcpy(temp->name, data);
printf("Введите фамилию работника: ");
scanf("%s", &years[i].surname);//scanf("%s", data)-предыдущий код
//strcpy(temp->surname, data);
temp->NextYear = NULL;
}
}
return temp;
}
//добавление элементов из profession в список
void AddProfes(struct profession** Head, int num, char pr_profes[30], char pr_age[10]) {
if ((*Head)==NULL)
{
*Head = malloc(sizeof(struct profession));
strcpy((*Head)->profes,pr_profes);
strcpy((*Head)->age,pr_age);
(*Head)->NextProfes = NULL;
(*Head)->firstYear;
}
else
{
struct profession* temp;
temp = (*Head);
while (temp->NextProfes)
{
temp = temp->NextProfes;
(temp->NextProfes) = malloc(sizeof(struct profession));
strcpy(temp->NextProfes->profes, pr_profes);
strcpy(temp->NextProfes->age, pr_age);
temp->NextProfes->NextProfes = NULL;
temp->NextProfes->firstYear = NULL;
}
}
}
//Объединение двух структур
void AddProfesToYear(struct profession * Head, char yr_name[64],char yr_surname[10])
{
struct year* yr = malloc(sizeof(struct year));
strcpy(yr->name, yr_name);
strcpy(yr->surname, yr_surname);
yr->NextYear = NULL;
if (Head->firstYear = NULL) {
Head->firstYear = yr;
}
else
{
struct year* node = Head->firstYear;
while (node->NextYear !=NULL) node = node->NextYear;
node->NextYear = yr;
}
}
//Отображение структур в консольном окне
void display(struct profession * Head)
{
int i = 1, b = 1;
struct profession* temp = Head;
if (temp == NULL)
{
printf("\nСписок пуст");
}
else if (temp !=NULL)
{
printf("%s %s",temp->profes,temp->age);
struct year* tempYe = Head->firstYear;
while (tempYe != NULL)
{
printf("%s",tempYe->name);
printf("%s", tempYe->surname);
struct year* tempYe = temp->firstYear;
b++;
}
temp = temp->NextProfes;
i++;
//printf("\n");
}
}
void pechat() {
system("chcp 1251");
system("cls");
const char vid[] =
"+==========================================+\n"
"| ФИО | Вид | |\n"
"|=====================| профессии| стаж |\n"
"| ИМЯ | фамилия | | |\n"
"+=====================+==========+=========+\n";
}
int main()
{
system("chcp 1251");
system("cls");
struct profession* list = NULL;
char name[64];//содержит имя работников
char surname[10];
int num;
char profes[30];//содержит профессии работников
char age[10];
pechat();
GetProfesData();
GetYearData();
display(list);
return 0;
}
Ответы (1 шт):
Автор решения: KoVadim
→ Ссылка
Перечитал ещё раз. Похоже Вы просто компилируете плюсовым компилятором. К сожалению, Вы сделали плохо и скрыли имена файлов, но подозревают, что там просто .cpp. Переименуйте их в .c и компилятор автоматически будет сишный.
---- если все таки нужно плюсовым компилятором ----
malloc возвращает void*. В си такой указатель можно легко присвоить другому. А в плюсах - нет. Поэтому, нужно явно писать
*Head = (profession*)malloc(sizeof(struct profession));
или ещё лучше так
*Head = static_cast<profession*>(malloc(sizeof(profession)));
в плюсах не нужно перед типом структуры писать struct.
