一、结构体的声明;
我们把又一定联系的变量放在一起定义,这就是结构体,如下
struct student
{
int num;
char name[20];
float score;
}stu;
struct student a,b,c;
scanf("%d%s%f",&stu.num,stu.name,&stu.score);
以上声明中,struct为structre的简写,是声明结构体类型时必不可少的,后面的student是一个结构体名,struct student合起来是一个结构体类型,大括号内为内定义,定义的变量其实与普通变量并无区别,可单独进行使用,而想使用这些变量,就必须用到大括号外的stu,stu是结构体变量,我们可以用“stu.score”这样的语句来引用其中的变量。
在这里,结构体名student与结构体变量stu可以自己取名字。stu也未必非要加在大括号后,也可另外声明结构体变量如下明定义了3个为a,b,c,与stu同样都仅仅是一个指向结构体类型的变量而已。
当然,我们还可以定义一个结构体数组,即可以把“stu”改为“stu[20]”,这便是一个结构体数组,其中又20个元素,意思不难理解,就是相当于你同时定义了20个同样的结构体数组而已。
那么好了,我们是不是也可以来定义一个结构体类型的指针呢?当然。在上面的声明之下,我们还可以定义一个指针如下:
struct student *p;
p = &stu;
这样,我们就把结构体变量stu的首地址赋给了指针p,这个p一定要是指向结构体变量类型的指针才可以。我们便可以按如下方式来给结构体中的各变量进行赋值了:
scanf("%d%s%d",&(*p).num,(*p).name,&(*p).score);
上述赋值方式每个“.”前面的()是不能少的,因为在所有的运算符中,“.”的优先级是最高的,但我们这里必须先运算*p,故括号不能丢,当然,我们其实还有一种更为常见的赋值方式如下:
scanf("%d%s%d",p->num,p->name,p->score);
这样就能避免丢括号的问题了。
二、静态链表
链表其实是一种重要的数据结构。它是动态进行分配储存的一种结构。
链表有一个头指针变量,我们一般用head来表示,而后就是结点,每一个结点都有两部分组成,一部分存放实际数据,即存放用户所需要的数据,另一个部分则存放下一个结点实际数据的地址,一般我们把链表建立在结构体变量中,如下:
struct student
{
int num;
float score;
struct student *next;
}a[3];
在结构体中定义了一个指向该结构体类型的指针,那我们该如何使用呢?
首先,在使用前,我们得先定义一个该结构体类型的指针指向此结构体的首地址如“struct student *p = a;”,其次,我们还得把结构体变量的尾地址“a[2].next”指向空地址“NULL”,这样我们才能结束它。如下代码段:
#include <stdio.h>
struct student
{
int num;
float score;
struct student *next;
};
int main()
{
int i;
struct student a[3], *head, *p;
printf("Please input 3 student num,score:\n");
for(i = 0; i < 3; i++)
{
scanf("%d%f", &a[i].num, &a[i].score);
}
head = &a[0];
a[0].next = &a[1];
a[1].next = &a[2];
a[2].next = NULL;
p = head;
printf("学生信息为:\n");
while(p != NULL)
{
printf("%d %.2f\n", p -> num, p -> score);
p = p -> next;
}
return 0;
}
这就是静态链表的使用方法。