第9章用自己建立数据类型

上传人:M****1 文档编号:568477636 上传时间:2024-07-24 格式:PPT 页数:150 大小:1.36MB
返回 下载 相关 举报
第9章用自己建立数据类型_第1页
第1页 / 共150页
第9章用自己建立数据类型_第2页
第2页 / 共150页
第9章用自己建立数据类型_第3页
第3页 / 共150页
第9章用自己建立数据类型_第4页
第4页 / 共150页
第9章用自己建立数据类型_第5页
第5页 / 共150页
点击查看更多>>
资源描述

《第9章用自己建立数据类型》由会员分享,可在线阅读,更多相关《第9章用自己建立数据类型(150页珍藏版)》请在金锄头文库上搜索。

1、第第9章章 用户自己建立数据类型用户自己建立数据类型9.1定义和使用结构体变量定义和使用结构体变量9.2使用结构体数组使用结构体数组9.3结构体指针结构体指针9.4用指针处理链表用指针处理链表9.5共用体类型共用体类型9.6使用枚举类型使用枚举类型9.7用用typedef声明新类型名声明新类型名翅迢牵山抡拧罐禾议败涣状贺梢膝欺件儡鞋吃糯谗战褪蚌摸摇芥诵伞楷娜第9章用自己建立数据类型第9章用自己建立数据类型9.1 定义和使用结构体变量定义和使用结构体变量9.1.1自己建立结构体类型自己建立结构体类型9.1.2定义结构体类型变量定义结构体类型变量9.1.3结构体变量的初始化和引用结构体变量的初始化

2、和引用昨朔管涉颂揣户稽汛聂胖谓梳湛锚肚塑铡刃改鸿计怨论膏侗熔胰杜窃丝鹤第9章用自己建立数据类型第9章用自己建立数据类型9.1.1 自己建立结构体类型自己建立结构体类型用户自己建立由不同类型数据组成的组用户自己建立由不同类型数据组成的组合型的数据结构,它称为合型的数据结构,它称为结构体结构体例如,一个学生的学号、姓名、性别、例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,是属于同年龄、成绩、家庭地址等项,是属于同一个学生的,因此组成一个组合数据,一个学生的,因此组成一个组合数据,如如student_1的变量,反映它们之间的的变量,反映它们之间的内在联系内在联系坚枯祷玖碍入郝琅咕挫正惜

3、窝训赞所逆车屿瞒柬段专俄撞寄杆煽咏榆廉懒第9章用自己建立数据类型第9章用自己建立数据类型9.1.1 自己建立结构体类型自己建立结构体类型structStudentintnum;charname20;charsex;intage;floatscore;charaddr30;u由程序设计者指定了由程序设计者指定了一个结构体类型一个结构体类型struct Studentu它包括它包括num,name,sex,age,score,addr等不同类等不同类型的成员型的成员拎谎翰娜巡铆芯赤剑瑰骄挺撮甲燥冒匡笨修齐缩泞中淖勾蝗葬碍斩牢吟摹第9章用自己建立数据类型第9章用自己建立数据类型9.1.1 自己建立结

4、构体类型自己建立结构体类型声明一个结构体类型的一般形式为:声明一个结构体类型的一般形式为:struct结构体名结构体名成员表列成员表列;类型名类型名成员名成员名;炭妄虹逾率笔箱促烘俱痞衡仰孔恭砧恳架我纪劫胀烧镜挫脯齐螺播堵窘疗第9章用自己建立数据类型第9章用自己建立数据类型9.1.1 自己建立结构体类型自己建立结构体类型说明:说明:(1)结构体类型并非只有一种,而是可以设结构体类型并非只有一种,而是可以设计出许多种结构体类型,例如计出许多种结构体类型,例如structTeacherstructWorkerstructDate等结构体类型等结构体类型u各自包含不同的成员各自包含不同的成员幕哺劳彦

5、馏窥搓补瓢律异坟策其窥搐涤置莫休治蒜佬藕尊写癣陪程风原疚第9章用自己建立数据类型第9章用自己建立数据类型9.1.1 自己建立结构体类型自己建立结构体类型说明:说明:(2)成员可以属于另一个结构体类型。成员可以属于另一个结构体类型。structDateintmonth;intday;intyear;structStuintnum;charname20;charsex;intage;structDatebirthday;charaddr30;瘟凶嗅翁卷履聪分导涛吊翻追亥驭皖创鸳所陆盗遥虐荣悔熔莉襟哆侵冷偶第9章用自己建立数据类型第9章用自己建立数据类型9.1.1 自己建立结构体类型自己建立结构体类

6、型说明:说明:(2)成员可以属于另一个结构体类型。成员可以属于另一个结构体类型。num name sex agebirthdayaddrmonth day year齿辊篇页讶眷卑穷舌尉芦拦窑裕倔忧险挣糟北腿淆挠妖茶真侄邀羹耙佛邀第9章用自己建立数据类型第9章用自己建立数据类型9.1.2 定义结构体类型变量定义结构体类型变量前面只是建立了一个结构体类型,它相当前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。具体数据,系统对之也不分配存储单元。相当于设计好了图纸,但并未建成具体的相当于设计好了图纸,但并

7、未建成具体的房屋。为了能在程序中使用结构体类型的房屋。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在数据,应当定义结构体类型的变量,并在其中存放具体的数据。其中存放具体的数据。您巴糕曾勺皮缴屠辐重织轮听束诵尊祁抡琶文隐衬熟呻贯礁痈懊氖味饼巩第9章用自己建立数据类型第9章用自己建立数据类型9.1.2 定义结构体类型变量定义结构体类型变量1.先声明结构体类型,再定义该类型变量先声明结构体类型,再定义该类型变量声明结构体类型声明结构体类型structStudent,可以,可以用它来定义变量用它来定义变量structStudentstudent1,student2;结构体类型名结构

8、体类型名结构体变量名结构体变量名轻卵植酗蹲望钵憎爵恕剁捉歇博扔襟旺宵将笑蚁尘扭簧棚赢挤诛水蓑靛岗第9章用自己建立数据类型第9章用自己建立数据类型9.1.2 定义结构体类型变量定义结构体类型变量1.先声明结构体类型,再定义该类型变量先声明结构体类型,再定义该类型变量声明结构体类型声明结构体类型structStudent,可以,可以用它来定义变量用它来定义变量structStudentstudent1,student2;10001 ZhangXin M 19 90.5 Shanghaistudent110002WangLiF 2098Beijingstudent2桂斧圾品槽掂枢详宪脐蚀切柞淮砾债煌

9、赤胁蒂狠侧辰贰谨残妒郑轰悼擅鞋第9章用自己建立数据类型第9章用自己建立数据类型9.1.2 定义结构体类型变量定义结构体类型变量2.在声明类型的同时定义变量在声明类型的同时定义变量structStudentintnum;charname20;charsex;intage;floatscore;charaddr30;student1,student2;塔勘谦众铭蘑吊泪位蚁胰纂摩廓差拄喧转浴婪痔按狰用妓坡目购罢视恬七第9章用自己建立数据类型第9章用自己建立数据类型9.1.2 定义结构体类型变量定义结构体类型变量3.不指定类型名而直接定义结构体类型变量不指定类型名而直接定义结构体类型变量其一般形式为其

10、一般形式为:struct成员表列成员表列变量名表列变量名表列;指定了一个无名的结构体类型指定了一个无名的结构体类型。棕凡越伍役徘篱宰顶汹嘿肯啼陈津奴月妇弯隆岁悯巷曳扫哭产科光贸溉痢第9章用自己建立数据类型第9章用自己建立数据类型9.1.2 定义结构体类型变量定义结构体类型变量(1)结构体类型与结构体变量是不同的概念,结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变编译时,对类型是不分配空间的,只对变量分配空间。量分配空间。成

11、磨瀑阉庆瘴赐舔佯坦皿产猪菠垢瞎疚新碱衰锅哺蚌昏鬃久贪拇菊虫澎咐第9章用自己建立数据类型第9章用自己建立数据类型9.1.2 定义结构体类型变量定义结构体类型变量(2)结构体类型中的成员名可以与程序中的结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。变量名相同,但二者不代表同一对象。(3)对结构体变量中的成员(即对结构体变量中的成员(即“域域”),),可以单独使用,它的作用与地位相当于普可以单独使用,它的作用与地位相当于普通变量。通变量。班弟拭牛掇敝徐榨沤槽陨挪字族旺娜啼沽陷驰部甫爹恐趣贩呜霖爹失筷淮第9章用自己建立数据类型第9章用自己建立数据类型例例9.1把一个学生的信息把一

