C - Доступ к связанному списку внутри связанного списка - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь создать связанный список учеников, где у каждого ученика есть связанный список оценок.Я застрял, пытаясь получить доступ к оценкам учащегося, используя следующую структуру данных:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

typedef struct student_list_struct{
    char student[MAX];
    struct grades_list_struct *grade_head_ptr;
    struct student_list_struct *next;
} StudentNode;

typedef struct grades_list_struct{
    int grade;
    struct student_list_struct *next;
} GradeNode;

GradeNode *insertGrade(int grade, GradeNode *head){
    GradeNode *newNode=NULL;
    newNode=(GradeNode*)calloc(1, sizeof(GradeNode));

    if(head!=NULL){
        newNode->grade=grade;
        return newNode;
    } else {
        newNode->grade=grade;
        newNode->next=NULL;
        return newNode;
    }
}

StudentNode *insertStudent(char studentName[MAX], int studentGrade, StudentNode *head){
    StudentNode *newNode=NULL;
    newNode=(StudentNode*)calloc(1, sizeof(StudentNode));
    newNode->grade_head_ptr=(GradeNode*)calloc(1, sizeof(GradeNode));

    if (head==NULL){
        strcpy(newNode->student, studentName);
        newNode->next=NULL;
        newNode->grade_head_ptr=insertGrade(studentGrade, newNode->grade_head_ptr);
        return newNode;
    } else {
        strcpy(newNode->student, studentName);
        newNode->grade_head_ptr->grade=studentGrade;
        newNode->grade_head_ptr=insertGrade(studentGrade, newNode->grade_head_ptr);
        return newNode;
    }
}

void printGrades(char studentName[MAX], StudentNode *head){
    StudentNode *p=NULL;
    p=head;

    while (p!=NULL){
        if (strcmp(p->student,studentName)==0){
            printf("%d\n", p->grade_head_ptr->grade);
        }
        p->grade_head_ptr=p->grade_head_ptr->next;
    }
}

int main(){
    StudentNode *head=NULL;
    StudentNode *temp=NULL;

    head=insertStudent("Student A", 10, head);
    head=insertStudent("Student A", 20, head);
    printGrades("Student A", head);
}

В настоящее время он ничего не печатает и не возвращает, и я не могу понять, что не так с моей структурой данных.Возможно, это связано с тем, как я пытаюсь получить оценку, используя head->grade_head_ptr->grade.

. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 18 февраля 2019

Вы не выделяете указатель grade_head_ptr, прежде чем использовать его в функции insertStudent.Это приведет к ошибке сегментации.Поэтому, пожалуйста, используйте после выделения указатель newNode в этой функции.

newNode->grade_head_ptr = (GradeNode*)calloc(1, sizeof(GradeNode));

для выделения памяти для grade_head_ptr Вот целая функция insertStudent

StudentNode *insertStudent(char studentName[100], int studentGrade, StudentNode *head) {
    StudentNode *newNode = NULL;
    newNode = (StudentNode*)calloc(1, sizeof(StudentNode));
    newNode->grade_head_ptr = (GradeNode*)calloc(1, sizeof(GradeNode));

    if (head == NULL) {
        strcpy(newNode->student, studentName);
        newNode->next = NULL;
        newNode->grade_head_ptr->grade = studentGrade;
        newNode->grade_head_ptr->next = NULL;
        return newNode;
    }
    else {
        strcpy(newNode->student, studentName);
        newNode->grade_head_ptr->grade = studentGrade;
        return newNode;
    }
}

Дляиспользуя insertStudent, вы используете строковый литерал «Student A», он сообщит об ошибке компилятора, потому что понял, что это const char *, который несовместим с вашим прототипом функции.Поэтому, пожалуйста, используйте массив символов и присвойте ему значение «Student A»:

    char studentName[] = "Student A";
    head = insertStudent(studentName, 10, head);

Это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...