c - C - 访问链表内的链表
问题描述
我正在尝试创建一个学生链接列表,其中每个学生都有一个成绩链接列表。我被困在尝试使用以下数据结构访问学生的成绩:
#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
.
任何帮助将不胜感激。
解决方案
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;
}
}
对于 using insertStudent
,您使用的是字符串文字“Student A”,它会报告编译器错误,因为它理解它是 const char* 与您的函数原型不兼容。因此,请使用字符数组并分配“学生 A”值:
char studentName[] = "Student A";
head = insertStudent(studentName, 10, head);
它应该工作。
推荐阅读
- python - 停止 NavigationToolbar2Tk 显示坐标
- neo4j - 如何删除neo4j COMPLETE?
- android - 应用程序拒绝除联系人列表之外的所有呼叫 - 如何创建?安卓 8
- javascript - 使用顶点图的 Y 轴字体颜色
- r - 无法将闪亮的应用程序部署到 shinyapp.io(无法访问 github repo 以获取 pacakge 依赖项?)
- jquery - 带有 jQuery 的确认框
- python - 返回两次之间的随机时间
- python - 在 tkinter 窗口中显示命令提示符
- apache-kafka-connect - Kakfa 源 Postgres 连接器显示为接收器连接器
- c# - lambda 回调或直接回调之间的 Blazor 区别