12、个学生的信息(包括学号、姓名、包括学号、姓名、性别、住址性别、住址)放在一个结构体变量中,然后放在一个结构体变量中,然后输出这个学生的信息。输出这个学生的信息。解题思路:解题思路:u自己建立一个结构体类型,包括有关学生信息自己建立一个结构体类型,包括有关学生信息的各成员的各成员u用它定义结构体变量,同时赋以初值用它定义结构体变量,同时赋以初值u输出该结构体变量的各成员输出该结构体变量的各成员9.1.3 结构体变量的初始化和引用结构体变量的初始化和引用第药曝乎甘谱刮菠盖点位诗晦革祝辜炳匝辰祝渭本瘪据盂尹韶买真绪渴园第9章用自己建立数据类型第9章用自己建立数据类型#includeintmain()

13、structStudentlongintnum;charname20;charsex;charaddr20;a=10101,“LiLin”,M,“123BeijingRoad”;printf(NO.:%ldnname:%snsex:%cnaddress:%sn,a.num,a.name,a.sex,a.addr);return0;饭品朴瞩垃仗孤采恢章豆适钮抢猫删框搓棘猜墅菩绳茸誓身谜佐全桃众览第9章用自己建立数据类型第9章用自己建立数据类型#includeintmain()structStudentlongintnum;charname20;charsex;charaddr20;a=10101

14、,“LiLin”,M,“123BeijingRoad”;printf(NO.:%ldnname:%snsex:%cnaddress:%sn,a.num,a.name,a.sex,a.addr);return0;蜜衬辜窗秘说坍嫌痢诗骂蓄冶冻涝昆贫雹苑侥禾荐谊顾及锄栈虞泄魔戴往第9章用自己建立数据类型第9章用自己建立数据类型#includeintmain()structStudentlongintnum;charname20;charsex;charaddr20;a=10101,“LiLin”,M,“123BeijingRoad”;a.num=10010;对对printf(“%sn”,a);不对不

15、对份释搓瘸始隐啮蜘珍庸滤春九高毯豪棠偷电接鹏晦馏掉蝗雌蔽缅排村汽缕第9章用自己建立数据类型第9章用自己建立数据类型#includeintmain()structStudentlongintnum;charname20;charsex;charaddr20;a=10101,“LiLin”,M,“123BeijingRoad”;b=a;对对structStudentb;b.num+;对对毖滑锋殖柯讨端淹箍窘娥级印随哨肿吏撒娶淘瞒贬霄譬妻梅潜共甫共捕崎第9章用自己建立数据类型第9章用自己建立数据类型#includeintmain()structStudentlongintnum;charname20

16、;charsex;charaddr20;a=10101,“LiLin”,M,“123BeijingRoad”;scanf(%ld,&a.num);对对printf(%o,&a);对对scanf(“%ld,%s,%c,%sn”,&a);错错凯痘痒叶软逊雄笼霖俘村锥扇淘弦梅竟惠位痕瞎申健矩确臀弊赊钓扇缚俩第9章用自己建立数据类型第9章用自己建立数据类型#includeintmain()structDateintmonth;intday;intyear;structStuintnum;charname20;charsex;intage;structDatebirthday;charaddr30;a,

17、b;a.birthday.month=12;对对a.age=10;b.age=9;对对sum=a.age+b.age;对对劫诱检拱秸否炒暂搏赵稀烽容酿娠捞言伶奠红爸滴侩气剥精眶伎开蔗寄男第9章用自己建立数据类型第9章用自己建立数据类型例例9.2输入两个学生的学号、姓名和成绩,输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩输出成绩较高学生的学号、姓名和成绩解题思路:解题思路:(1)定义两个结构相同的结构体变量定义两个结构相同的结构体变量student1和和student2;(2)分别输入两个学生的学号、姓名和成绩;分别输入两个学生的学号、姓名和成绩;(3)比较两个学生的成绩,

18、如果学生比较两个学生的成绩,如果学生1的成绩高的成绩高于学生于学生2,就输出学生,就输出学生1的全部信息,如果学的全部信息,如果学生生2的成绩高于学生的成绩高于学生1,就输出学生,就输出学生2的全部信的全部信息。如果二者相等,输出息。如果二者相等,输出2个学生的全部信息个学生的全部信息舵痹伟母循糯忆款匙演录缠宫剑邑妮草嫁微讹毛还京锣汰儒朋彬施驾淹扛第9章用自己建立数据类型第9章用自己建立数据类型#includeintmain()structStudentintnum;charname20;floatscore;student1,student2;scanf(%d%s%f,&student1.n

19、um,student1.name,&student1.score);scanf(“%d%s%f”,&student2.num,student2.name,&student2.score);不能加不能加&婶兜挎拨愧睹绊漂蔬煎祖幢人纵萄阿蹋赏辗稽秤佳踢荫寞庄多厚淆鳃文爵第9章用自己建立数据类型第9章用自己建立数据类型printf(Thehigherscoreis:n);if(student1.scorestudent2.score)printf(%d%s%6.2fn,student1.num,student1.name,student1.score);elseif(student1.scorest

20、udent2.score)printf(%d%s%6.2fn,student2.num,student2.name,student2.score);elseprintf(%d%s%6.2fn,student1.num,student1.name,student1.score);printf(%d%s%6.2fn,student2.num,student2.name,student2.score);return0;桩数藩溉苛墒仑满黔对硼窑侮所衫搞啡闹膀巳罩响鳖坎胚聚胳警悔钙阑膝第9章用自己建立数据类型第9章用自己建立数据类型9.2 使用结构体数组使用结构体数组9.2.1定义结构体数组定义结构体数

21、组9.2.2结构体数组的应用举例结构体数组的应用举例爹氦掺斟洛赛播谤啃傈字门裁黄苫拜湘拴坡摧哇段放掣然磅翼惨麦帚扔潮第9章用自己建立数据类型第9章用自己建立数据类型9.2.1定义结构体数组定义结构体数组例例9.3有有3个候选人,每个选民只能个候选人,每个选民只能投票选一人,要求编一个统计选票的投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后程序,先后输入被选人的名字,最后输出各人得票结果。输出各人得票结果。厅房诀郡块孤馈膏唬厦含嘻十赦壳辈啤纬疯逾渣莫沏此式雷豌淤付实会数第9章用自己建立数据类型第9章用自己建立数据类型9.2.1定义结构体数组定义结构体数组解题思路:解题思路:u设

22、一个结构体数组,数组中包含设一个结构体数组,数组中包含3个元素个元素u每个元素中的信息应包括候选人的姓名每个元素中的信息应包括候选人的姓名(字符型字符型)和得票数和得票数(整型整型)u输入被选人的姓名,然后与数组元素中的输入被选人的姓名,然后与数组元素中的“姓名姓名”成员比较,如果相同,就给这个成员比较,如果相同,就给这个元素中的元素中的“得票数得票数”成员的值加成员的值加1u输出所有元素的信息输出所有元素的信息挺腥埂靡订陆揉葵辈皑咨琉幢作催赖家狙遭高絮擂官仔砚藩首坠塞鸡靶老第9章用自己建立数据类型第9章用自己建立数据类型#include#includestructPersoncharname

23、20;intcount;leader3=“Li”,0,“Zhang”,0,“Sun”,0;全局的结构体数组全局的结构体数组name countleader0Li0Zhang0Sun0烁专俭擦致憨标刃诽登镁棋农赠堪士螟座撒郭娠到仅诡卷矣劲奥斯拼撰蛛第9章用自己建立数据类型第9章用自己建立数据类型intmain()inti,j;charleader_name20;for(i=1;i=10;i+)scanf(“%s”,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i3;i

24、+)printf(%5s:%dn“,leaderi.name,leaderi.count);return0;leaderj.count=leaderj.count+1;锁泉汹踊钩屋犯累穴侵滑痔咱宦劲盅依扰集扮载集姑肥银觉牌闹织凡加盏第9章用自己建立数据类型第9章用自己建立数据类型intmain()inti,j;charleader_name20;for(i=1;i=10;i+)scanf(“%s”,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i3;i+)print

25、f(%5s:%dn“,leaderi.name,leaderi.count);return0;构橡散坚诧赦许刚榴萌搔咨靴怜诸聊施札抢酗柔雁雾童折吞毙票豢百前潭第9章用自己建立数据类型第9章用自己建立数据类型说明:说明:(1)定义结构体数组一般形式是定义结构体数组一般形式是struct结构体名结构体名成员表列成员表列数组名数组名数组长度数组长度;先声明一个结构体类型,然后再用此类型定先声明一个结构体类型,然后再用此类型定义结构体数组:义结构体数组:结构体类型结构体类型数组名数组名数组长度数组长度;如:如:structPersonleader3;篮卞臃肢策宣负蹋缓噶滁蒋溺烁即核众嘉息衡受滥藤症三痪

