一、学习笔记
1.结构体的声明在主函数内还是外?为什么有的在内有的在外?
在函数内部声明的结构类型只能在函数内部使用 在函数外部声明的结构类型可以被多个函数使用。
2.同类的结构体变量可以相互赋值
3.
4.让p指向下一个结点:因为这个结点的成员next就是指向下一个结点的,所以只需要让这个结点的next的值赋给p就可以了:也就是p=p->next.
二、课件中的测试
1.
#include <stdio.h>
int main()
{
struct Student
{
int num;
char name[20];
float score;
};
struct Student stu[5] = {{1, "Zhang", 78}, {2, "Wang", 98.5}, {3, "Li", 86}, {4, "Ling", 73.5}, {5, "Sun", 100}};
struct Student temp;
const int n = 5;
int i, j, k;
printf("The order is:\n");
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = i + 1; j < n; j++)
if (stu[j].score > stu[k].score)
k = j; //排序
temp = stu[k];
stu[k] = stu[i];
stu[i] = temp; //同类的结构体变量可互相赋值
}
for (i = 0; i < n; i++)
printf("%6d%8s%6.2f\n", stu[i].num, stu[i].name, stu[i].score);
printf("\n");
}
2.
#include <stdio.h>
#define N 3
struct Student
{
int num;
char name[20];
float score[3];
float aver;
};
void input(struct Student a[]) //用一个数组名来接收指针,这时a[i]就是stu[i]
{
int i;
for (i = 0; i < N; i++)
scanf("%d%s%f%f%f", &a[i].num, a[i].name, &a[i].score[0], &a[i].score[1], &a[i].score[2]); //a[i].name已经是数组名了,是地址了,不需要再在前面加&
for (i = 0; i < N; i++)
{
a[i].aver = (a[i].score[0] + a[i].score[1] + a[i].score[2]) / 3.0;
} //调用input函数来输入,并且计算aver(就是为了计算aver才传递指针,否则形参值改变不会影响实参值)
}
void max(struct Student a[])
{
struct Student temp;
int i, j;
for (i = 0; i < N - 1; i++)
for (j = 0; j < N - 1 - i; j++)
if (a[i].aver < a[i + 1].aver)
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
printf("%d %s %f %f %f\n", a->num, a->name, a->score[0], a->score[1], a->score[2], a->aver);
}
int main()
{
struct Student stu[N], *p = stu;
input(p);
max(p);
return 0;
}
3. 很重要!!!!!
#include <stdio.h>
int main() //建立一个以三个学生数据为结点的静态链表
{
struct Student
{
int num;
float score;
struct Student *next; //指针变量,指向一个结构体变量
};
struct Student a, b, c, *head, *p;
a.num = 99101;
a.score = 89.5;
b.num = 99103;
b.score = 90;
c.num = 99107;
c.score = 85;
head = &a;
a.next = &b;
b.next = &c;
c.next = NULL; //也就是c是最后一个结点
//下面开始输出链表,因为现在这个静态链表已经建立好了
p = head; //让指针p和头指针head指向相同
for (; p != NULL;) //满足条件p!=NULL才进行循环,否则不循环。也就是到达最后一个结点就退出循环了
{
printf("%d %f\n", p->num, p->score); //打印p指向的那个结点的真实数据
p = p->next; //将p所指向的变量的成员next的值(也就是下一个结点的地址)赋给p,也就是让p指向下一个结点
}
return 0;
}