数据结构一周目:绪论-基础知识

前言

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 结构体名{
     结构体所包含的变量或数组
 };
  1. 一定要带分号,不能省略。

  2. 结构体类型是由一些基本数据类型组合而成的新的数据类型,是人为定义的数据类型。

  3. " struct 结构体名"是定义的数据类型的名字,它向编译系统声明这是一个"结构体类型",有不同类型的项。

  4. " struct 结构体名",与系统提供的 int、char、float、double 等标准类型名一样,都是数据类型,具有同样的作用,都是用来定义变量的。

    1. "结构体类型"不仅要求指定该类型为"结构体类型",即 struct,而且要求指定该类型为某一"特定的"结构体类型,即"结构体名"。
    2. 结构体类型并非是固定的一种类型。而 int 型、char 型、float 型、double 型都是固定的类型。
  5. 结构体名,是结构体类型的标志,相同作用域内不可重名(全局和局部也不可以,两个局部可以),首字母必须大写,中间可加"_"。花括号内是该结构体的各个成员,它们共同组成一个整体。对各个成员都要进行类型声明。

  6. 声明结构体类型仅仅是声明了一个类型,系统并不为之分配内存,就如同系统不会为类型 int 分配内存一样。只有当使用这个类型定义了变量时,系统才会为变量分配内存。所以在声明结构体类型的时候,不可以对里面的变量进行初始化。

  7. 声明结构体类型仅仅是声明了一个类型,系统并不为之分配内存,就如同系统不会为类型 int 分配内存一样。只有当使用这个类型定义了变量时,系统才会为变量分配内存。所以在声明结构体类型的时候,不可以对里面的变量进行初始化。

  8. "结构体类型"的声明必须放在"使用结构体类型定义结构体变量"的前面。

    建议放在结构体语句需放在主程序前或头文件中。

2、定义结构体变量

有两种方法:

(1)先声明"结构体类型",再定义"结构体类型变量"

  1. 若在所有函数前进行声明,则所有函数中都可使用其定义变量。
  2. 若在某个函数中进行了声明,则只能在这个函数中使用。
  3. 不建议使用全局变量,哪用哪定义。
C 复制代码
 struct 结构体名 变量名;
 /*定义结构体类型变量stud1,stud2*/
 struct 结构体名 stud1,stud2;

(2)在声明结构体类型的同时定义结构体变量

这意味着:

  1. 如果你在所有函数前声明结构体类型,那么定义的变量就是全局变量。
  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/
相关推荐
syzyc1 小时前
[ABC267F] Exactly K Steps
数据结构·动态规划·题解
草莓熊Lotso3 小时前
【数据结构初阶】--顺序表(二)
c语言·数据结构·经验分享·其他
汤姆爱耗儿药3 小时前
数据结构——散列表
数据结构·散列表
秋说3 小时前
【PTA数据结构 | C语言版】出栈序列的合法性
c语言·数据结构·算法
hi0_64 小时前
03 数组 VS 链表
java·数据结构·c++·笔记·算法·链表
ChoSeitaku4 小时前
NO.3数据结构栈和队列|顺序栈|共享栈|链栈|顺序队|循环队列|链队|双端队列|括号匹配|中缀表达式转后缀|后缀表达式求值
数据结构·microsoft
皮卡蛋炒饭.5 小时前
数据结构—排序
数据结构·算法·排序算法
??tobenewyorker6 小时前
力扣打卡第23天 二叉搜索树中的众数
数据结构·算法·leetcode
艾莉丝努力练剑10 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
c语言·开发语言·数据结构·学习·算法
xienda10 小时前
冒泡、选择、插入排序:三大基础排序算法深度解析(C语言实现)
数据结构·算法·排序算法