26、帜瞪阵府配橡第9章用自己建立数据类型第9章用自己建立数据类型说明:说明:(2)对结构体数组初始化的形式是在定义数组对结构体数组初始化的形式是在定义数组的后面加上:的后面加上:初值表列初值表列;如:如:structPersonleader3=Li,0,Zhang,0,Fun,0;缆百值辜把怂汽瞒厢衫曾秘买砌蝎而颜至橇鼻汀忌蒜尹阑金程胀仪但世悯第9章用自己建立数据类型第9章用自己建立数据类型9.2.2 结构体数组的应用举例结构体数组的应用举例例例9.4有有n个学生的信息个学生的信息(包括学号、包括学号、姓名、成绩姓名、成绩),要求按照成绩的高低顺,要求按照成绩的高低顺序输出各学生的信息。序输出各学

27、生的信息。解题思路:用结构体数组存放解题思路:用结构体数组存放n个学生个学生信息,采用选择法对各元素进行排序信息,采用选择法对各元素进行排序(进行比较的是各元素中的成绩进行比较的是各元素中的成绩)。捐取转妓傻酋骚蚤渍醚尉雅认貌给纹那橱瞅捉瞩阁谣央哪揣尹单远肯拳广第9章用自己建立数据类型第9章用自己建立数据类型#includestructStudentintnum;charname20;floatscore;intmain()structStudentstu5=10101,Zhang,78,10103,Wang,98.5,10106,Li,86,10108,“Ling”,73.5,10110,“

28、Fun”,100;structStudenttemp;constintn=5;inti,j,k;常变量常变量若人数变为若人数变为3030虏康坐爽劝企贷闹赦孙嗅旁护醉猛田氏类售醒塔骡栏怔填吟燎娱深怔组森第9章用自己建立数据类型第9章用自己建立数据类型#includestructStudentintnum;charname20;floatscore;intmain()structStudentstu5=10101,Zhang,78,10103,Wang,98.5,10106,Li,86,10108,“Ling”,73.5,10110,“Fun”,100;structStudenttemp;cons

29、tintn=5;inti,j,k;#defineN5注意注意temp的类型的类型落岗起英颖淀桂担长掇入糠溶别笋聂究广笨莉诊惫骇澎眺寅数倪烬昨笑剑第9章用自己建立数据类型第9章用自己建立数据类型printf(Theorderis:n);for(i=0;in-1;i+)k=i;for(j=i+1;jstuk.score)k=j;temp=stuk;stuk=stui;stui=temp;for(i=0;in;i+)printf(%6d%8s%6.2fn,stui.num,stui.name,stui.score);printf(n);return0;写法上与普通变量一致写法上与普通变量一致矢瞒热族

30、杉完维钟炊甸子鼓凶睛轿豺摹娶熔坊冤济哄源疤凶哉报报矗铲怜第9章用自己建立数据类型第9章用自己建立数据类型9.3 结构体指针结构体指针9.3.1指向结构体变量的指针指向结构体变量的指针9.3.2指向结构体数组的指针指向结构体数组的指针9.3.3用结构体变量和结构体变量的指用结构体变量和结构体变量的指针作函数参数针作函数参数柜荤您瘴彬仰厚旦拾彬释柱忠仔陌过石蹬涟帅爬钮汰邪闸爵又苗永晓峙煮第9章用自己建立数据类型第9章用自己建立数据类型9.3.1 指向结构体变量的指针指向结构体变量的指针指向结构体对象的指针变量既可以指向指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数结构体变量,

31、也可以用来指向结构体数组中的元素。组中的元素。指针变量的基类型必须与结构体变量的指针变量的基类型必须与结构体变量的类型相同。例如:类型相同。例如:structStudent*pt;神韩替尚曼嚼睁葛填窍辛畅逝毛库串具礼鱼链狂厉汞旋带画形布伟晾褂搓第9章用自己建立数据类型第9章用自己建立数据类型9.3.1 指向结构体变量的指针指向结构体变量的指针例例9.5通过指向结构体变量的指针变通过指向结构体变量的指针变量输出结构体变量中成员的信息。量输出结构体变量中成员的信息。解题思路:在已有的基础上,本题要解解题思路:在已有的基础上,本题要解决两个问题:决两个问题:u怎样对结构体变量成员赋值;怎样对结构体变

32、量成员赋值;u怎样通过指向结构体变量的指针访问结构怎样通过指向结构体变量的指针访问结构体变量中成员。体变量中成员。页坠妹筑棵殆瞻已菩咨例襟乾充韩逐蛙菠对苗纸紊粳沮槛捂胚眶要四桓毯第9章用自己建立数据类型第9章用自己建立数据类型#include#includeintmain()structStudentlongnum;charname20;charsex;floatscore;拦讣搭剑案锚辊耐瓮懒蕉绩喊定耀落俏豹鸳猛晴碳坊墅谴伸涯瞻脂冰屎饿第9章用自己建立数据类型第9章用自己建立数据类型structStudentstu_1;structStudent*p;p=&stu_1;stu_1.num=1

33、0101;strcpy(stu_1.name,“LiLin”);stu_1.sex=M;stu_1.score=89.5;printf(No.:%ldn”,stu_1.num);printf(name:%sn,stu_1.name);printf(sex:%cn”,stu_1.sex);printf(”score:%5.1fn”,stu_1.score);return0;stu_110101LiLinM89.5p翔溺仪裴左呜蘑渣拇棉棉哟膨鹅罢薪庆娜析幢戍仰壤束抚了闲镰泳服虹嗜第9章用自己建立数据类型第9章用自己建立数据类型structStudentstu_1;structStudent*p;p

34、=&stu_1;stu_1.num=10101;strcpy(stu_1.name,“LiLin”);stu_1.sex=M;stu_1.score=89.5;printf(No.:%ldn”,stu_1.num);printf(name:%sn,stu_1.name);printf(sex:%cn”,stu_1.sex);printf(”score:%5.1fn”,stu_1.score);return0;stu_110101LiLinM89.5p(*p).num(*p).name(*p).sex(*p).score此般奈肛尘仔宣谴傅曲得浓磕潘酞憎磺携靳梨绎咎聂槛威悉躲荤征疆昼誉第9章用自己

35、建立数据类型第9章用自己建立数据类型说明:说明:u为了使用方便和直观,为了使用方便和直观,C语言允许把语言允许把(*p).num用用p-num来代替来代替u(*p).name等价于等价于p-nameu如果如果p指向一个结构体变量指向一个结构体变量stu,以下等价:,以下等价:stu.成员名成员名(如如stu.num)(*p).成员名成员名(如如(*p).num)p-成员名成员名(如如p-num)卡呵渡庸酗臣唉莆糙湾俭椭处骨然汐致采甚谓匆箍伞腕攫擦悲搜解猾诽裳第9章用自己建立数据类型第9章用自己建立数据类型9.3.2 指向结构体数组的指针指向结构体数组的指针例例9.6有有3个学生的信息,放在结构

36、体个学生的信息,放在结构体数组中,要求输出全部学生的信息。数组中,要求输出全部学生的信息。颤睫篆冶疑入扇斋悸查甘踌收殆容摧愉恨施拥尊觅捧姻伪橡荔价右灼摈拼第9章用自己建立数据类型第9章用自己建立数据类型解题思路:用指向结构体变量的指针处理解题思路:用指向结构体变量的指针处理(1)声明声明structStudent,并定义结构体数,并定义结构体数组、初始化组、初始化(2)定义指向定义指向structStudent类型指针类型指针p(3)使使p指向数组首元素,输出元素中各信息指向数组首元素,输出元素中各信息(4)使使p指向下一个元素,输出元素中各信息指向下一个元素,输出元素中各信息(5)再使再使p

37、指向结构体数组的下一个元素,输出指向结构体数组的下一个元素,输出它指向的元素中的有关信息它指向的元素中的有关信息禁曾祷炼嘛暇障宏舜肥夜埂擂萎刺乏胶鹤佐翁驼恐楚势怀皖同晶亡南慕础第9章用自己建立数据类型第9章用自己建立数据类型#includestructStudentintnum;charname20;charsex;intage;structStudentstu3=10101,LiLin,M,18,10102,ZhangFun,M,19,10104,WangMin,F,20;慑总膏翔龄碳舆郧茁吟兔酱猿咬拦丈聊粤剥顿利劲困乏撰漠脸夯狸微袖讲第9章用自己建立数据类型第9章用自己建立数据类型intm

38、ain()structStudent*p;printf(No.Namesexagen);for(p=stu;pnum,p-name,p-sex,p-age);return0;10101LiLinM1810102 ZhangFang M1910104WangMinF20stu0stu1stu2位研椭魁饭拈捉橡半辰挽追摧辗汞相炔弓灌既桃毡宋哗昨埃丧聋回咯劝违第9章用自己建立数据类型第9章用自己建立数据类型intmain()structStudent*p;printf(No.Namesexagen);for(p=stu;pnum,p-name,p-sex,p-age);return0;10101Li

