C语言程序设计课件 第7章 结构体和共同体_第1页
C语言程序设计课件 第7章 结构体和共同体_第2页
C语言程序设计课件 第7章 结构体和共同体_第3页
C语言程序设计课件 第7章 结构体和共同体_第4页
C语言程序设计课件 第7章 结构体和共同体_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章结构体和共同体第7章结构体和共同体7.1.1结构体类型的定义7.1.2结构体变量的初始化与引用7.1.3结构体数组7.1.4结构体指针7.1.5链表7.1结构体类型第7章结构体和共同体在C语言中,结构体(struct)是一种用户自定义的数据类型,允许将多个不同类型的数据组合在一起,形成一个有逻辑关联的整体。结构体在处理复杂数据结构(如链表、树、文件读写等)时非常有用。1.结构体类型定义的一般格式一个结构体类型可以由若干个成员组成,不同的结构体类型可根据需要由不同的成员组成。对于某个具体的结构体类型,成员的数量必须固定,这一点与数组相同,数组是由多个相同的数据类型的成员组成,但结构体中各个成员的类型可以不同,这是结构体与数组的重要区别。因此,当需要把一些相关信息组合在一起时,使用结构体这种类型就很方便。使用结构体类型时,首先要“构造”它,如同在调用函数之前要先定义函数一样。结构体类型定义的一般格式如下。struct结构体名{

数据类型成员1;

数据类型成员2;...数据类型成员n;};7.1结构体类型7.1.1结构体类型的定义第7章结构体和共同体需要说明的是:(1)struct是定义结构体类型的关键字,其后是结构体名,结构体类型名称的命名规则满足标识符命名规则。(2)结构体成员的数据类型可以是C语言允许的任何变量类型,结构体类型中的成员由大括号“{}”括起来,用来说明该结构体有哪些成员以及各成员的数据类型。(3)每个结构体成员列表中可以有一个或多个同类型的成员,如果成员多于一个,每两个成员之间用逗号分隔。(4)结构体类型定义末尾括号后的分号“;”必不可少。下面定义一个结构体类型来描述学生信息,该信息的成员由学号、姓名、班级、成绩组成,示例代码如下。structStudent{intsno;charname[50];charclassname[50];floatgrade;};7.1结构体类型7.1.1结构体类型的定义第7章结构体和共同体2.结构体变量的定义C语言中定义结构体类型变量比较灵活,既可以先定义结构体类型,再定义变量名;也可以在定义结构体类型的同时定义结构体变量。结构体类型定义之后,就可以作为一种已存在的数据类型使用。但是,它只是一个“模型”,并没有具体的数据,编译器也没有在内存中为它分配存储空间。为了在程序中可以使用结构体类型的数据,必须定义结构体变量。结构体变量的定义有如下3种方式。(1)先定义结构体类型,再定义结构体变量。语法格式如下。struct结构体名{

数据类型成员1;

数据类型成员2;...数据类型成员n;};struct结构体名变量名列表;7.1结构体类型7.1.1结构体类型的定义第7章结构体和共同体例如,定义结构体变量Stu1、Stu2,它们的数据类型都是结构体类型Student,示例代码如下。structStudent{intsno;charname[50];charclassname[50];floatgrade;};structStudentStu1,Stu2;(2)定义结构体类型的同时定义结构体变量。语法格式如下。struct结构体名{

数据类型成员1;

数据类型成员2;...数据类型成员n;}结构体变量名列表;例如,定义结构体变量Stu1、Stu2,它们的数据类型都是结构体类型Student,示例代码如下。structStudent{intsno;charname[50];charclassname[50];floatgrade;}Stu1,Stu2;7.1结构体类型7.1.1结构体类型的定义第7章结构体和共同体(3)直接定义结构体变量。采用这种方式的结构体没有类型名称,如果需要在后面的程序中定义同类型的变量就不方便使用,语法格式如下。struct{

数据类型成员1;

数据类型成员2;...数据类型成员n;}结构体变量名列表;例如,定义结构体变量Stu1、Stu2,示例代码如下。struct{intsno;charname[50];charclassname[50];floatgrade;}Stu1,Stu2;提示:结构体变量定义后,编译器变会为其分配内存,它所占用的实际字节数,就是其各个成员所占用的字节数的总和。7.1结构体类型7.1.1结构体类型的定义第7章结构体和共同体【实例7.1】计算一个结构体类型的数据在内存占用的实际字节数。程序代码如下。

