C语言结构体与链表(总结)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C程序设计快速进阶大学教程2020/4/212第12章自定义数据类型本章要点结构体链表C程序设计快速进阶大学教程2020/4/21312自定义数据类型知识点结构体链表枚举类型C程序设计快速进阶大学教程2020/4/21412自定义数据类型自定义数据类型包括:数组(前面讨论过)结构体共用体(本书不讨论)枚举C程序设计快速进阶大学教程2020/4/21512.1结构体结构体是一种构造类型,它是由若干成员组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。学生:由姓名、身高、成绩等组成,为一个有机整体C程序设计快速进阶大学教程2020/4/21612.1.1结构体声明声明结构体类型的一般形式为:struct结构名{成员表列};structStudent{intiNum;charcArrName[20];charcSex;floatfScore;};结构体声明并不分配空间,结构体类型声明是在说明一种数据类型,并非变量定义。C程序设计快速进阶大学教程2020/4/21712.1.2结构体变量定义1.先声明结构体,再定义结构体变量。structstudent{intiNum;charcArrName[20];charcSex;floatfScore;};structstudentstrStu1,strStu2;定义结构体变量有以下三种方法:C程序设计快速进阶大学教程2020/4/21812.1.2结构体变量定义2.在声明结构体类型的同时定义结构体变量。structstudent{intiNum;charcArrName[20];charcSex;floatfScore;}strStu1,strStu2;定义结构体变量有以下三种方法:C程序设计快速进阶大学教程2020/4/21912.1.2结构体变量定义3.直接定义结构体变量。struct{intiNum;charcArrName[20];charcSex;floatfScore;}strStu1,strStu2;定义结构体变量有以下三种方法:第三种方法与第二种方法的区别在于第三种方法中省去了结构体名,而直接给出结构体变量。这种类型结构体只能用此一次,以后无法再定义该结构体类型变量,即使再声明成员完全相同的结构体类型,也和此次定义的结构体类型属于不同的结构体类型。C程序设计快速进阶大学教程2020/4/211012.1.2结构体变量定义结构体变量在内存空间的存储是连续的,结构体类型占用空间的大小sizeof(structstudent)的值各成员大小之和29字节(iNum:4字节、cArrName[20]:20字节、cSex:1字节、fScore:4字节),各编译系统为内存管理方便可能分配的空间大一些。C程序设计快速进阶大学教程2020/4/211112.1.3结构体变量引用1.结构变量初始化和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。structstudent{intiNum;charcArrName[20];charcSex;floatfScore;}strStu2,strStu1={102,Zhangping,'M',78.5};strStu1、strStu2均被定义为结构变量,并对strStu1作了初始化赋值。C程序设计快速进阶大学教程2020/4/211212.1.3结构体变量引用2.结构体成员引用引用结构变量成员的一般形式是:结构体变量名.成员名.为成员运算符,优先级最高,结合性为自左向右。例如:strStu1.iNum第一个学生的学号strStu2.cSex第二个学生的性别如果成员本身又是一个结构体则必须逐级找到最低级的成员才能使用。例如:strStu1.strBirthday.iMonth第一个学生出生的月份成员可以在程序中单独使用,与普通变量完全相同。C程序设计快速进阶大学教程2020/4/211312.1.3结构体变量引用3.结构体变量赋值结构变量之间可以像普通变量一样相互赋值。strStu2=strStu1;会把strStu1内存空间的全部内容复制strStu2对应的空间中。不能对结构体变量整体进行输入、输出、运算。scanf(,&strStu);strStu2+strStu1;strStu2strStu1;C程序设计快速进阶大学教程2020/4/211412.1.4结构体数组数组的元素也可以是结构体类型的structStudent{intiNum;char*pcName;charcSex;floatfScore;}strStuArr[5];C程序设计快速进阶大学教程2020/4/211512.1.4结构体数组例12.2对学生表按照成绩从小到大排序#includestdio.h#includestring.h/*声明结构体类型*/structstudent{intiNum;char*pcName;charcSex;floatfScore;};intmain(){/*定义结构体数组*/structstudentstrStuArr[5]={{101,Liping,'M',45},{102,Zhangping,'M',62.5},{103,Hefang,'F',92.5},{104,Chengling,'M',87},{105,Wangming,'F',58}};structstudentstrStuTemp;inti1,i2,iFlag;for(i1=0;i14;i1++){iFlag=i1;for(i2=i1+1;i25;i2++)if(strStuArr[i2].fScorestrStuArr[iFlag].fScore)iFlag=i2;if(iFlag!=i1){strStuTemp=strStuArr[i1];strStuArr[i1]=strStuArr[iFlag];strStuArr[iFlag]=strStuTemp;}}for(i1=0;i15;i1++){printf(Num=%dName=%s,strStuArr[i1].iNum,strStuArr[i1].pcName);printf(Sex=%cScore=%f\n,strStuArr[i1].cSex,strStuArr[i1].fScore);}return0;}C程序设计快速进阶大学教程2020/4/211612.1.5结构体与指针一个指针变量也可以指向结构体变量,一个指针变量当用来指向一个结构体变量时,称之为结构体指针变量。结构体指针变量中的值是所指向的结构体变量的首地址。通过结构体指针即可间接访问该结构变量。结构体指针定义说明的一般形式为:struct结构名*结构指针变量名;structstudent*pStrStudent;pStrStudent=&strStu1;C程序设计快速进阶大学教程2020/4/211712.1.5结构体与指针通过结构体指针变量,就能间接地访问结构体变量的各个成员。其访问的一般形式为:(*结构指针变量).成员名或为:结构指针变量-成员名-为指向运算符,优先级最高,结合性为自左向右。两种写法完全一样。(*pStrStudent).iNum或者:pStrStudent-iNum应该注意(*pStrStudent)两侧的括号不可少,因为成员符.的优先级高于*。C程序设计快速进阶大学教程2020/4/211812.1.5结构体与指针例12.3通过指针间接访问结构体成员#includestdio.hstructstudent{intiNum;char*pcName;charcSex;floatfScore;}strStu1={102,Zhangping,'M',78.5},*pStrStudent;intmain(){pStrStudent=&strStu1;/*通过变量名访问*/printf(Number=%d\nName=%s\n,strStu1.iNum,strStu1.pcName);printf(Sex=%c\nScore=%f\n\n,strStu1.cSex,strStu1.fScore);/*通过指针和.运算符访问*/printf(Number=%d\nName=%s\n,(*pStrStudent).iNum,(*pStrStudent).pcName);printf(Sex=%c\nScore=%f\n\n,(*pStrStudent).cSex,(*pStrStudent).fScore);/*通过指针和-运算符访问*/printf(Number=%d\nName=%s\n,pStrStudent-iNum,pStrStudent-pcName);printf(Sex=%c\nScore=%f\n\n,pStrStudent-cSex,pStrStudent-fScore);return0;}C程序设计快速进阶大学教程2020/4/211912.1.5结构体与指针例12.4用指针变量输出结构体数组。#includestdio.hstructstudent{intiNum;char*pcName;charcSex;floatfScore;}strStuArr[5]={{101,Zhouping,'M',45},{102,Zhangping,'M',62.5},{103,Lioufang,'F',92.5},{104,Chengling,'F',87},{105,Wangming,'M',58}};intmain(){structstudent*pStrStudent;/*指针指向数组开始*/pStrStudent=strStuArr;printf(No\tName\t\t\tSex\tScore\t\n);/*通过移动指针访问数组*/for(pStrStudent=strStuArr;pStrStudentstrStuArr+5;pStrStudent++)printf(%d\t%s\t\t%c\t%f\t\n,pStrStudent-iNum,pStrStudent-pcName,pStrStudent-cSex,pStrStudent-fScore);return0;}C程序设计快速进阶大学教程2020/4/212012.2链表数组大小编译时决定--不适于大小可变情况动态空间运行时申请与释放--够用即可07A8地址:07A8175.20798275.207E8375.20地址:0798地址:07E8头指针structstudent{intiNum;floatfScore;structstudent*pStrNext;};链表的精髓C程序设计快速进阶大学教程2020/4/212112.2链表链表的基本操作有以下几种:(1)建立链表;(2)输出链表(3)结点查找;(4)插入结点;(5)删除结点;C程序设计快速进阶大学教程2020/4/212212.2链表例12.5链表的创建、输出、查找#includestdio.h/*结点定义*/structstudent{intiNum;floatfScore;structstudent*pStrNext;};C程序设计快速进阶大学教程2020/4/212312.2链表例12.5链表的创建、输出、查找/*创建链表*/structstudent*create(){structstudent*pStrStuHead=0,*pStrStuTemp,*pStrStuTail=0;intiNumTemp;floatfScoreTemp;printf(inputnumandscore(=0,0end):\n);scanf(%d,&iNumTemp);scanf(%f,&fScoreTemp);/*添加结点,当输入成绩值为负数时结束*/while(fScoreTemp0){/*申请结点并填入数据,结点的指针域为0,因为新结点将作为最后一个结点*/pStrStuTemp=(structstudent*)

1 / 29
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功