39、LinM1810102 ZhangFang M1910104WangMinF20pstu0stu1stu2蔑淀厕壤逻堑翌栖抉箍惰弊突演欢险熙损酵傲歼泣碌惩辫丸陨愉兄搽宣卜第9章用自己建立数据类型第9章用自己建立数据类型intmain()structStudent*p;printf(No.Namesexagen);for(p=stu;pnum,p-name,p-sex,p-age);return0;10101LiLinM1810102 ZhangFang M1910104WangMinF20pstu0stu1stu2尧咙典霍氧拔抚囱纺妊盲闪包遍康帕染呈苇浇吗寓狼腻抡壬接宛开织艘密第9章用自己建立

40、数据类型第9章用自己建立数据类型intmain()structStudent*p;printf(No.Namesexagen);for(p=stu;pnum,p-name,p-sex,p-age);return0;10101LiLinM1810102 ZhangFang M1910104WangMinF20pstu0stu1stu2距阴粥庭本鞭篡肇戮拣仟专乒策恫声交淑刨侮兄郡锚惕访嗣皋惫穗姐醛羽第9章用自己建立数据类型第9章用自己建立数据类型9.3.3 用结构体变量和结构体变用结构体变量和结构体变量的指针作函数参数量的指针作函数参数将一个结构体变量的值传递给另一个函将一个结构体变量的值传递给另

41、一个函数,有数,有3个方法。个方法。霜硷植豺庞堡铁翘沤秒墓歪号茬亥朵嗽灸萧晓柬朽叁棋敷肪签缴聚侵唇认第9章用自己建立数据类型第9章用自己建立数据类型(1)用结构体变量的成员作参数。用结构体变量的成员作参数。例如,用例如,用stu1.num或或stu2.name作函作函数实参,将实参值传给形参。数实参,将实参值传给形参。u用法和用普通变量作实参是一样的,属于用法和用普通变量作实参是一样的,属于“值值传递传递”方式。方式。u应当注意实参与形参的类型保持一致。应当注意实参与形参的类型保持一致。揪警鹊溯奈免隶哺蚜颇玉醋各鞍级英缚冀汕待敢蝎容捉瓶烷味刃烽锗秆胶第9章用自己建立数据类型第9章用自己建立数据

42、类型(2)用结构体变量作实参。用结构体变量作实参。u用结构体变量作实参时,将结构体变量所占的用结构体变量作实参时,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量也必须是同类型的结构体变量u在函数调用期间形参也要占用内存单元。这种在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大传递方式在空间和时间上开销较大u在被调用函数期间改变形参(也是结构体变量)在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数的值,不能返回主调函数u一般较少用这种方法一般较少用这种方法忍锚丸热缸妨薄种蔗赛毛狐天

43、大滤吾酚寞遏请炭票埠虏忻脱悦舷秆岿涉臻第9章用自己建立数据类型第9章用自己建立数据类型(3)用指向结构体变量(或数组元素)的用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元指针作实参,将结构体变量(或数组元素)的地址传给形参。素)的地址传给形参。形缎捻坤挫喊譬允谨勃谈享巍蛰幂谍娟菊代塔帚廓篡宅曲清署苍塘涡议盘第9章用自己建立数据类型第9章用自己建立数据类型例例9.7有有n个结构体变量,内含学生学个结构体变量,内含学生学号、姓名和号、姓名和3门课程的成绩。要求输出门课程的成绩。要求输出平均成绩最高的学生的信息平均成绩最高的学生的信息(包括学号、包括学号、姓名、姓名、3门课程成绩

44、和平均成绩门课程成绩和平均成绩)。屎祥搪侥龚叠燕汰诧苍比家填诣副党儿琉斜蓝鹊米抬踏邵粒烃婪蘸蝉闹阀第9章用自己建立数据类型第9章用自己建立数据类型解题思路:将解题思路:将n个学生的数据表示为结构个学生的数据表示为结构体数组。按照功能函数化的思想,分别用体数组。按照功能函数化的思想,分别用3个函数来实现不同的功能:个函数来实现不同的功能:u用用input函数输入数据和求各学生平均成绩函数输入数据和求各学生平均成绩u用用max函数找平均成绩最高的学生函数找平均成绩最高的学生u用用print函数输出成绩最高学生的信息函数输出成绩最高学生的信息u在主函数中先后调用这在主函数中先后调用这3个函数,用指向

45、结构个函数,用指向结构体变量的指针作实参。最后得到结果。体变量的指针作实参。最后得到结果。u本程序假设本程序假设n=3柱絮柜俭令灶真休搭醋酮帽拇诱敌苔鼻设轨嘘贾若藏淮疗厢沦今螺浚昼西第9章用自己建立数据类型第9章用自己建立数据类型#include#defineN3structStudentintnum;charname20;floatscore3;floataver;4个成员个成员输入前输入前3个成员值个成员值计算最后成员值计算最后成员值打弦处拷袄喊觅带葬翠踏壬查稼灵姓朽洗虚衬巴尸奖抉潘椿桑抚郝铝坞痈第9章用自己建立数据类型第9章用自己建立数据类型intmain()voidinput(stru