#include<stdio.h>structStudent{intsno;charname[50];charclassname[50];floatgrade;}Stu1;intmain(){printf("Stu1在内存占用的实际字节数:%d\n",sizeof(Stu1));return0;}程序运行结果如下。Stu1在内存占用的实际字节数:1087.1结构体类型7.1.1结构体类型的定义第7章结构体和共同体在C语言中,结构体是一种用户自定义的数据类型,允许将多个不同类型的数据组合在一起。结构体变量的初始化和引用是使用结构体时的两个基本操作。1.结构体变量的初始化在定义普通变量时,可以同时给它赋初始值,对其进行初始化。在定义结构化变量时,也可以对其成员进行赋值操作,对其进行初始化。为结构体变量初始化的过程,就是为结构体各个成员初始化的过程。(1)在定义结构体类型和结构体变量的同时为结构体变量进行变量初始化赋值。在定义结构体类型和结构体变量的同时为结构体变量进行变量初始化赋值,示例代码如下。structStudent{intsno;charname[50];charclassname[50];floatgrade;}Stu1={202501,"张三","软件25级1班",90},Stu2={202502,"李四","软件25级1班",85};(2)在定义结构体类型后为结构体变量进行变量初始化赋值。在定义结构体类型后为结构体变量进行变量初始化赋值,示例代码如下。structStudent{intsno;charname[50];charclassname[50];floatgrade;};structStudentStu1={202501,"张三","软件25级1班",90};structStudentStu2={202502,"李四","软件25级1班",85};7.1结构体类型7.1.2结构体变量的初始化与引用第7章结构体和共同体7.1结构体类型7.1.2结构体变量的初始化与引用2.结构体变量的引用完成结构体变量的初始化赋值操作,如何引用结构体变量中的成员呢?引用结构体变量的语法格式如下。结构体变量名.成员名例如:Stu1.sno=202501;S="张三";Stu1.classname="软件25级1班";Stu1.grade=90;需要注意“.”是一个运算符,表示对结构体变量的成员进行访问,它的优先级最高,结合性从左到右。第7章结构体和共同体7.1结构体类型7.1.2结构体变量的初始化与引用【实例7.2】在定义结构体类型和结构体变量的同时为结构体变量进行初始化赋值,并进行结构体变量的引用。程序代码如下。

#include<stdio.h>structStudent{intsno;charname[50];charclassname[50];floatgrade;}Stu1={202501,"张三","软件25级1班",90},Stu2={202502,"李四","软件25级1班",85};intmain(){printf("Stu1成员信息:%d,%s,%s,%.2f\n",Stu1.sno,S,Stu1.classname,Stu1.grade);printf("Stu2成员信息:%d,%s,%s,%.2f\n",Stu2.sno,S,Stu2.classname,Stu2.grade);return0;}程序运行结果如下。Stu1成员信息:202501,张三,软件25级1班,90.00Stu2成员信息:202502,李四,软件25级1班,85.00第7章结构体和共同体7.1结构体类型7.1.2结构体变量的初始化与引用【实例7.3】在定义结构体类型后为结构体变量进行初始化赋值,并进行结构体变量的引用。程序代码如下。

#include<stdio.h>structStudent{intsno;charname[50];charclassname[50];floatgrade;};structStudentStu1={202501,"张三","软件25级1班",90};structStudentStu2={202502,"李四","软件25级1班",85};intmain(){printf("Stu1成员信息:%d,%s,%s,%.2f\n",Stu1.sno,S,Stu1.classname,Stu1.grade);printf("Stu2成员信息:%d,%s,%s,%.2f\n",Stu2.sno,S,Stu2.classname,Stu2.grade);return0;}程序运行结果如下。Stu1成员信息:202501,张三,软件25级1班,90.00Stu2成员信息:202502,李四,软件25级1班,85.00第7章结构体和共同体7.1结构体类型7.1.2结构体变量的初始化与引用【实例7.4】定义一个结构体类型,描述学生的信息,从键盘输入学生的信息,计算该学生的总成绩和平均分。程序代码如下。

