前言
Hi, 我是Rike,欢迎来到我的空间~ 本篇为大家带来的是,C语言版数据结构笔记开篇绪论,主要介绍了C语言的基础知识,为后续做编码准备。
一周目还是大学时候学习总结的,跟工作后的编码思路、方式还有很大的不同🤣。 同时我也再尽早开启二周目,跟leetcode题目、实际业务方案等等进行结合🧐。 希望能合大家的胃口,也希望大家能够多多建议~
一、常用代码
C
/*定义最大值*/
define maxsize 100 //定义一个整型常量
/*自定义结构体*/
typedef struct
{
..................
}LNode,*LinkList; //将结构体类型struct LNode重命名为LNode;
//将struct LNode *重命名为LinkList
/*定义结构体类型变量*/
LNode &L; //对MadeS定义别名(引用型变量)
Lnode *L; //指向这一结构体的指针
Lnode L; //定义结构体变量
/*结点空间的动态申请*/
LNode *A =(LNode*)malloc(sizeof(LNode));
/*结点间的连接操作*/
A->next=B; //指向下一个结点
B->prior=A; //指向上一个结点
二、变量、结构体的声明和定义
(一)变量声明及定义
-
变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义,系统会为其分配内存。
-
变量声明:用于向程序表明变量的类型和名字,系统不会为其分配内存。
-
若在主函数前对函数进行声明,则所有函数都可直接用它来定义变量。
-
若在主函数后对函数声明,则需要在主函数前对其先声明。
例: 函数声明:int sum( int m , int n ) ;
-
-
声明不是定义,但定义一定是声明。
(二)结构体类型 - struct 语句
结构体是将不同类型的数据按照一定的功能需求进行整体封装,封装的数据类型与大小均可以由用户指定。
1、声明结构体类型
声明一个结构体类型的一般形式为:
C
struct 结构体名{
结构体所包含的变量或数组
};
-
一定要带分号,不能省略。
-
结构体类型是由一些基本数据类型组合而成的新的数据类型,是人为定义的数据类型。
-
" struct 结构体名"是定义的数据类型的名字,它向编译系统声明这是一个"结构体类型",有不同类型的项。
-
" struct 结构体名",与系统提供的 int、char、float、double 等标准类型名一样,都是数据类型,具有同样的作用,都是用来定义变量的。
- "结构体类型"不仅要求指定该类型为"结构体类型",即 struct,而且要求指定该类型为某一"特定的"结构体类型,即"结构体名"。
- 结构体类型并非是固定的一种类型。而 int 型、char 型、float 型、double 型都是固定的类型。
-
结构体名,是结构体类型的标志,相同作用域内不可重名(全局和局部也不可以,两个局部可以),首字母必须大写,中间可加"_"。花括号内是该结构体的各个成员,它们共同组成一个整体。对各个成员都要进行类型声明。
-
声明结构体类型仅仅是声明了一个类型,系统并不为之分配内存,就如同系统不会为类型 int 分配内存一样。只有当使用这个类型定义了变量时,系统才会为变量分配内存。所以在声明结构体类型的时候,不可以对里面的变量进行初始化。
-
声明结构体类型仅仅是声明了一个类型,系统并不为之分配内存,就如同系统不会为类型 int 分配内存一样。只有当使用这个类型定义了变量时,系统才会为变量分配内存。所以在声明结构体类型的时候,不可以对里面的变量进行初始化。
-
"结构体类型"的声明必须放在"使用结构体类型定义结构体变量"的前面。
建议放在结构体语句需放在主程序前或头文件中。
2、定义结构体变量
有两种方法:
(1)先声明"结构体类型",再定义"结构体类型变量"
- 若在所有函数前进行声明,则所有函数中都可使用其定义变量。
- 若在某个函数中进行了声明,则只能在这个函数中使用。
- 不建议使用全局变量,哪用哪定义。
C
struct 结构体名 变量名;
/*定义结构体类型变量stud1,stud2*/
struct 结构体名 stud1,stud2;
(2)在声明结构体类型的同时定义结构体变量
这意味着:
- 如果你在所有函数前声明结构体类型,那么定义的变量就是全局变量。
- 而如果要定义局部变量,那么就只能在某个函数中对结构体类型进行声明,从而导致只能在这个函数中使用这个类型。
C
/*定义结构体类型变量stud1,stud2*/
struct 结构体名{
结构体所包含的变量或数组
}stu1,stu2;
3、几种常用形式的声明及定义
(1)第一种:先声明,再定义
先声明结构体类型,然后用这个类型创建了一个 x 变量。
C
struct Example
{
int a;char b;float c;
};
struct Example x;
(2)第二种:先"声明并定义",再定义
在声明结构体类型的同时创建了一个 y 变量,同时还可用结构体类型再创建其它变量。
C
struct Example
{
int a;char b;float c;
}y;
struct Example exp;
(3)第三种:未声明
这个声明创建了一个名叫 exp 的变量,之后再不能利用该结构体类型创建变量。
C
struct
{
int a;char b;float c;
}exp;
4、结构体变量的引用
(1)不能将一个结构体变量作为一个整体进行引用,只能分别单独引用它内部的成员,引用方式为:
C
结构体变量名.成员名;
(2)如果结构体类型中的成员也是一个结构体类型,则要用若干个".",一级一级地找到最低一级的成员。因为只能对最低级的成员进行操作。
C
//例:
struct AGE
{
int year;
int month;
int day;
};
struct STUDENT
{
char name[20];
int num;
struct AGE birthday; //就有点类似于C++中的封装了
float score;
};
int main{
struct STUDENT student1 = {"小明", 1207041, {1989, 3, 29}, 100};
printf("name : %s\n", student1.name);
printf("birthday : %d-%d-%d\n", student1.birthday.year, student1.birthday.month, student1.birthday.day);
printf("num : %d\n", student1.num);
printf("score : %.1f\n", student1.score);
return 0;
}
(3)可以引用"结构体变量成员"的地址,也可以引用"结构体变量"的地址。
(4)结构体变量的引用方式决定了:
-
"结构体变量名"可以与"结构体成员名"同名。
-
"结构体变量名"可以与"结构体名"同名。
-
"两个结构体类型定义的结构体变量中的成员可以同名"。
若结构体 A 用于存放学生的信息,里面有成员"char name[20];",那么如果又定义了一个结构体类型用于存放老师的信息,那么里面也可以有成员"char name[20];"
5、结构体变量的初始化
(1)定义变量时初始化
- 在定义结构体变量时对其进行初始化,只要用大括号"{}"括起来,然后按结构体类型声明时各项的顺序进行初始化即可。
- 各项之间用逗号分隔。如果结构体类型中的成员也是一个结构体类型,则要使用若干个"{}"一级一级地找到成员,然后对其进行初始化。
C
struct AGE
{
int year;
int month;
int day;
};
struct STUDENT
{
char name[20];
int num;
struct AGE birthday;
float score;
};
int main(void)
{
struct STUDENT student1 = {"小明", 1207041, {1989, 3, 29}, 100};
return 0;
}
(2)定义后再初始化
C
# include <stdio.h>
# include <string.h>
struct AGE
{
int year;
int month;
int day;
};
struct STUDENT
{
char name[20]; //姓名
int num; //学号
struct AGE birthday; /*用struct AGE结构体类型定义结构体变量birthday, 即生日*/
float score; //分数
};
int main(void)
{
struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/
strcpy(student1.name, "小明"); //不能写成&student1
student1.num = 1207041;
student1.birthday.year = 1989;
student1.birthday.month = 3;
student1.birthday.day = 29;
student1.score = 100;
printf("name : %s\n", student1.name); //不能写成&student1
printf("num : %d\n", student1.num);
printf("birthday : %d-%d-%d\n", student1.birthday.year, student1.birthday.month, student1.birthday.day);
printf("score : %.1f\n", student1.score);
return 0;
}
(3)从键盘输入对结构体进行初始化
C
# include <stdio.h>
struct AGE
{
int year;
int month;
int day;
};
struct STUDENT
{
char name[20];
int num;
struct AGE birthday;
float score;
}; //分号不能省
int main(void)
{
struct STUDENT student1; /*用struct STUDENT结构体类型定义结构体变量student1*/
printf("请输入姓名:");
scanf("%s", student1.name); //不能写成&student1
printf("请输入学号:");
scanf("%d", &student1.num);
printf("请输入生日:");
scanf("%d", &student1.birthday.year);
scanf("%d", &student1.birthday.month);
scanf("%d", &student1.birthday.day);
printf("请输入成绩:");
scanf("%f", &student1.score);
printf("name: %s\n", student1.name); //不能写成&student1
printf("num: %d\n", student1.num);
printf("birthday: %d-%d-%d\n", student1.birthday.year, student1.birthday.month, student1.birthday.day);
printf("score: %.1f\n", student1.score);
return 0;
}
(三)typedef 语句
使用关键字 typedef 可以为类型起一个新的别名。
1、一般用法
C
typedef oldName newName;
//例:
typedef int INT;
INT a, b;
2、结构体类型定义别名
C
typedef struct 结构体名{
结构体所包含的变量或数组
}别名;
//例:
typedef struct stu{
char name[20];
int age;
char sex;
} STU;
//STU 是 struct stu 的别名,可以用 STU 定义结构体变量:
STU body1,body2;//等价于struct stu body1, body2;
数组可以作为函数的参数使用,进行数据传送。
数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。
(一)数组元素作函数实参
数组元素就是下标变量,它与普通变量并无区别。 因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。
(二)数组名作为函数参数
用数组名作函数参数与用数组元素作实参有几点不同。
但可以简记为:
- 将数组作为参数传入函数,函数就是对传入的数组本身进行操作。
- 即如果函数体内涉及改变数组数据的操作,则传入的数组中的数据就会依照丽数的操作来改变。因此,对于数组来说,没有引用型和非引用型之分,可以理解为只要数组作为参数,就都是引用型的。
说明:其实上一段话说得一点儿都不准确,工作中如果这么理解多半会出事,但是用来应对考研数据结构足够了,且容易理解。
参考资料
个人学习记录,若有侵权,请留言联系
- 2022 天勤计算机考研高分笔记-数据结构
- 2022 王道计算机考研复习指导-数据结构
- 解学武数据结构与算法教程(C 语言版):data.biancheng.net/
- C 语言中文网:c.biancheng.net/