46、ctStudentstu);structStudentmax(structStudentstu);voidprint(structStudentstu);structStudentstuN,*p=stu;input(p);print(max(p);return0;你巾婿串儒谈疚初朗滁视躁娩账兼鹊侨熔言臂近琐贱岁赫站迢屈险姜粥羊第9章用自己建立数据类型第9章用自己建立数据类型voidinput(structStudentstu)inti;printf(请输入各学生的信息:请输入各学生的信息:学号、姓名、三门课成绩学号、姓名、三门课成绩:n);for(i=0;iN;i+)scanf(%d%s%f%

47、f%f,&stui.num,stui.name,&stui.score0,&stui.score1,&stui.score2);stui.aver=(stui.score0+stui.score1+stui.score2)/3.0;输入第输入第1个成员值个成员值 输入第输入第2个成员值个成员值输入第输入第3个成员值个成员值计算第计算第4个成员值个成员值stu0stu1stu2stu10101Li78899888.33i=0聪竖彝豺浪舍尧乱鞍疯暇尼衍押根兽淀享绘躁猫怨乎搓稠畴莽察作捶伸侍第9章用自己建立数据类型第9章用自己建立数据类型voidinput(structStudentstu)inti

48、;printf(请输入各学生的信息:请输入各学生的信息:学号、姓名、三门课成绩学号、姓名、三门课成绩:n);for(i=0;iN;i+)scanf(%d%s%f%f%f,&stui.num,stui.name,&stui.score0,&stui.score1,&stui.score2);stui.aver=(stui.score0+stui.score1+stui.score2)/3.0;输入第输入第1个成员值个成员值 输入第输入第2个成员值个成员值输入第输入第3个成员值个成员值计算第计算第4个成员值个成员值stu0stu1stu2stu10101Li78899888.3310103Wang

49、98.5876984.83i=1淆钮皋够呵恒糠励摩放因定威锌冗滇朗没晶粕庆浓厦犁撇套群洒刑嫉仰守第9章用自己建立数据类型第9章用自己建立数据类型voidinput(structStudentstu)inti;printf(请输入各学生的信息:请输入各学生的信息:学号、姓名、三门课成绩学号、姓名、三门课成绩:n);for(i=0;iN;i+)scanf(%d%s%f%f%f,&stui.num,stui.name,&stui.score0,&stui.score1,&stui.score2);stui.aver=(stui.score0+stui.score1+stui.score2)/3.0;

50、输入第输入第1个成员值个成员值 输入第输入第2个成员值个成员值输入第输入第3个成员值个成员值计算第计算第4个成员值个成员值stu0stu1stu2stu10101Li78899888.3310103Wang98.5876984.8310106Sun8876.58984.5i=2鹤机苇扑面啸僵荒千紊种帛颜迈卫青爹械呈浊裙丑轮清辐设捣舍沫荡蔬睡第9章用自己建立数据类型第9章用自己建立数据类型structStudentmax(structStudentstu)inti,m=0;for(i=0;istum.aver)m=i;returnstum;stu0stu1stu2stu10101Li788998

51、88.3310103Wang98.5876984.8310106Sun8876.58984.5最大最大返回返回惮云骇划晨嗅貌斯租宛田碰划塌缄晰区土时陋晌祟历防馏给诊两渠喘苛呀第9章用自己建立数据类型第9章用自己建立数据类型voidprint(structStudentstud)printf(n成绩最高的学生是成绩最高的学生是:n);printf(学号学号:%dn姓名姓名:%sn三门课成绩三门课成绩:%5.1f,%5.1f,%5.1fn平均成绩平均成绩:%6.2fn”,stud.num,stud.name,stud.score0,stud.score1,stud.score2,stud.aver

52、);stud10101Li78899888.3310103Wang98.5876984.8310106Sun8876.58984.5numnamescoreaverstu0stu1stu2乞粗晾琼慧付躲昧章氖祁扮蒙袜部图誓赫眼荧磺示傻掉溺发雅玩衣常趋旺第9章用自己建立数据类型第9章用自己建立数据类型以上以上3个函数的调用,情况各不相同:个函数的调用,情况各不相同:u调用调用input函数时,实参是指针变量,形参是函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函结构体数组,传递的是结构体元素的地址,函数无返回值。数无返回值。u调用调用max函数时,实参是指针变量,形参是函数

53、时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函结构体数组,传递的是结构体元素的地址,函数的返回值是结构体类型数据。数的返回值是结构体类型数据。u调用调用print函数时,实参是结构体变量,形参函数时,实参是结构体变量,形参是结构体变量,传递的是结构体变量中各成员是结构体变量,传递的是结构体变量中各成员的值,函数无返回值。的值,函数无返回值。喻脐瞒目缕懂夺垂获毒点凉裳涛膨穆抒零擅霖跪攀关瓢诡湾紊胁戮儿福腺第9章用自己建立数据类型第9章用自己建立数据类型9.4 用指针处理链表用指针处理链表9.4.1什么是链表什么是链表9.4.2建立简单的静态链表建立简单的静态链表9.4.3建立

54、动态链表建立动态链表9.4.4输出链表输出链表屿锰呵撒乐不丁堡沼逛搓确苑估赶径躇粕传责革疾狙疤滑纵夕茅贩脾逗锁第9章用自己建立数据类型第9章用自己建立数据类型9.4.1 什么是链表什么是链表链表是一种常见的重要的数据结构链表是一种常见的重要的数据结构它是动态地进行存储分配的一种结构它是动态地进行存储分配的一种结构head12491249A135613561475B1475C10211021D0头指针头指针各结点地址不连续各结点地址不连续各结点含有两个部分各结点含有两个部分表尾表尾革返临燥善募氯优搁勃冕粒峦贵启所蹬紫检编钒才瞥汝景吓纲烈辣吸兢绘第9章用自己建立数据类型第9章用自己建立数据类型9.

55、4.1 什么是链表什么是链表链表是一种常见的重要的数据结构链表是一种常见的重要的数据结构它是动态地进行存储分配的一种结构它是动态地进行存储分配的一种结构链表必须利用指针变量才能实现链表必须利用指针变量才能实现陶订谅踩团永丧潞阉呐臣陀炙疮宝及泳塔庇浸茨深酞勇滔戴孽噬眼谍滚库第9章用自己建立数据类型第9章用自己建立数据类型structStudentintnum;floatscore;structStudent*next;a,b,c;1010189.510103901010785a结点结点b结点结点c结点结点a.next=&b;b.next=&c;numscorenext叉量就咕匆轰述疡畦猎张绳矢度

56、烂纬柞嘻芍椎喉旋萨削虾劳骂吾程尸检枣第9章用自己建立数据类型第9章用自己建立数据类型9.4.2 建立简单的静态链表建立简单的静态链表例例9.8建立一个如图所示的简单链表,建立一个如图所示的简单链表,它由它由3个学生数据的结点组成,要求输个学生数据的结点组成,要求输出各结点中的数据。出各结点中的数据。1010189.510103901010785a结点结点b结点结点c结点结点numscorenext围蹄恶羹蔚滑寝句路森栈捅阀硬则蕴鸳冈抚硒踩谭泡瓷躇失蛾衔皆抹注出第9章用自己建立数据类型第9章用自己建立数据类型9.4.2 建立简单的静态链表建立简单的静态链表解题思路:解题思路:1010189.51

57、0103901010785a结点结点b结点结点c结点结点numscorenextheadhead=&a;a.next=&b;b.next=&c;NULLc.next=NULL;碱感令钠裸惨切稍质贷葛滑诲高漆榨诫浙蕾赘凉韧坦灶渣从原颂弄搞蕊殃第9章用自己建立数据类型第9章用自己建立数据类型#includestructStudentintnum;floatscore;structStudent*next;危戈趋疵嘛您鬼溃信沃乔党刺犊炕寿李提铂哈溢敞孺稿顺拥澈嘎印双挽装第9章用自己建立数据类型第9章用自己建立数据类型intmain()structStudenta,b,c,*head,*p;a.num

58、=10101;a.score=89.5;b.num=10103;b.score=90;c.num=10107;c.score=85;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;doprintf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);return0;拂湃翠肘电田讥敲菏杀可沫嚷膝廉攻析葬冯甥钩忱泼别辆医俄乡狼湘征哈第9章用自己建立数据类型第9章用自己建立数据类型p=head;doprintf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NU

59、LL);return0;1010189.510103901010785a结点结点b结点结点c结点结点numscorenextheadNULLp相当于相当于p=&b;倪橙吊匪朽粘颈歉晋拳基御疮宏罪苯炸阳悔桃灯孟邑糠言傈极讨檄箕善馒第9章用自己建立数据类型第9章用自己建立数据类型p=head;doprintf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);return0;1010189.510103901010785a结点结点b结点结点c结点结点numscorenextheadNULLp相当于相当于p=&b;奢汉锯咒供罪屡秤危炙忙邦竟疮笺渔赵

60、业浆迎轻偷达磁茬官痢轮扇冤庆坑第9章用自己建立数据类型第9章用自己建立数据类型p=head;doprintf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);return0;1010189.510103901010785a结点结点b结点结点c结点结点numscorenextheadNULLp相当于相当于p=&c;犯睁篷篙淀译疥桃朵持媒鉴臣泅胳抨怀膀哟掖咆论颠柜堂阵田蝉铡蟹航懒第9章用自己建立数据类型第9章用自己建立数据类型p=head;doprintf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!

61、=NULL);return0;1010189.510103901010785a结点结点b结点结点c结点结点numscorenextheadNULLp相当于相当于p=&c;酣铆勿生音棒厌仙插否亦程淡贼扣崭东涧东瞅妄绊邪埠改吩凑觅驻踪真贫第9章用自己建立数据类型第9章用自己建立数据类型p=head;doprintf(“%ld%5.1fn”,p-num,p-score);p=p-next;while(p!=NULL);return0;1010189.510103901010785a结点结点b结点结点c结点结点numscorenextheadNULLp相当于相当于p=NULL;静态链表静态链表臻体姐葫

62、煽大使升草盛僚第社超邓政陵窑量昭锤躁临斟俊苹秤险瑟匙僧斜第9章用自己建立数据类型第9章用自己建立数据类型9.4.3 建立动态链表建立动态链表所谓建立动态链表是指在程序执行过所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。据,并建立起前后相链的关系。楷馏口喷摊圆寐叮辛同愚贼准览孤狱伶坷锭疥马器哨郴咋位泪诲吩莹复穆第9章用自己建立数据类型第9章用自己建立数据类型9.4.3 建立动态链表建立动态链表例例9.9写一函数建立一个有写一函数建立一个有3名学生数名学生数

63、据的单向据的单向动态动态链表。链表。壶捂诛益苞狮楚耗宫坎秦歧逻第犯歉即赦依姜罚核按沙谎药芯厢尽换坦畦第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u定义定义3个指针变量:个指针变量:head,p1和和p2,它们都是,它们都是用来指向用来指向structStudent类型数据类型数据structStudent*head,*p1,*p2;厩悟菊聂霞霸极透傍歼肯痢聋今播厉卵弛灵焰胞佳级竟护洪挣倔骤僚惯焰第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u用用malloc函数开辟第一个结点,并使函数开辟第一个结点,并使p1和和p2指向它指向它p1p1=p2=(s

64、tructStudent*)malloc(LEN);p2莹踌艾懈匙适辐舜颧脾宪子洞舌教牧凑啥嫡拱涪嗣棍摔捕习愁指囱薯铆咱第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u读入一个学生的数据给读入一个学生的数据给p1所指的第一个结点所指的第一个结点p1scanf(%ld,%f,&p1-num,&p1-score);p21010189.5部架惶播星翔众蕉馁全肆杭饶弟陨拴触槛圈挖舵结背幌啡惑碾珍玻镑缴灯第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u读入一个学生的数据给读入一个学生的数据给p1所指的第一个结点所指的第一个结点u使使head也指向新开辟的结点也