#include<stdio.h>structStudent{intsno;charname[50];charclassname[50];floatgrade[3];};intmain(){floatsum=0,avg=0;inti;structStudentStu;printf("请输入学生的信息:学号、姓名、班级、三门课程的成绩\n");printf("请输入学生的学号:");scanf("%d",&Stu.sno);printf("请输入学生的姓名:");scanf("%s",S);printf("请输入学生的班级:");scanf("%s",Stu.classname);printf("请输入学生的三门课程的成绩:");scanf("%f%f%f",&Stu.grade[0],&Stu.grade[1],&Stu.grade[2]);for(i=0;i<3;i++) //遍历数组求累加和

{sum+=Stu.grade[i];}avg=sum/3;第7章结构体和共同体7.1结构体类型7.1.2结构体变量的初始化与引用printf("结构体变量Stu的信息为:\n");printf("学生的学号:%d\n",Stu.sno);printf("学生的姓名:%s\n",S);printf("学生的班级:%s\n",Stu.classname);printf("学生的课程1:%.2f\n",Stu.grade[0]);printf("学生的课程2:%.2f\n",Stu.grade[1]);printf("学生的课程3:%.2f\n",Stu.grade[2]);printf("学生的课程总成绩:%.2f\n",sum);printf("学生的课程平均分:%.2f\n",avg);return0;}第7章结构体和共同体7.1结构体类型7.1.2结构体变量的初始化与引用程序运行结果如下。请输入学生的信息:学号、姓名、班级、三门课程的成绩请输入学生的学号:202510请输入学生的姓名:李明请输入学生的班级:软件25级1班请输入学生的三门课程的成绩:809085结构体变量Stu的信息为:学生的学号:202510学生的姓名:李明学生的班级:软件25级1班学生的课程1:80.00学生的课程2:90.00学生的课程3:85.00学生的课程总成绩:255.00学生的课程平均分:85.00第7章结构体和共同体7.1结构体类型7.1.3结构体数组在C语言中,结构体数组(ArrayofStructures)是一种非常常用的数据组织方式,它允许将多个结构体变量以数组的形式存储,从而更方便地管理和操作具有相同结构的数据。1.结构体数组定义方式结构体数组是一个数组,其中每个元素都是一个结构体类型。每个结构体可以包含多个不同类型的成员。结构体数组定义方式有如下3种方式。(1)先定义结构体类型,再定义数组。示例代码如下。structStudent{charname[50];intage;floatgrade;};intmain(){structStudentstudents[3];//定义一个结构体数组,包含3个元素

return0;}第7章结构体和共同体7.1结构体类型7.1.3结构体数组(2)定义结构体类型的同时定义数组。示例代码如下。structStudent{charname[50];intage;floatgrade;}students[3];//直接定义数组(3)定义匿名结构体并创建数组。示例代码如下。struct{charname[50];intage;floatgrade;}students[3];//匿名结构体数组第7章结构体和共同体7.1结构体类型7.1.3结构体数组2.结构体数组初始化与引用对结构体数组可以初始化赋值,使用点号“.”运算符访问结构体成员,示例代码如下。【实例7.5】结构体数组初始化与引用。程序代码如下。

#include<stdio.h>structStudent{charname[50];intage;floatgrade;};intmain(){inti;structStudentstudents[3]={{"张三",20,95},{"李四",22,85},{"王五",21,92}};for(i=0;i<3;i++){printf("姓名:%s,年龄:%d,成绩:%.2f\n",students[i].name,students[i].age,students[i].grade);}return0;}程序运行结果如下。姓名:张三,年龄:20,成绩:95.00姓名:李四,年龄:22,成绩:85.00姓名:王五,年龄:21,成绩:92.00第7章结构体和共同体7.1结构体类型7.1.3结构体数组【实例7.6】结构体数组按成绩高低排序。程序代码如下。#include<stdio.h>#include<string.h>structStudent{charname[50];intage;floatgrade;};intmain(){inti,j;structStudenttemp;structStudentstudents[3]={{"张三",20,95},{"李四",22,85},{"王五",21,92}};第7章结构体和共同体7.1结构体类型7.1.3结构体数组//冒泡排序:按成绩从高到低排序

