C语言程序设计核心详解 结构体与链表概要详解
1.结构体类型代码语言cAI代码解释struct 结构体类型名 { 成员1的定义; 成员2的定义; ......... 成员n的定义; }结构体名(可以省略);1.1 构造与定义结构体类型构造结构体一共有三种方法方法一代码语言cAI代码解释struct student { int sn; int age; char sex; int s[3]; }; int main() { struct student a; struct student b; struct student c[10]; }方法二代码语言cAI代码解释struct student { int sn; int age; char sex; int s[3]; }a,b,c[10]; int main() { }方法三(不建议使用省略类型名的方法代码语言cAI代码解释struct { int sn; int age; char sex; int s[3]; }a,b,c[10]; int main() { }使用这种方法结构体只能一次性使用后续没法添加。补充:结构体变量在内存中占用字节数为各成员占用字节数总和。代码语言cAI代码解释struct aa { int num; // 2 char name[10]; //10 }; struct bb { int a; //2 float b; //4 struct aa c; //12 }; sizeof(a); //181.2 使用结构体变量结构体数组结构体指针变量1.在定义结构体变量的同时可以将各成员的初值按顺序放在一对花括号中来进行对结构体变量的初始化。若初值个数多于成员个数则出错若初值个数少于成员个数则多余成员自动赋0.代码语言cAI代码解释struct aa { int a; char b[10]; float c; } a1{30,china,40.5},a2{60,kunming},a3;2.结构体变量不能整体引用只能引用它的成员。(同数组相似)引用结构体成员的方式结构体变量名.成员名其中.为成员运算符如:printf(a1a1%d,%s,%f,a1); //非法printf(a1a1%d,%s,%f,a1.a,a1.b,a2.c);a1.a80;a1.bxinjiang;a1.c60.5;1.3 指向结构体数据类型的指针1.3.1 指向结构体变量的指针可以用指针变量指向结构变量也可以用指针变量指向结构体变量中的成员。要注意指针变量的类型必须与它所指向变量的类型相同。当指针变量指向结构体变量时对指针变量1则跳过整个结构体而不是跳过一个成员。一般来说都是定义指向结构体的指针用指向整个的指针控制内部的的成员也好数组也好代码语言cAI代码解释struct struct { int num; char name[20]; chat sex; float score; }; struct student aa{1001,zhang,M,80.5}; struct student *paa; char *qaa.name; int *raa.num;当指针变量p指向结构体变量aa时引用aa中的成员的方式有三种aa.num(*p).nump-num1.3.2 指向结构体数组的指针代码语言cAI代码解释struct student { int num; char name[20]; char sex; float score; }; ,struct student stu[3]{{1001,zhang,M,60.5},{1002,peng,M,100},{1003,wang,W,90.9}}; struct student *pstu;注:可以用结构体变量的成员作为实参它与普通变量作为实参的用法是一样的。用结构体变量作为实参时要求形参必须是同一结构体的变量传递后形参与实参各对应成员值是一样的。也可以用结构体类型的地址(指针变量或数组)作为实参要求形参必须是同一结构体类型的指针变量或数组。只是地址传递则可以通过形参来改变实参的值。2.链表概要数据集有两个大方向进行存储一个是定义数组连续存储一个是定义链表结点定义-不必连续2.1 链表定义链表是一种数据结构它采用动态分配存储单元方式。它能够有效地节省存储空间(同数组比较)链表都有一个头指针变量它用于指向链表中的第一个元素(地址)。链表中的元素都是结点链表中的所有结点都是结构体类型且同一链表中的结点都是同一结构体类型。每个结点都应包括数据部分和下个结点地址两部分内容。链表的最后一个元素(结点)称为链尾。指向NULL链表的访问都是通过指针变量从头结点开始。由于链表中的结点是一个结构体类型并且结点中有一个成员用于指向下一个结点。所以定义作为结点的格式代码语言cAI代码解释struct 结构体名 { 定义数据成员: struct 结构体名 *指针变量名; }; 例如: struct student { int num; float score; struct student *next; }; struct student a,*p;2.2 动态分配函数定义在头文件stdlib.h中1.malloc()函数格式:malloc(size)作用是在内存的动态存储区中分配一个长度为size个字节的连续空间函数返回值为一个指向分配域起始地址的指针若分配失败则返回NULL.例如:开辟一个用于存在struct student 数据的内存空间并让p指向该空间代码语言cAI代码解释struct student *p(struct student *) mallocsizeofstruct student)); (struct student *) 强制类型转换因为默认是void类型要强制类型转换 sizeofstruct student) 分配结构体那么大的内存空间供以使用2.free()函数格式:free(p);作用是释放用malloc()分配的内存。2.3 链表操作(1)建立动态链表(假定若输入的成员为0则表示结束)代码语言cAI代码解释#includestdlib.h struct node { int data; struct node *next; }; struct node *head,*p,*q; p(struct node *)malloc(sizeof(struct node)); p-data10;(2)链表的使用p-data;p-next;(3)链表结点的删除核心:先连后断意味着先与后一个结点连接再让原来的连接断开(4)链表的插入3. 共用体类型共用体中所有成员共用同一段内存(所有成员的起始地址都是一样的)格式:union 共用体名{成员列表;};注:(1)成员列表为定义该共用体的成员成员定义的方式与普通变量的方式一样。(2)成员列表必须用一对花括号括起(3)共用体名可以省略3.1 共用体变量的定义(1)先定义类型再定义变量(2)定义类型的同时定义变量(3)直接定义变量代码语言cAI代码解释union data { int i; char ch[10]; float s; }a1;注意:由于共用体类型变量的所有成员都共用同一段内存所以共用体类型变量所占的字节数等于该共用体类型中占用字节数最多的成员所占的字节数。 sizeof(a1) // 103.2 共用体变量的引用注:不能整体引用共用体变量只能引用其成员。同类型成员共享值在内存中整型数据中的二进制低8位占用前面一个字节高8位占用后面一个字节。3.3 typedef用typedef定义新类型名在编程中可以用typedef来定义新的类型名来代替已有的类型名格式:typedef 已有类型名 新的类型名如:typedef int INTEGER;以后在定义变量时int和INTEGER是等价的INTEGER a10,b; int a10,b;(1) typedef可用于定义各种类型名,但 不能定义变量。即只要见到typedef则该语句最后的标识符必定是一个类型名而不是变量名。(2)typedef只能对已经存在的类型新增一个别名而不是创造新类型。即在typedef后必须是一个已有的类型。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2601704.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!