结构体与链表学习

这几天都在为了学习数据结构准备,刷了一些题 但都比较简单,就没有发每日一题了~

结构体的定义和结构变量的定义

这个比较简单就看书就好,这里介绍我看到的比较新颖的结构变量定义.

利用宏定义使用一个符号变量来表示一个结构类型和定义结构变量

#define STU struct student

STU

{

       int num;

        char name[20];

};

STU stu1,stu2;

同一个结构体的变量与变量之间可以进行赋值的操作,注意要对一个结构体变量进行输入输出等操作的时候需要使用"."这个运算符,也就是点,比如 stu1.num就是第一个"人"的学号,stu2.name就是第二个"人"的名字,其实就看作一个普通的int变量/char数组就可以了

结构数组的定义和引用

结构数组其实就是一个数组,其中每个元素都是一个结构体的变量而已,

指向结构变量的指针

也就是结构指针变量,实质上就是指向一个结构体中的变量的指针,只是这个变量是一个结构体类型的变量,也就是stu1和stu2这样的,这个指针中的地址是这个结构变量的首地址,问题是结构变量的首地址是什么,在哪儿?或者换个问题,一个结构体变量中的各个变量数组的地址是否是连续的?即stu1和stu2中定义的num和name[20]是否连续储存,是否有规则的分配空间?

结构指针变量的定义:struct student *p

注意:结构体指针只能进行如下指向(赋值)p=&stu1,而不能有p=&student和p=&stu1.num的赋值方式.

有了结构指针变量,可以方便的访问结构变量中的每个元素,如(*p).num或者p->num与stu1.num等价

注意:"."优先级高于"*"所以括号不可少,且我们更在面对这种指针时习惯用p->num.

结构变量与函数参数

我们可以用结构变量的成员作为作为参数,如void print(struct student s),但这时跟普通变量的函数一样,属于值传递,我们可以用两种方式来避免值传递的缺陷

方法一

在函数中定义一个相同结构体的变量,最后返回这个结构体变量就可以

方法二

也就是使用指针,void print(struct student *p)

复杂结构体

结构体中定义结构体的知识就不再赘述,这里为了后续链表的学习主要缕一缕结构体的自我引用

struct student

{

       int num;

        char name[20];

        struct student *link;

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你提供的`Sort`函数实现了一个简单的冒泡排序算法来按照学生总分从高到低对链表进行排序。代码中使用了结构体成员变量之间的赋值和字符串拷贝操作。 但是你的代码存在一个问题,就是在内层循环中,你没有更新`pr`指针。这会导致每次交换后,`pr`指针都保持不变,而应该向前移动一个位置。 以下是修复这个问题的修改后的代码: ```c void Sort(STU *head) { STU *p, *now, *pr; p = head->next; now = head; pr = head; while (p != NULL) { while (p->next != NULL) { if ((p->score[0] + p->score[1] + p->score[2]) < (p->next->score[0] + p->next->score[1] + p->next->score[2])) { strcpy(pr->num, p->num); strcpy(pr->name, p->name); strcpy(pr->major, p->major); pr->classNo = p->classNo; pr->score[0] = p->score[0]; pr->score[1] = p->score[1]; pr->score[2] = p->score[2]; strcpy(p->num, p->next->num); strcpy(p->name, p->next->name); strcpy(p->major, p->next->major); p->classNo = p->next->classNo; p->score[0] = p->next->score[0]; p->score[1] = p->next->score[1]; p->score[2] = p->next->score[2]; strcpy(p->next->num, pr->num); strcpy(p->next->name, pr->name); strcpy(p->next->major, pr->major); p->next->classNo = pr->classNo; p->next->score[0] = pr->score[0]; p->next->score[1] = pr->score[1]; p->next->score[2] = pr->score[2]; } p = p->next; pr = pr->next; // 添加这一行来更新pr指针 } p = now->next; now = now->next; } } ``` 这样,`pr`指针在内层循环中会向前移动一个位置,确保下一次交换时指向正确的位置。 请记得在调用`Sort`函数时传入合适的参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RefrainC.C.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值