for(i=0;i<3;i++){for(j=0;j<2;j++){if(students[j].grade<students[j+1].grade){temp=students[j];students[j]=students[j+1];students[j+1]=temp;}}}printf("成绩排序:\n");for(i=0;i<3;i++){printf("姓名:%s,年龄:%d,成绩:%.2f\n",students[i].name,students[i].age,students[i].grade);}return0;}程序运行结果如下。成绩排序:姓名:张三,年龄:20,成绩:95.00姓名:王五,年龄:21,成绩:92.00姓名:李四,年龄:22,成绩:85.00第7章结构体和共同体7.1结构体类型7.1.4结构体指针在C语言中,结构体指针(StructurePointer)是一个非常重要的概念,它允许通过指针来访问和操作结构体成员,常用于提高程序效率、简化函数参数传递、实现链表等复杂数据结构。1.结构体数指针的定义结构体指针是指向结构体类型变量的指针。与普通指针类似,只不过它指向的是一个结构体。(1)先定义结构体类型,再定义指针。示例代码如下。structStudent{charname[50];intage;floatgrade;};intmain(){structStudents1;structStudent*ptr=&s1;//定义指向结构体的指针

return0;}上述代码中,定义了一个结构体指针变量p,并且将结构体变量s1的地址赋值给p,也就是说,p就是指向结构体变量s1的指针。第7章结构体和共同体7.1结构体类型7.1.4结构体指针(2)定义结构体时同时定义指针。示例代码如下。structStudent{charname[50];intage;floatgrade;}s1,*ptr=&s1;//同时定义结构体变量和指针2.结构体成员的访问方式通过结构体指针变量访问结构体变量中的成员,有如下2种方式。(1)(*结构体指针变量).成员名。示例代码如下。(*ptr).age=20;(2)结构体指针变量->成员名。示例代码如下。ptr->age=20;第7章结构体和共同体7.1结构体类型7.1.4结构体指针【实例7.7】使用结构体指针访问和修改成员。程序代码如下。#include<stdio.h>#include<string.h>structStudent{charname[50];intage;floatgrade;};第7章结构体和共同体7.1结构体类型7.1.4结构体指针intmain(){structStudents1;structStudent*ptr=&s1;strcpy(ptr->name,"张三");ptr->age=20;ptr->grade=90;printf("姓名:%s\n",ptr->name);printf("年龄:%d\n",ptr->age);printf("成绩:%.2f\n",ptr->grade);return0;}程序运行结果如下。姓名:张三年龄:20成绩:90.00第7章结构体和共同体7.1结构体类型7.1.4结构体指针【实例7.8】结构体指针作为函数参数。使用结构体指针作为函数参数可以避免复制整个结构体,提高效率,同时允许函数修改原始数据。程序代码如下。#include<stdio.h>structStudent{charname[50];intage;floatgrade;};voidupdategrade(structStudent*s,floatnewgrade){s->grade=newgrade;}intmain(){structStudents1={"李四",22,85.0};updategrade(&s1,90.0);printf("修改成绩:%.2f\n",s1.grade);return0;}程序运行结果如下。修改成绩:90.00第7章结构体和共同体7.1结构体类型7.1.4结构体指针【实例7.9】结构体指针与数组结合使用。结构体指针可以指向结构体数组中的某个元素,也可以用于遍历数组。程序代码如下。#include<stdio.h>structStudent{charname[50];intage;};intmain(){inti;structStudentstudents[3]={{"张三",20},{"李四",22},{"王五",21}};structStudent*ptr=students;//指向数组首元素