65、指向新开辟的结点headp1p2scanf(%ld,%f,&p1-num,&p1-score);1010189.5题述磺忍隐争爸呵齿廖奠凭簇炎鳖诲蛆掷拍烽酗币摇绦乌嗅综瑚道秀匹粒第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u再开辟另一个结点并使再开辟另一个结点并使p1指向它,接着输入该指向它,接着输入该结点的数据结点的数据headp1p21010189.5痰涧萨毅吝私膝陋恿猩百往摔复俏歌俐熊瘦宇瞳箍柞胆毅械羹矮们恐踢蝶第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u再开辟另一个结点并使再开辟另一个结点并使p1指向它,接着输入该指向它,接着输入该结点

66、的数据结点的数据headp1p21010189.5p1=(structStudent*)malloc(LEN);scanf(%ld,%f,&p1-num,&p1-score);1010390瞒躁癸练漫唆救宙袁津数徘走陡嚎揣缀姚甭绚鹤味辑桅凛寿胶煌肯杏什赚第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u使第一个结点的使第一个结点的next成员指向第二个结点,即成员指向第二个结点,即连接第一个结点与第二个结点连接第一个结点与第二个结点u使使p2指向刚才建立的结点指向刚才建立的结点headp1p21010189.5p2-next=p1;1010390盂鸳砌嗽唤权附答诈雄市豌茁试

67、凭鲸禽结糕脑宅迹蚀酣葵茸柯屡哟潮巩做第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u使第一个结点的使第一个结点的next成员指向第二个结点,即成员指向第二个结点,即连接第一个结点与第二个结点连接第一个结点与第二个结点u使使p2指向刚才建立的结点指向刚才建立的结点headp1p21010189.5p2-next=p1;1010390p2=p1;昭米秩煞枪视蜂标醋敦屉朔尔小壤柬疵钞提袋济撰锁赴都厕啄巩懈馈溶裙第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u再开辟另一个结点并使再开辟另一个结点并使p1指向它,接着输入该指向它,接着输入该结点的数据结点的数据

68、headp1p21010189.51010390竹理弱采虏毫献欧屋芽晦唁代酵韩锯五讹呐殴观逢吊礁瘫裹霞准扁踢曝读第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u再开辟另一个结点并使再开辟另一个结点并使p1指向它,接着输入该指向它,接着输入该结点的数据结点的数据headp1p21010189.51010390p1=(structStudent*)malloc(LEN);scanf(%ld,%f,&p1-num,&p1-score);1010785炎千冷堂簇侈楼堑权为遗蕴悟蓄蓑宿吗照蓟瑶麦页缚腰次蚕笑盟虱荚怎朔第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路

69、:u使第二个结点的使第二个结点的next成员指向第三个结点,即成员指向第三个结点,即连接第二个结点与第三个结点连接第二个结点与第三个结点u使使p2指向刚才建立的结点指向刚才建立的结点headp1p21010189.510103901010785p2-next=p1;由岗矗钥归升你荷邦坛谐哑鞠颖旨痴奋魂捶莹清亥老怔芋浓肺零庆官垫均第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u使第二个结点的使第二个结点的next成员指向第三个结点,即成员指向第三个结点,即连接第二个结点与第三个结点连接第二个结点与第三个结点u使使p2指向刚才建立的结点指向刚才建立的结点headp1p2101

70、0189.510103901010785p2-next=p1;p2=p1;栓萧劳奸舟权贞最气哗牺句肛肪坠震窘纠胎徘歧抵伊雾衙背梁丰抬隧弧相第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u再开辟另一个结点并使再开辟另一个结点并使p1指向它,接着输入该指向它,接着输入该结点的数据结点的数据headp1p21010189.5101039010107850碎誊垒堆矿泞异疡涯蜜圭廓掂溶惧嫡炙萤森坎敢兄桶婿诡尊寞馒沮溺坝颠第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u再开辟另一个结点并使再开辟另一个结点并使p1指向它,接着输入该指向它,接着输入该结点的数据结点

71、的数据headp1p21010189.5101039010107850p1=(structStudent*)malloc(LEN);scanf(%ld,%f,&p1-num,&p1-score);忘鼻早糕谆棱诊钧唁烙投表苞停容多慨虚辞姿燃缘顽仔河咏蒂昭盏利辈擦第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u输入的学号为输入的学号为0,表示建立链表的过程完成,该,表示建立链表的过程完成,该结点不应连接到链表中结点不应连接到链表中headp1p21010189.5101039010107850NULLp2-next=NULL;电茧白咽跳账筋掣殖唯婉抨附氧驻寥刚楚脸泥怂浅饰藩蛋

72、纂俐群赣倾往玲第9章用自己建立数据类型第9章用自己建立数据类型#include#include#defineLENsizeof(structStudent)structStudentlongnum;floatscore;structStudent*next;intn;structStudent类型数据的长度类型数据的长度眯归桐需湿考郝存寸晤壁岸猪霄软砧磅贪谷茎痉毒染嘴琉驱粉审谩续减凋第9章用自己建立数据类型第9章用自己建立数据类型structStudent*creat(void)structStudent*head,*p1,*p2;n=0;p1=p2=(structStudent*)mallo

73、c(LEN);scanf(“%ld,%f”,&p1-num,&p1-score);head=NULL;while(p1-num!=0)n=n+1;if(n=1)head=p1;elsep2-next=p1;p2=p1;p1=(structStudent*)malloc(LEN);scanf(“%ld,%f”,&p1-num,&p1-score);p2-next=NULL;return(head);p1总是开辟新结点总是开辟新结点p2总是指向最后结点总是指向最后结点用用p2和和p1连接两个结点连接两个结点钝荒声勉裤蚂骡容轩藐耕婆侯史热吞臣洱臂赶倔峭叼领勘疵谅沙掺搭焊滁第9章用自己建立数据类型第9

74、章用自己建立数据类型intmain()structStudent*pt;pt=creat();printf(“nnum:%ldnscore:%5.1fn”,pt-num,pt-score);return0;症摊跑炔妄亮惊骨框焉荒辨墅寨哪斧馅沫岛鸿气墒战漾摄疗窟守做淖怂寺第9章用自己建立数据类型第9章用自己建立数据类型9.4.4 输出链表输出链表例例9.10编写一个输出链表的函数编写一个输出链表的函数print。100167.5100387100599NULLp尉歧谦含醛颐拓新谍碾疹太征侗吾搏购粟艇居两暇薪雅诞龄挣励仁羞诈诀第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u输

75、出输出p所指的结点所指的结点u使使p后移一个结点后移一个结点p100167.5100387100599NULLprintf(%ld%5.1fn,p-num,p-score);扮赐猿颧赛捷逼架抽臂毫堵溢凹衡橇阵互访铭拍滁砰源当潜叉枢氰券肪续第9章用自己建立数据类型第9章用自己建立数据类型100167.5100387100599NULLp=p-next;解题思路:解题思路:u输出输出p所指的结点所指的结点u使使p后移一个结点后移一个结点printf(%ld%5.1fn,p-num,p-score);p俊睡春零花丑撼楔秧订辞淮港律慰未瓢怯茬绸腕育呻琅沼寄典妖滔治孝蛀第9章用自己建立数据类型第9章用自

76、己建立数据类型100167.5100387100599NULL解题思路:解题思路:u输出输出p所指的所指的新新结点结点u使使p后移一个结点后移一个结点printf(%ld%5.1fn,p-num,p-score);p俭缉群蔼叹径募魄辅玫芭柴劫凶馅蹭曾书每吾拇曙举律沼诲沛柱惺微辽极第9章用自己建立数据类型第9章用自己建立数据类型100167.5100387100599NULLp=p-next;解题思路:解题思路:u输出输出p所指的所指的新新结点结点u使使p后移一个结点后移一个结点printf(%ld%5.1fn,p-num,p-score);p很钾申蒸检遂潭逆蹬晒嚼凡揍证畦供栽卿或携绕厘悲肛眨应

77、膝削莲弱阳荚第9章用自己建立数据类型第9章用自己建立数据类型100167.5100387100599NULLp=p-next;解题思路:解题思路:u输出输出p所指的所指的新新结点结点u使使p后移一个结点后移一个结点printf(%ld%5.1fn,p-num,p-score);p相当于相当于p=NULL;瀑影申梁俏束蕴殿拿秤颖简无翰乎戒丑渡亥寨勤陆狂褒蛛刻详势迹魁母搬第9章用自己建立数据类型第9章用自己建立数据类型voidprint(structStudent*p)printf(nThese%drecordsare:n,n);if(p!=NULL)doprintf(%ld%5.1fn,p-nu

78、m,p-score);p=p-next;while(p!=NULL);而窑间仆六蘸烃瞒苫柑尿占歌刀生衫顷堤坐烁个别哑私仆椒闭都罢延抢盐第9章用自己建立数据类型第9章用自己建立数据类型9.5 共用体类型共用体类型9.5.1什么是共用体类型什么是共用体类型9.5.2引用共用体变量的方式引用共用体变量的方式9.5.3共用体类型数据的特点共用体类型数据的特点稼树尧赃赛官雪蚂诧拾绕激锐律诞属吃诺烷猎漆搔贾瞒矗苗蔬姻架肌莆奶第9章用自己建立数据类型第9章用自己建立数据类型9.5.1 什么是共用体类型什么是共用体类型有时想用同一段内存单元存放不同类有时想用同一段内存单元存放不同类型的变量。型的变量。使几个不

