想法是想做一个Teacher结构体数组,数组中每个元素带一个Student的单链表,类似与图的邻接表表示的一个数据结构。
假设有2个教师结构体,每个教师后面跟2个学生。
先命名2个结构体,再声明4个学生结构体和2个教师。
typedef struct StudentNode{//这里如果不写StudentNode,结构体里面就没办法用这个自己类型的结构体
string name;
int age;
int score;
struct StudentNode* next;
}*StuList, StudentNode;
struct Teacher {
string name;
int age;
struct StudentNode * first;
};
int main(){
StudentNode S1;
StudentNode S2;
StudentNode S4 ;
StudentNode S5 ;//声明4个学生节点,这里面没有S3,一会儿再写S3
struct Teacher Teacherlist[2];//声明一个教师结构体的数组
}
然后写一个初始化函数
void InitStudentNode(StudentNode&p, string name, int age, int score) {
p.name = name;
p.age = age;
p.score = score;
p.next = NULL;
};
调用InitStudentNode函数对刚刚声明的4个学生结构体进行赋值。
InitStudentNode(S1, "张三", 26, 89);
InitStudentNode(S2, "lihua", 22, 88);
InitStudentNode(S4, "lili", 20, 77);
InitStudentNode(S5, "liming", 29, 95);
S1.next =&S2;
S4.next = &S5;//把S2学生节点挂在S1后面,把S5挂在S4后面
Teacherlist[0].name = "李老师";
Teacherlist[1].name = "张老师";
Teacherlist[0].age = 25;
Teacherlist[1].age = 44;
Teacherlist[0].first = &S1;
Teacherlist[1].first = &S4; //给老师结构体赋值,并把学生S1挂在李老师后面,S3挂在张老师后面
这时就可以通过老师查到他的学生了
这里面出错的点是,首先一开始声明学生节点时声明的是指针类型,传入函数后发现无法赋值。这是因为对指针的使用不熟悉导致的,例如再声明一个指针类型的学生S3
StudentNode * S3;//在main中声明一个指针类型的学生结构体S3
InitStudentNode(*S3,"李华",18,80)//并调用Init函数对他进行赋值
发现报错了!提示使用了未初始化的变量S3。试一下不调用函数直接赋值可以么,答案是不可以;试一下让S3指针指向malloc的一片地址可以么,如果让S3指向一片malloc的地址,然后再赋值,会发现可以赋值里面Int型变量会下划波浪线提示,甚至可以cout输出,但是string类型的就会直接报错(这个还没搞明白为啥)
//1)
S3->name = "zhangsan";
S3->age = 19;
S3->score = 99;
S3->next = NULL;//试一下假设这样赋值可以么
//2)
S3= (StudentNode*)malloc(sizeof(StudentNode));
S3->name="zhangsan";
S3->age=18;
正确做法是给S3一个初始值
StudentNode R;
StudentNode* S3= &R;
InitStudentNode(*S3,"李华",18,80)
S2.next=S3;//把S3挂到S2后面
这样就不报错啦!
这个问题实际上是指针的问题,例如int *p,这时就不能写int *p=10,不能直接给指针赋值,要int a=10;int *p=&a;这时p就指向了一个int型区域,内容为10了。