for(i=0;i<3;i++){printf("姓名:%s,年龄:%d\n",(ptr+i)->name,(ptr+i)->age);}return0;}程序运行结果如下。姓名:张三,年龄:20姓名:李四,年龄:22姓名:王五,年龄:21第7章结构体和共同体7.1结构体类型7.1.5链表在数据结构中,数组和链表是两种最基础、最常见的线性结构,它们都可以用来存储一组具有相同类型的数据,但它们在内存布局、操作效率、使用场景等方面有很大的区别。在进行程序设计时,使用数组可以给编程带来很多方便,增加程序的灵活性。但是数组在使用时也存在一些缺陷,如需要事先确定数组的大小,一旦定义了数组之后,就不能在程序中随意调整数组的大小,并且C语言不允许定义动态数组类型。在实际编程时,只能根据可能的最大需要来定义数组,这样可能会造成空间的浪费。1.链表的概念链表是动态进行内存分配的一种数据结构,它是在程序的执行过程中随时为其结点分配需要的存储空间,这些内存单元可以是连续的,也可以是不连续的。可以方便的插入新结点,也可以把不再使用的空间回收待用,从而能够有效地节约内存资源。链表是由若干个相同结构类型的元素依次串接而成的,它使用指针来表示两个元素之间的前后关系。链表由头指针、尾指针和一系列节点(Node)组成,如图7.1所示,图中h表示头指针,存储的是第一个结点的首地址,每个节点包含两个部分即数据域和指针域。数据域(Data):存储用户需要的数据(如整数、字符串、结构体等)。指针域(Pointer):存储下一个结点的地址,指向下一个节点。链表对各结点的访问需要从第一个结点开始,根据第一个结点的指针域找到第二个结点,再根据第二个结节的指针域找到第三个结点,以此类推可以访问到链表中的所有结点。链表中最后一个结点称为尾结点,其指针域为NULL,表示空地址,即不指向其他元素,表示链表的结束。第7章结构体和共同体7.1结构体类型7.1.5链表链表相比数组的优点是动态分配内存,可以灵活地插入、删除节点,适合数据量不确定或频繁变动的场景。链表和数组都可以存储大批量的数据,它们之间的区别如下。(1)内存分配。数组在内存中是连续存储的。一旦定义了数组,其大小通常是固定的(静态数组),尽管可以通过动态分配来创建可变大小的数组,但调整数组大小可能需要重新分配内存并复制原有数据。链表由一系列节点组成,每个节点包含数据部分和指向下一个节点的引用(单向链表)或前一个节点的引用(双向链表)。这些节点可以分散在内存的不同位置,通过指针链接在一起。因此,链表可以在运行时动态地添加或删除节点,而不需要一次性分配大量连续的内存空间。(2)访问元素的方式。数组支持随机访问,即可以通过索引直接访问任何元素(时间复杂度为O(1))。链表仅支持顺序访问,要访问某个特定元素,必须从头节点开始遍历直到找到目标节点(时间复杂度为O(n),n为目标节点的位置)。(3)插入和删除操作。数组插入或删除元素通常需要移动其他元素以保持数组的连续性,这可能导致较高的时间成本(最坏情况下为O(n))。链表插入和删除操作较为高效,特别是在已知要操作节点的情况下(时间复杂度为O(1)),只需要修改相关节点的指针即可。但是,如果要在一个未排序的链表中进行查找后再插入或删除,则仍需O(n)的时间来定位到正确的节点。第7章结构体和共同体7.1结构体类型7.1.5链表(4)内存使用效率。数组没有额外的开销用于存储指向下一个元素的地址信息,因此在相同数量的数据下,数组使用的总内存通常比链表少。链表除了存储实际数据外,还需要额外的空间来保存指向下一个节点(对于单向链表)或者前后节点(对于双向链表)的指针,这意味着链表会占用更多的内存。(5)缓存性能。由于数组元素在内存中是连续存储的,所以在访问数组元素时更容易利用CPU缓存,提高程序执行效率。链表元素在内存中不是连续存放的,这可能会导致较差的缓存性能,因为每次访问新节点都可能导致缓存未命中。(6)实现复杂度。数组实现相对简单,可以直接通过索引来访问和操作元素。链表实现稍微复杂一些,特别是双向链表或循环链表,涉及到正确维护节点之间的连接关系。第7章结构体和共同体7.1结构体类型7.1.5链表2.动态内存分配在C语言中,动态内存分配是指程序在运行时根据需要请求和释放内存的能力。这与静态内存分配不同,静态内存分配是在编译阶段确定的,而动态内存分配允许程序更灵活地管理内存使用情况,尤其是在处理大小不确定的数据结构(如链表)。C语言提供了标准库函数来进行动态内存分配,这些函数定义在<stdlib.h>头文件中。以下是常用的几个动态内存分配相关的函数。(1)malloc()函数。malloc()是一个非常重要的动态内存分配函数,它用于在程序运行时从堆(heap)中分配指定大小的内存块。语法格式如下。(类型说明符*)malloc(n*size);功能:在内存的动态存储中分配一块长度为size个字节的连续区域。函数的返回值为该区域的首地址。“类型说明符”表示把该区域用于何种数据类型。“类型说明符*”表示把返回值强制转换为该类型指针。(2)free()函数。free()是一个非常重要的函数,用于释放之前通过动态内存分配函数(如malloc()、calloc()分配的内存空间。语法格式如下。voidfree(void*ptr);功能:释放由ptr指向的内存块。第7章结构体和共同体7.1结构体类型7.1.5链表【实例7.10】动态分配一个整数。程序代码如下。#include<stdio.h>#include<stdlib.h>intmain(){int*p=(int*)malloc(sizeof(int));//分配一个整数的空间

if(p==NULL){printf("内存分配失败!\n");return1;}*p=100;//给分配的内存赋值

printf("值是:%d\n",*p);free(p);//释放内存

p=NULL;//避免野指针

return0;}程序运行结果如下。值是:100第7章结构体和共同体7.1结构体类型7.1.5链表【实例7.11】动态分配一个整型数组。程序代码如下。#include<stdio.h>#include<stdlib.h>intmain(){intn=5,i;int*arr=(int*)malloc(n*sizeof(int));//分配5个整数的空间