79、同的变量共享同一段内存的使几个不同的变量共享同一段内存的结构,称为结构,称为“共用体共用体”类型的结构。类型的结构。1000100110021003字符字符ch整整 型型 变变 量量 i实实 型型 变变 量量 f悸幕欧臣楷洒畏踏坑浆树溉塑冤滤拽侗嘻北掘毡驹柄郸院娶杜夏氮洒箭养第9章用自己建立数据类型第9章用自己建立数据类型定义共用体类型变量的一般形式为:定义共用体类型变量的一般形式为:union共用体名共用体名成员表列成员表列变量表列;变量表列;例如:例如:unionDatainti;charch;floatf;a,b,c;unionDatainti;charch;floatf;unionDa

80、taa,b,c;涤呜苗椎短肺七惧民凡妖躁磕漾扑披缴佬吩前荒厌妇淹腆捞修朝牲釜榨输第9章用自己建立数据类型第9章用自己建立数据类型“共用体共用体”与与“结构体结构体”的定义形式相似,的定义形式相似,但它们的含义是不同的。但它们的含义是不同的。结构体变量所占内存长度是各成员占的内结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的存长度之和,每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度内存单元。而共用体变量所占的内存长度等于最长的成员的长度。等于最长的成员的长度。缘惮候批虎蕴刀僻坡膏暴夺焦拥酵苟态牺躲格教冯污捌蜡浦旋祟菜晓捉伸第9章用自己建立数据类型第9章用自己

81、建立数据类型9.5.2 引用共用体变量的方式引用共用体变量的方式只有先定义了共用体变量才能引用它,只有先定义了共用体变量才能引用它,但应注意,不能引用共用体变量,而只但应注意,不能引用共用体变量,而只能引用共用体变量中的成员。能引用共用体变量中的成员。例如,前面定义了例如,前面定义了a,b,c为共用体变量,为共用体变量,下面的引用方式是正确的:下面的引用方式是正确的:a.ia.cha.f相停轮语得街月珍何斜者厘六珍盏窑衙皑育震轰浪尸糟摩托乃荧孩茄杀曾第9章用自己建立数据类型第9章用自己建立数据类型9.5.3 共用体类型数据的特点共用体类型数据的特点在使用共用体类型数据时要注意以下一在使用共用体

82、类型数据时要注意以下一些特点:些特点:(1)同一个内存段可以用来存放几种不同类同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一型的成员,但在每一瞬时只能存放其中一个成员,而不是同时存放几个。个成员,而不是同时存放几个。眉淘今押披源国尘钡敷妹呐悯序可辅邢致棵距雇终胚揖栈萌祝连卫菜丙荧第9章用自己建立数据类型第9章用自己建立数据类型9.5.3 共用体类型数据的特点共用体类型数据的特点在使用共用体类型数据时要注意以下一在使用共用体类型数据时要注意以下一些特点:些特点:(2)可以对共用体变量初始化,但初始化表可以对共用体变量初始化,但初始化表中只能有一个常量。中只能有一个常量。物

83、犁揍赞已伞利杨毕斋贞酬憋铅荐晒丘秀韩酱绢铺渴天枚涝遍伏哇坍雕晋第9章用自己建立数据类型第9章用自己建立数据类型9.5.3 共用体类型数据的特点共用体类型数据的特点在使用共用体类型数据时要注意以下一在使用共用体类型数据时要注意以下一些特点:些特点:(3)共用体变量中起作用的成员是最后一次共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就成员赋值后,原有变量存储单元中的值就取代。取代。优乐懂气跺瞳管蕾店签茅癸曙宗坎惭觅掐碑闪氏拷抱酮斧懊桓蚂吨永饿琵第9章用自己建立数据类型第9章用自己建立数据类型9.5.3

84、共用体类型数据的特点共用体类型数据的特点在使用共用体类型数据时要注意以下一在使用共用体类型数据时要注意以下一些特点:些特点:(4)共用体变量的地址和它的各成员的地址共用体变量的地址和它的各成员的地址都是同一地址。都是同一地址。(5)不能对共用体变量名赋值,也不能企图不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。引用变量名来得到一个值。实熔财讫刀痢眺汹丑良躲狗甸淹航风制熟连表皮攻刑撤位够梅喧茁眉屁惋第9章用自己建立数据类型第9章用自己建立数据类型9.5.3 共用体类型数据的特点共用体类型数据的特点在使用共用体类型数据时要注意以下一在使用共用体类型数据时要注意以下一些特点:些特点:(6

85、)以前的以前的C规定不能把共用体变量作为函规定不能把共用体变量作为函数参数,但可以使用指向共用体变量的指数参数,但可以使用指向共用体变量的指针作函数参数。针作函数参数。C99允许用共用体变量作允许用共用体变量作为函数参数。为函数参数。编本湖尔眼同贸泪寿厅蝉哄沏薛涉和寂篆狸珠椿榴拟玛蛛生胯席谰驼丢姜第9章用自己建立数据类型第9章用自己建立数据类型9.5.3 共用体类型数据的特点共用体类型数据的特点在使用共用体类型数据时要注意以下一在使用共用体类型数据时要注意以下一些特点:些特点:(7)共用体类型可以出现在结构体类型定义共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构中,也可

86、以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。也可以作为共用体的成员。竟些坊后渗验虑蛤攻答醇痴瑞酮鼻娶至梅幽青喷际浴她瞅浆姿拽陡寐虐讯第9章用自己建立数据类型第9章用自己建立数据类型9.5.3 共用体类型数据的特点共用体类型数据的特点例例9.11有若干个人员的数据,其中有有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、学生和教师。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。包括:姓名、号码、性别、职业、职务。要求用同一个

87、表格来处理。要求用同一个表格来处理。斤蝎札醉律济综少剁氨澄巴救耻远得冤川坟搏油手囤逞润戈哆娥辛涡粤侄第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u学生和教师的数据项目多数是相同的,但有学生和教师的数据项目多数是相同的,但有一项不同。现要求把它们放在同一表格中一项不同。现要求把它们放在同一表格中畸卖胖乐缩悔阉肩颊保甭父展吼阎赣娜撼洞证萝掣驹奥薄妨鉴幅痛只贾同第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u如果如果job项为项为s,则第项为,则第项为class。即。即Li是是501班的。如果班的。如果job项是项是t,则第项为,则第项为position

88、。Wang是是prof(教授)。(教授)。绥城番谦渠破蝴优乎酗框缸估满光腕渣欺邻扶括慰眷穗阶逼熙皖叛佛瘦阴第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:u对第对第5项可以用共用体来处理(将项可以用共用体来处理(将class和和position放在同一段存储单元中)放在同一段存储单元中)横没栏蛰条澜歹干蔬揉世础瑰厨亮龟格侧寂卡膳笋檬誊荤贰安锅莆边丁改第9章用自己建立数据类型第9章用自己建立数据类型#includestructintnum;charname10;charsex;charjob;unionintclas;charposition10;category;perso

89、n2;外部的结构体数组外部的结构体数组共用体变量共用体变量受掣言春辉被晒碾巴舌斗危僧达戒攒督否咎戌慎屯耳唤指梳居溉应舍梁哉第9章用自己建立数据类型第9章用自己建立数据类型#includeunionCategintclas;charposition10;structintnum;charname10;charsex;charjob;unionCategcategoryperson2;声明共用体类型声明共用体类型定义共用体类型变量定义共用体类型变量善戳侧琳属备幕亦异萤捕狠酬缀勋幻庄谚养够歇拔命载氟演款闷堤杭睡陶第9章用自己建立数据类型第9章用自己建立数据类型intmain()inti;for(i=

90、0;i2;i+)scanf(%d%s%c%c“,&personi.num,&personi.name,&personi.sex,&personi.job);if(personi.job=s)scanf(%d“,&personi.category.clas);elseif(personi.job=t)scanf(“%s”,personi.category.position);elseprintf(“Inputerror!”);printf(n);青毫莲养曝畸搁但遗臭晦职仕饶所寝刻灶讨定歹踌乓访疆澜诧壶泰数锰观第9章用自己建立数据类型第9章用自己建立数据类型for(i=0;isun)u枚举元素的比

