最接地气的C语言结构体与链表教程----手把手教你从0开始写学生成绩管理系统(附完整代码)

本文深入浅出地介绍了C语言中的结构体和链表,通过实例演示如何使用结构体定义学生成绩管理系统的数据结构,包括结构体的声明、变量定义、赋值方法。接着讲解了链表的概念,动态链表的创建、插入节点的头插法,并提供了完整的代码示例,帮助读者掌握链表操作,为构建学生成绩管理系统奠定基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

链表是在C语言各种笔试面试中提及最频繁的数据结构了吧,链表的结构很简单,它是通过指针操作把很多个节点连起来构成一个链状结构。链表的创建、插入节点、删除节点等都只需要20行左右的代码就能实现。难度在于对指针的操作与理解,所以学习链表之前我们还需要有一定的C语言基础,至少要知道什么叫指针以及指针的作用是什么。

结构体

结构体是由若干个成员组成的。其成员可以使一个基本数据类型,也可以是一个构造类型,甚至可以是另一个结构体。在执行结构体操作之前需先声明结构体。

结构体的概念其实很简单,有一定C语言基础的同学都知道数组。如果我们定义一个整型数组text,需要先确定一个大小,也就是数组中最多存放多少个数据。int text[100];这样我们就定义了一个整型的数组,当然数组中只能存放int类型的数据。同样的我们定义一个字符数组的话,它只能存放字符类型的值。可是在某些时候我们需要将很多基本类型组织起来,比如我们记录学生信息student1,我们需要在student1当中存入学生姓名(char类型),学号(int型),成绩(float型)。我们没办法只通过一种类型来记录student1的学生信息,这时候就需要将有关变量组织起来,定义成一个结构,以此来表示这一个整体。形式如下:

struct 结构体名
{
   
   
	成员列表
}

由于结构体海纳百川,我们需要给定义的结构体明确它的格式,所以需要加一个成员列表,对结构体中的每一个成员作出定义。不要漏掉最后的“;”分号。下面我们来定义一个学生信息的结构体:

struct studentinfo
{
   
   
	char name[30];
	int number;
	float score;
};

我们在这个结构体里用字符串记录了学生姓名,并规定了字符串的长度;用整型number来记录学生的学号,比如1809;用浮点型score来记录学生的成绩,比如60.5,当然你也可以在结构体中添加其他的元素比如数学成绩,语文成绩,比如性别,比如年龄生日等等,方法是一样的。那么问题来了,我们如何应用一个结构体?
重点来了! 敲黑板!!
我们刚才声明了一个结构体 studentinfo,就是说studentinfo是一个结构体的类型,这个studentinfo类型的结构体当中有三个元素,一个是char类型的,一个是int型的,一个是float浮点型。我们现在只需要:

struct studentinfo studen1;

就定义了一个studen1结构体 变! 量! 我们在前面声明了一个studentinfo类型的结构体,是什么意思呢?C语言中给出的基本数据类型比如int 、char 等类型,不满足我们的使用,我们需要一种新的数据类型,在前面我们已经通过声明结构体的方式,声明了一个叫studentinfo的结构体,这个结构体包含了3个元素。所以我们声明一个结构体变量,和声明整型变量,字符型变量的过程是一模一样的,可以把 struct studentinfo 这个整体理解为一个类似 int的东西。现在我们知道,通过这种方式定义的结构体变量studen1里面应该也包含3个元素,分别是char类型,int型和float型。那么我们该如何给这个student1变量赋值呢?很简单,只需要通过一个点“.”就好。

strcpy(student1.name,"Tom");
student1.number = 1809;
student1.score = 80.5;

这里的对char类型赋值不能用 student1.name = “Tom” ,只能通过拷贝字符串strcpy函数,或者按位赋值的方式student1.name[0] = ‘T’ ; student1.name[1] = ‘o’ ; student1.name[2] = ‘m’ ; 来实现。

#include <stdio.h>
#include <stdlib.h>  //函数malloc的头文件
#include <string.h>  //函数strcpy的头文件
struct studentinfo
{
   
   
	char name[30];
	int number;
	float score;
};
struct studentinfo student1;
int main()
{
   
   
	strcpy(student1.name,"Tom");
	student1.number = 1809;
	student1.score = 80.5;
	printf("学号是:%d\n",student1.number);
	printf("成绩是:%d\n",student1.score);
	printf("姓名是:%s\n",student1.name);
	return 0;
}

到这里我们应该对结构体有一个更清晰的认识,不妨问自己几个问题。

  1. 什么是结构体?
  2. 如何声明一个结构体?
  3. 什么叫结构体变量?
  4. 如何定义一个结构体变量?
  5. 如何给结构体变量赋值?

解决完这5个问题,就到了下一步,什么是链表。

链表

链表是一种存储方式,它在系统中的存储位置是不连续的,而是通过指针,把一个个数据块串起来,像一条铁链,一环扣一环。

在这里插入图片描述
我们可以通过在结构体当中,增加指针的信息。

struct Node{
   
   
	int data;
	struct Node* next;
};

这里我们重新定义了一个结构体类型Node,这个结构体类型包含一个数据,和一个该结构体的指针叫next。我们先通过代码来验证一下,定义三个结构体变量Node1,Node2,Node3,我们将Node1的指针指向Node2的地址,再把Node2的指针指向Node3的地址,因为Node3是链表中的最后一个元素所以我们把Node3的指针置空,就完成了简单的静态链表。

#include <stdio.h>
#include <stdlib.h> 
struct Node{
   
   
	int data;
	struct Node* next;
};
int main()
{
   
   
	struct Node Node1 = {
   
   1,NULL};
	struct Node Node2 = {
   
   2,NULL};
	struct Node Node3 = {
   
   3,NULL};
	Node1.next = &Node2;
	Node2.next = &Node3;
	Node3.next = NULL;
}

这里需要注意的是NULL表示指针为空,也就是不指向任何一个地址。NULL仅仅代表空值,也就是指向一个不被使用的地址,因为在大多数系统中会将0作为不被使用的地址,所以就有了类似这样的定义#define NULL 0 但是并非在所有系统当中都将0作为不被使用的地址,所以一定要区分NULL和0的区别,千万不要将NULL等价位0。
静态链表的原理虽然很简单,但是我们在实际中几乎不会用到静态链表,因为如果对于处理数据来说,我们把每个数据都通过一个结构体存起来,然后手动的去把一个个数据连在一起,这样就没有任何意义了,提现不了链表的高效。而假设我们现在可以动态的管理一个链表,这个链表可以自己把输入的数据连起来,这样就可以实现动态存储,方便省事。

动态链表

在学习动态链表之前,还需要了解什么了解什么叫结构体指针。回顾一下你还记得什么叫结构体变量吗?我们通过int 可以定义一个变量int a;也可以定义一个指针 int* p;同样我们通过结构体也可以定义结构体变量和结构体指针。在动态链表当中,我们通过结构体指针来实现链表的插入,删除与打印操作。我们先来看如何创建一个链表

#include <stdio.h>
#include <stdlib.h> 
struct Node{
   
   
	int data;
	struct Node* next;    //定义struct Node结构体的内容
};
struct Node
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值