if(arr==NULL){printf("内存分配失败!\n");return1;}//给数组赋值

for(i=0;i<n;i++){arr[i]=i*10+1;}//打印数组

for(i=0;i<n;i++){printf("arr[%d]=%d\n",i,arr[i]);}free(arr);//释放数组内存

arr=NULL;return0;}第7章结构体和共同体7.1结构体类型7.1.5链表【实例7.12】动态分配字符数组(字符串)。程序代码如下。#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){char*str=(char*)malloc(50*sizeof(char));//分配50个字符的空间

if(str==NULL){printf("内存分配失败!\n");return1;}strcpy(str,"Hello,动态内存分配!");printf("字符串:%s\n",str);free(str);//释放内存

str=NULL;return0;}程序运行结果如下。字符串:Hello,动态内存分配!第7章结构体和共同体7.1结构体类型7.1.5链表【实例7.13】动态分配结构体。程序代码如下。#include<stdio.h>#include<stdlib.h>#include<string.h>structStudent{charname[20];intage;};intmain(){structStudent*s=(structStudent*)malloc(sizeof(structStudent));if(s==NULL){printf("内存分配失败!\n");return1;}strcpy(s->name,"张三");s->age=20;printf("姓名:%s,年龄:%d\n",s->name,s->age);free(s);//释放结构体内存

s=NULL;return0;}程序运行结果如下。姓名:张三,年龄:20第7章结构体和共同体7.1结构体类型7.1.5链表(3)calloc()函数。calloc()是一个非常常用的动态内存分配函数,用于在堆中分配多个相同类型的数据空间,并自动将内存初始化为0。语法格式如下。void*calloc(num,size);功能:分配num个大小为size的连续内存块,并将所有字节初始化为0(这是与malloc()的主要区别)。第7章结构体和共同体7.1结构体类型7.1.5链表【实例7.14】动态分配并初始化一个整型数组。程序代码如下。#include<stdio.h>#include<stdlib.h>intmain(){intn=5,i;int*arr=(int*)calloc(n,sizeof(int));//分配5个int大小的内存,并初始化为0if(arr==NULL){printf("内存分配失败!\n");return1;}printf("初始化后的数组内容:\n");for(i=0;i<n;i++){printf("arr[%d]=%d\n",i,arr[i]);//全为0}//修改数组内容

for(i=0;i<n;i++){arr[i]=i*10;}printf("\n修改后的数组内容:\n");for(i=0;i<n;i++){printf("arr[%d]=%d\n",i,arr[i]);}free(arr);//释放内存

