数据结构:绪论 - 基础知识 567次阅读 数据结构 2022-07-18 目录 [TOC] ![](https://picture-host-1304031833.cos.ap-beijing.myqcloud.com/SiYuan/SplitLine/SplitLine-01.gif) # 一、常用代码 ```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; //指向上一个结点 ``` ![](https://picture-host-1304031833.cos.ap-beijing.myqcloud.com/SiYuan/SplitLine/SplitLine-01.gif) # 二、变量、结构体的声明和定义 ## (一)变量声明及定义 * 变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义,系统会为其分配内存。 * 变量声明:用于向程序表明变量的类型和名字,系统不会为其分配内存。 * 若在主函数前对函数进行声明,则所有函数都可直接用它来定义变量。 * 若在主函数后对函数声明,则需要在主函数前对其先声明。 > 例: 函数声明: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 # include 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 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; ``` ![](https://picture-host-1304031833.cos.ap-beijing.myqcloud.com/SiYuan/SplitLine/SplitLine-01.gif) # 三、数组作为函数参数 数组可以作为函数的参数使用,进行数据传送。 数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。 ## (一)数组元素作函数实参 数组元素就是下标变量,它与普通变量并无区别。 因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。 ## (二)数组名作为函数参数 用数组名作函数参数与用数组元素作实参有几点不同。 但可以简记为: * 将数组作为参数传入函数,函数就是对传入的数组本身进行操作。 * 即如果函数体内涉及改变数组数据的操作,则传入的数组中的数据就会依照丽数的操作来改变。因此,对于数组来说,没有引用型和非引用型之分,可以理解为只要数组作为参数,就都是引用型的。 > 说明:其实上一段话说得一点儿都不准确,工作中如果这么理解多半会出事,但是用来应对考研数据结构足够了,且容易理解。 ![](https://picture-host-1304031833.cos.ap-beijing.myqcloud.com/SiYuan/SplitLine/SplitLine-01.gif) # 参考资料 > **版权声明**:个人学习记录,本博客所有文章均采用 CC-BY-NC-SA 许可协议。转载请注明出处!若有侵权,请留言联系! > > * 2022 天勤计算机考研高分笔记-数据结构 > * 2022 王道计算机考研复习指导-数据结构 > * 解学武数据结构与算法教程(C 语言版):http://data.biancheng.net/ > * C 语言中文网:http://c.biancheng.net/ 如果您觉得文章对您有帮助,请点击文章正下方的小**红心**一下。您的鼓励是博主的最大动力! 2 最后一次更新于2022-10-23 数据结构
0 条评论