结构体与链表预习

一、结构体的声明;

我们把又一定联系的变量放在一起定义,这就是结构体,如下

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;
}

这就是静态链表的使用方法。 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值