arr=NULL;//避免野指针

return0;}第7章结构体和共同体7.1结构体类型7.1.5链表程序运行结果如下。初始化后的数组内容:arr[0]=0arr[1]=0arr[2]=0arr[3]=0arr[4]=0修改后的数组内容:arr[0]=0arr[1]=10arr[2]=20arr[3]=30arr[4]=40第7章结构体和共同体7.1结构体类型7.1.5链表【实例7.15】分配结构体数组并初始化。程序代码如下。#include<stdio.h>#include<stdlib.h>#include<string.h>structStudent{charname[20];intage;};intmain(){intn=3,i;structStudent*students=(structStudent*)calloc(n,sizeof(structStudent));if(students==NULL){printf("内存分配失败!\n");return1;}//结构体数组初始化为0,name是空字符串,age是0//设置数据

strcpy(students[0].name,"张三");students[0].age=20;strcpy(students[1].name,"李四");students[1].age=22;strcpy(students[2].name,"王五");students[2].age=21;第7章结构体和共同体7.1结构体类型7.1.5链表

//输出数据

for(i=0;i<n;i++){printf("学生%d:姓名=%s,年龄=%d\n",i+1,students[i].name,students[i].age);}free(students);students=NULL;return0;}程序运行结果如下。学生1:姓名=张三,年龄=20学生2:姓名=李四,年龄=22学生3:姓名=王五,年龄=21第7章结构体和共同体7.1结构体类型7.1.5链表3.链表的操作建立链表就是一个一个地开辟结点,输入各个结点的数据,并且建立起结点前后的连接关系。(1)链表的构成。链表是由若干个结点通过指针域连接起来的。链表节点通常使用结构体(struct)来定义,语法格式如下。structnode{intdata;//数据域,可以是任意类型

structnode*next;//指针域,指向下一个节点};其中,结构体成员data存储整型数据,指针类型的成员next指向自己所在的结构体类型structnode的数据,存储下一个结点的地址。(2)链表的建立。链表建立的过程就是不断在其尾部插入结点的过程。第7章结构体和共同体7.1结构体类型7.1.5链表【实例7.16】遍历链表,并输出每个结点的数据域。程序代码如下。#include<stdio.h>#include<stdlib.h>structnode{intdata;structnode*next;};intmain(){inti;structnode*h,*s,*p;h=NULL;s=(structnode*)malloc(sizeof(structnode));s->next=NULL;h=s;for(i=0;i<3;i++){ p=(structnode*)malloc(sizeof(structnode));p->data=i+1; p->next=NULL;s->next=p;s=p;}p=h->next;//指针指向第一个结点

while(p!=NULL){printf("%d\n",p->data);p=p->next;//指针指向下一个结点

} return0;}第7章结构体和共同体7.2.1共同体基本概念7.2.2共同体变量的初始化与引用7.2共同体类型第7章结构体和共同体在C语言中,共同体(union)是一种特殊的用户自定义数据类型,它允许在同一段内存空间中存储不同的数据类型,但同一时刻只能存储其中一个成员的值。1.共同体类型的定义共同体是多个变量共享同一块内存空间的一种结构。它的所有成员都从同一个地址开始存放。共同体类型的语法格式如下。union共同体名{

数据类型成员1;

数据类型成员2;...数据类型成员n;};例如:unionData{inti;floatf;charstr[20];};上述代码定义了一个名为Data的共同体类型,该类型由3个成员组成,它们共享同一块存储空间。7.2共同体类型7.2.1共同体基本概念第7章结构体和共同体2.共同体类型变量的定义定义共同体类型变量的语法格式如下。union共同体名{

数据类型成员1;

数据类型成员2;...数据类型成员n;}变量列表;例如:unionData{inti;floatf;charstr[20];}a,b,c;//在声明类型同时定义变量也可以将类型声明与变量定义分开,unionData{inti;floatf;charstr[20];};unionDataa,b,c;//用共同体类型定义变量7.2共同体类型7.2.1共同体基本概念第7章结构体和共同体即先声明一个unionData类型,再将a,b,c定义为unionData类型的变量。还可以直接定义共同体变量。例如:union{inti;floatf;charstr[20];}a,b,c;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论