C++中结构体指针要做初始化

想法是想做一个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了。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值