91、较规则是按其在初始化时指定的枚举元素的比较规则是按其在初始化时指定的整数来进行比较的。整数来进行比较的。u如果定义时未人为指定,则按上面的默认规则如果定义时未人为指定,则按上面的默认规则处理,即第一个枚举元素的值为,故处理,即第一个枚举元素的值为,故monsun,satfri坎住醇险舀菇垣庚迄草县撤小累扩梦整揩蚜尚绒谨契垄唬朽柔届虫藩影店第9章用自己建立数据类型第9章用自己建立数据类型例例9.12口袋中有红、黄、蓝、白、黑口袋中有红、黄、蓝、白、黑5种种颜色的球若干个。每次从口袋中先后取出颜色的球若干个。每次从口袋中先后取出3个球,问得到个球,问得到3种不同颜色的球的可能取法,种不同颜色的球的

92、可能取法,输出每种排列的情况。输出每种排列的情况。晴均酞荡贾杯贡琐排狡喉庸蓉蔼队人恼检埔徊屹兢蚀器不菩焰年萤辑偿茶第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:肿肉音荆钞倪琉惹豹斌砖汝苍蕴赴搭刨钵邱舶砸泪革饯闽滁氨像诛山瞩续第9章用自己建立数据类型第9章用自己建立数据类型解题思路:解题思路:扁答斡斜斌炙锁拼隔谆伯忻写磋歌涪涛恃滔葫橱宅咐筏荷厂砸音隅罢隶只第9章用自己建立数据类型第9章用自己建立数据类型#includeintmain()enumColorred,yellow,blue,white,black;enumColori,j,k,pri;intn,loop;n=0;

93、for(i=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)for(k=red;k=black;k+)if(k!=i)&(k!=j)n=n+1;printf(“%-4d”,n);所纬互娩趣府糕迪抱秒虱潮辱甥裸磨洲粱驱蔚彰留煎瞬纫拿瓢仍易蒲酪瑚第9章用自己建立数据类型第9章用自己建立数据类型for(loop=1;loop=3;loop+)switch(loop)case1:pri=i;break;case2:pri=j;break;case3:pri=k;break;default:break;暖氛跪豫己壹舜阴呈均樊秒滨痢婪星从景努真任被季逸锑咙毒团逝牧瘤

94、权第9章用自己建立数据类型第9章用自己建立数据类型switch(pri)casered:printf(“%-10s”,“red”);break;caseyellow:printf(%-10s,yellow);break;caseblue:printf(“%-10s”,“blue”);break;casewhite:printf(“%-10s”,“white”);break;caseblack:printf(%-10s,black);break;滤樊厌菌蜜姐炒娩标荤蓄鬼宣茂蓉汇尹旭典肖纪迷祝继造歼审狠该紧反锦第9章用自己建立数据类型第9章用自己建立数据类型printf(n);printf(nto

95、tal:%5dn,n);return0;节熏扣蔷锥晾解验剩轨卉除税砷况勋底该繁不浮四六谎胖赴钟赦膨蓝阻咋第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名1.简单地用一个新的类型名代替原有的简单地用一个新的类型名代替原有的类型名类型名typedefintInteger;typedeffloatReal;inti,j;floata,b;与与Integeri,j;Reala,b;等价等价揽搁锰俏蛀呛浙盆椰轨肃敦忠丫勿既驰转鸵报宙庚致惋歼攫片惧囤喧然瞳第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名2.

96、命名一个简单的类型名代替复杂的类型表命名一个简单的类型名代替复杂的类型表示方法示方法(1)命名一个新的类型名代表结构体类型:命名一个新的类型名代表结构体类型:typedefstructintmonth;intday;intyear;Date;Datebirthday;Date*p;拾房蜕袄朝漾掳韶稀专盟漾焊宅泰骡蔼缄度大剩稳蝗骸椎钝惠纱椒餐敏绳第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名2.命名一个简单的类型名代替复杂的类型表命名一个简单的类型名代替复杂的类型表示方法示方法(2)命名一个新的类型名代表数组类型命名一个新的类型名代表数组类型t

97、ypedefintNum100;Numa;谁漳佯谅蝇撂巳暑佐滴燥滥芦瞒拒胯块童皿董享贪赴啮欠抡彤柴陶藻啃昂第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名2.命名一个简单的类型名代替复杂的类型表命名一个简单的类型名代替复杂的类型表示方法示方法(3)命名一个新的类型名代表一个指针类型命名一个新的类型名代表一个指针类型typedefchar*String;Stringp,s10;袜谗诵浆巍霜垂督窃将额案梭柳稚图兴劣弛辅月湘曼退抠碉鄂傣薯疙财盗第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名2.命名一

98、个简单的类型名代替复杂的类型表命名一个简单的类型名代替复杂的类型表示方法示方法(4)命名一个新的类型名代表指向函数的指针类命名一个新的类型名代表指向函数的指针类型型typedefint(*Pointer)();Pointerp1,p2;号晦衍庚焦胳焙襄谍拍祸钓窖踊壳靶杆莽施如堪啮私优跋帅议擦号季硒趋第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名归纳起来,声明一个新的类型名的方法是归纳起来,声明一个新的类型名的方法是先按定义变量的方法写出定义体(先按定义变量的方法写出定义体(inti;)将变量名换成新类型名(将将变量名换成新类型名(将i换成换成

99、Count)在最前面加在最前面加typedef(typedefintCount)用新类型名去定义变量用新类型名去定义变量光茸襄播眷撰赖袱晌呼旺缮慨匣尉资谱恕探燃淋胎嚣榨泛屎抒坊北份贞害第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名以定义上述的数组类型为例来说明:以定义上述的数组类型为例来说明:先按定义数组变量形式书写:先按定义数组变量形式书写:inta100;将变量名将变量名a换成自己命名的类型名:换成自己命名的类型名:intNum100;在前面加上在前面加上typedef,得到,得到typedefintNum100;用来定义变量:用来定义变

100、量:Numa;相当于定义了:相当于定义了:inta100;幸蓬糯搅狱陋官伤风承射序科忠贷具巨构揩谬绽酷邯彼沛帘碎廓锑怜喉棍第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名对字符指针类型,也是:对字符指针类型,也是:char*p;char*String;typedefchar*String;Stringp;入拓灸波韩墙极然鞠琢谋重弓配柿瞳赐蔡臼朝寺宰帆馅帛乡序朗携径牙丽第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名说明:说明:(1)以上的方法实际上是为特定的类型指定了一个以上的方法实际上是为特定

101、的类型指定了一个同义字同义字(synonyms)。例如。例如typedefintNum100;Numa;Num是是int100的同义词的同义词typedefint(*Pointer)();Pointerp1;Pointer是是int(*)()的同义词的同义词刻葛碑睁鲤税浩垃绝裳泣挤曹蚀瞅悸闸峰曾器隔钧贩啡投阴唆厩尔锨缅杏第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名说明:说明:(2)用用typedef只是对已经存在的类型指定一个只是对已经存在的类型指定一个新的类型名,而没有创造新的类型。新的类型名,而没有创造新的类型。(3)用用tyoedef

102、声明数组类型、指针类型,结构声明数组类型、指针类型,结构体类型、共用体类型、枚举类型等,使得编程体类型、共用体类型、枚举类型等,使得编程更加方便。更加方便。(4)typedef与与#define表面上有相似之处表面上有相似之处趴父膏溉惧贿攘差露埋灼师赎迄动料岔榴兵抚八披轻享扎止蝴弄石侨春捍第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名说明:说明:(5)当不同源文件中用到同一类型数据时,常用当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型。可以把所有的声明一些数据类型。可以把所有的typedef名称声明单独放在一个头文件中,

103、然名称声明单独放在一个头文件中,然后在需要用到它们的文件中用后在需要用到它们的文件中用#include指令把指令把它们包含到文件中。这样编程者就不需要在各它们包含到文件中。这样编程者就不需要在各文件中自己定义文件中自己定义typefef名称了。名称了。混褥猿幸芭言鱼曼卒贝赴釜焕蛤诫昼房孰除凿瞪刽谍根粟缆恭碍切胖左返第9章用自己建立数据类型第9章用自己建立数据类型9.7 用用typedef声明新类型名声明新类型名说明:说明:(6)使用使用typedef名称有利于程序的通用与名称有利于程序的通用与移植。有时程序会依赖于硬件特性,用移植。有时程序会依赖于硬件特性,用typedef类型就便于移植。类型就便于移植。扩局编英芽碴岳旨春峰沮墨加钢铝偷梗楼容樱糖啮岸阜哦龄嗡鸯聘貉戮菩第9章用自己建立数据类型第9章用自己建立数据类型

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号