第8章 枚举型和构造体 目的与要求8.1 枚举类型的定义及运用8.2 构造体的定义及运用8.3 链表本章小结目的与要求 经过本章学习,应了解枚举型与构造体两种导出数据类型的概念,掌握枚举型与构造体两种数据类型的定义格式与方法,会用枚举型与构造体数据类型定义枚举型变量与构造体变量会用构造体与枚举型处理实践问题了解链表的概念,初步学会链表的简单操作,如:链表的建立、添加、删除、查询等方法 8.1 枚举类型的定义及运用 枚举类型:是某类数据能够取值的集合; 枚举变量:用枚举类型定义的变量 8.1.1 枚举类型的定义1.枚举类型的定义格式 enum <枚举类型名> { <枚举元素表> }; 例如: enum weekdays { Sun,Mon,Tue,Wed,Thu,Fri,Sat }; 2.枚举类型元素的序号 枚举类型元素序号:是元素对应的整型常量值 〔1〕默许序号值 假设枚举类型定义中没有指定元素的序号值,那么默许序号值从0开场依次递增〔2〕指定序号值 ①全指定,所谓全指定是给枚举类型的每一个元素指定一个序号值。
例如: enum boolean { TRUE=1 ,FALSE=0 }; ②部分指定,所谓部分指定是给枚举类型的部分元素指定序号值 例如: enum colors {red=5,blue=1,green,black,white,yellow}; 8.1.2 枚举类型变量的定义1.先定义类型后定义变量格式: <枚举类型名> <变量1>〔,<变量2>,…,<变量n>〕;例如: enum weekdays { Sun,Mon,Tue,Wed,Thu,Fri,Sat }; weekdays day1,day2;2.定义类型的同时定义变量格式:enum <枚举类型名> { <枚举元素表> } <变量1>〔,<变量2>,…,<变量n>〕;例如: enum weekdays { Sun,Mon,Tue,Wed,Thu,Fri,Sat } day1,day2;枚举类型变量的定义3.直接定义枚举变量格式:enum { <枚举元素表> } <变量1>〔,<变量2>,…,<变量n>〕;例如: enum { Sun,Mon,Tue,Wed,Thu,Fri,Sat } day1=Sun,day2=Mon; 定义枚举变量时,可对变量进展初始化赋值。
8.1.3 枚举类型变量的援用 1.1.赋值运算运算 枚枚举类型的元素可直接型的元素可直接赋给枚枚举变量,且同量,且同类型枚型枚举变量之量之间可以相互可以相互赋值 即:即:〔〔1 1〕枚〕枚举变量量= =枚枚举元素;元素; 如,如,day1=Sun;day1=Sun;〔〔2 2〕枚〕枚举变量量1=1=枚枚举变量量2 2;; 如,如,day2=day1;day2=day1;2.2.枚枚举变量的量的输入入输出出〔〔1 1〕不能用〕不能用键盘经过“cin>>“cin>>〞向枚〞向枚举变量量输入元素入元素值〔〔2 2〕可用〕可用“cout<<“cout<<〞〞输出枚出枚举变量,量,但但输出的是元素出的是元素对应的序号的序号值,而不,而不是元素是元素值枚举类型变量的关系运算3.关系运算 枚举变量可与元素常量进展关系比较运算,同类枚举变量之间也可以进展关系比较运算,但枚举变量之间的关系运算比较是对其序号值进展的例如: day1=Sun; //day1中元素Sun的序号值为0 day2=Mon;//day2中 元 素 Mon的序号值为1 if (day2>day1) day2=day1; //day2>day1的比较就是序号值关系式:1>0的比较 if (day1>Sat) da1=Sat; //day1>Sat的比较就是序号值关系式:0>6的比较枚举型举例 【例8.1】先定义描画6种颜色的枚举类型colors,然后再用该枚举类型定义枚举数组,恣意输入6个颜色号,转换成对应的颜色枚举量后输入到枚举数组中,最后输出枚举数组中对应的颜色。
例程 【例8.2】定义一个描画三种颜色的枚举类型{red、blue、green},输出这三种颜色的全部陈列结果例程8.2 构造体的定义及运用 nonamemathphiengave1001Zhou908580851002Li758085801003Wang95859090 学生成果情况表 学生成果信息必需用不同数据类型的数据项来描画的情况,如: 学号:no ---int 姓名:name ---char[8] 成果:eng、phi、math、ave ---float 8.2.1 构造体的概念 构造体的概念 构造体:将不同类型数据作为一个整体来处置的数据构造称为构造体 构造体类型:是导出型数据类型,必需先定义构造体类型,后定义构造体变量 8.2.2 构造体类型的定义构造体类型的定义格式为: struct <构造体类型名> { <类型> <成员1>; <类型> <成员2>; … <类型> <成员n>; };阐明:〔1〕关键词struct阐明定义的是构造体类型;〔2〕构造体类型名必需符合标识符命名规那么;〔3〕构造体由假设干个数据成员组成,每个数据成员可以有不同的数据类型。
数据类型可以是根本类型,也可以是导出类型构造体类型的定义举例【例8.3】定义一个学生成果的构造体数据类型如下: struct student { int no ; //学号 char name[8]; //姓名 float eng,phy,math,ave ; //英语、物理、数学与平均成果 };8.2.3 构造体变量的定义1.构造变量的定义〔1〕先定义类型后定义变量格式: 〔存储类型〕<构造体类型名> <变量名1> 〔,<变量名2>,…,<变量名n>〕;例如: student stu1,stu2[3];〔2〕定义构造体的同时定义构造体变量 格式: struct <构造体类型名> { <成员列表>} <变量名1>〔,<变量名2>…〕;构造体变量的定义例如:struct student { int no ; char name[8]; float eng,phy,math,ave ; } stu1,stu2[3]; 〔3〕直接定义构造体变量 struct { <成员列表>} <变量名1>〔,<变量名2>…〕;例如: struct { int no ; char name[8]; float eng,phy,math,ave ; } stu1,stu2[3]; 2.构造体变量的初始化 定义构造体变量时可进展初始化。
构造体变量的初始化格式: <构造体类型> <构造变量>={初始化值}; 例如: student stu1={1001, "Zhou",90,85,80}; student stu2[3]={ {1001, "Zhou",90,85,80}, {1001, "Li",75,80,85}, {1001, "Wang",95,85,90}}; 8.2.4 构造体变量的援用1.构造体变量数据成员的援用格式 <构造体变量>.<成员名> 其中“.〞称为成员运算符 例如:: stu1.no 表示援用学生构造体变量stu1中的数据成员no stu2[0].no 表示援用学生构造体数组元素stu2[0]的数据成员no2.构造体变量数据成员的输入/输出 C++规定,用cin、cout只能对数据成员进展输入输出,不能对构造体变量输入输出。
输入输出格式如下 〔1〕输入: cin>> <构造体变量>.<成员名>; 例如: cin>>stu1.no>>stu1.name>>stu1.eng>>stu1.phi>>stu1.math;〔2〕输出: cout<<<构造体变量>.<成员名>;例如:cout<>stu1;与cout<
例程8.2.5 构造体变量与数组作为函数参数(习题课)1.函数定义格式〔1〕构造体变量作为函数参数 <类型><函数名>( <构造体类型> <变量>,…) {函数体}〔2〕构造体数组作为函数参数 <类型><函数名>( <构造体类型> <数组名[长度]>,…) {函数体}构造体变量与数组作为函数参数2.函数调用格式〔1〕构造体变量作为实参: 函数名(构造体变量名, …)〔2〕构造体数组作为实参: 函数名(构造体数组名, …)3.参数的传送方式 用构造体变量作为函数参数时,实参值传送给形参属于值传送,因此,函数调用后实参值仍坚持不变 用构造体数组作为函数参数时,实参值传送给形参属于传地址,因此,函数调用后实参数组值随形参数组而变动构造体变量与数组作为函数参数举例 【例8.5】定义全班学生学习成果的构造体数组,学生构造体类型的数据成员为:姓名、学号、英语、物理、数学和这三门功课的平均成果〔经过计算得到〕设计四个函数:全班成果输入,求出每个学生的平均成果,按平均成果的升序排序,输出全班成果表。
在主函数调用这四函数完成学生成果的输入、计算、排序与输出任务 【例8.6】建立学生档案的构造体数组,描画一个学生的信息:姓名、性别、年龄、出生日期输出已建立的学生档案 【例8.7】定义一个复数构造体,以复数的实部r、虚部i作为构造体成员,编写能实现两复数加法的函数,用构造体变量作为其形参在主函数内定义两个复数,并赋初值调用复数加法函数,完成两复数相加的操作例程例程例程8.3 链表 8.3.1链表的概念 1.链表的概念 链表是由假设干同类型结点用指针链接而成的数据构造链表由表头、结点与链尾三部组成链表的概念〔1〕表头head是指向链表的头指针;〔2〕结点是用含有指针的构造体类型node定义的构造体变量 如描画学生信息结点类型node可定义为: struct node { int no; char name[8]; float eng,phy,math,ave; node *next; }; 〔3〕链尾是链表中指针值为0的结点,用于表示链表的终了类似于字符串中以0作为终了标志2.链表的根本操作 链表的主要操作有链表的建立、查询、输出、插入、删除等。
为方便后面的讨论,将结点内数据成员简化为学号、成果与指针三项,简化后的链表结点类型node定义为: struct node { int no; int score; node *next; };8.3.2 链表的根本操作 链表的主要操作有建立链表、输出链表、删除链表、查询指定结点、删除指定结点、插入结点、建立有序链表等 链表的根本操作可以用自定义函数来实现: 〔1〕建立链表函数 node * Create(void) 〔2〕输出链表函数 void Print(node *head) 〔3〕删除链表 函数 void Delchain(node *head) 〔4〕删除指定结点函数 node * Delete(node *head, int no) 〔5〕插入结点函数 node * Insert(node *head,node *pn) 〔6〕建立有序链表函数 node * Create_order() 在主函数中调 用上述函数,可完成建立链表、输出链表、删除链表、删除结点、插入结点、建立有序链表等操作。
1.建立无序链表函数Create( ) 建立无序链的步骤为:〔1〕先定义三个node类型的指针变量: node *head ,*pn,*pt; 〔2〕新建结点,输入学号和成果用new运算符动态分配新结点空间,将pn指向该新结点,给新结点输入学号和成果 〔3〕将新结点参与到链尾,新结点参与到链尾有链表为空与非空二种情况: ①链表为空 ②链表非空 ①链表为空时参与新结点 ②链表非空时插入新结点建立无序链表函数〔4〕反复〔2〕、〔3〕两步,经过循环不断向链表添加新结点直到学号为“-1〞为止〔5〕将链尾结点指针赋0〔6〕前往链表头指针head 例程2.输出链表函数Print( )例程 输出链表中各结点成果运用函数void Print(void)实现建立输出链表函数的步骤如下〔1〕函数必需用形参node *head接纳来自主函数的链表头指针head〔2〕定义指针变量node *p=head;将p指向链表首结点〔3〕用循环语句依次输出每个结点的学号与成果,直到链尾〔p=0〕为止 3.删除链表函数Delchain( )例程删除链表是指删除链表全部结点,并回收结点所占用的全部内存空间。
删除链表用函数Delchain( node *head)实现,主要操作步骤如下〔1〕用形参node *head接受来自于主函数的链表头指针;〔2〕定义指针变量node *p=head;并使指针变量p 指向链首,如下图;〔3〕用循环语句依次删除链表的各结点 前往4.删除链表上指定结点函数Delete( ) 删除链表上指定值结点用函数Delete (node *head, int no)实现函数形参应有两个,第一个为链表头指针head,第二个为要删除结点的学生学号no 要删除链表上指定学号的结点,首先要找到要删除的结点,然后才干删除该结点 删除结点能够会遇到三种情况: 〔1〕假设链表为空,即head为0,那么前往空指针 〔2〕假设要删除的结点为链表首结点,那么将该结点的指针值赋给链表头指针head,然后删除该结点即可如前页图所示删除链表上指定结点〔3〕要删除的结点不是链表首结点 定义指针变量pc、pa分别指向当前正查找的结点与其后一个结点图示 用以下循环语句找到要删除结点 while (pc->no!=no) {pa=pc;pc=pc->next;} 查找后有两种情况: ①链表中无要删除的结点,那么输出无此结点的信息。
②链表中有要删除的结点,如要删除结点学号为“1002〞 图示例程查找指定结点前往删除指定结点前往5.插入结点函数Insert( ) 链表各结点按成果score降序陈列,插入结点后,仍要求按成果score降序陈列 在插入函数Insert(node * head, node *pn)的形参中,head为头指针,pn为指向插入结点的指针在插入函数体中:pc为指向插入点前一个结点的指针,pa为指向插入点后一个结点的指针 插入结点有两种情况: 〔1〕链表为空 将新结点插入到链表首,并将尾指针赋0实现语句为: if (head==NULL) {head=pn; pn->next=0;} 图示插入结点〔续〕〔2〕链表非空 首先判别新结点的成果能否大于或等于链表首结点的成果,假设大于或等于首结点成果,那么将新结点插入到链首位置,假设小于首结点成果,那么要根据新结点的成果,将指针变量pc挪动到插入点前,指针变量pa挪动到插入点后实现语句为: while ( pc->next!=0 &&(pn->score<=pc->score)) { pa=pc; pc=pc->next; }图示插入结点〔续〕 当pc与pa移到插入点位置处时,又有两种情况: ①新结点插入到链尾 当新结点成果最小时,按降序陈列该结点应插入到链表尾。
插入到链表尾的条件是新结点成果小于链表尾结点成果,即:pn->scorescore实现语句为: if (pn->score <= pc->score) { pc->next=pn; pn->next=0; }插入结点〔续〕②新结点插入到链表中间 除上面所述情况外,新结点应插入链表中间,实现语句为: pn->next=pc; pa->next=pn; 第一条语句使新结点指向pc所指结点,第二条语句使pa所指结点指向新结点,从而实现将新结点插入到pc与pa所指两结点之间 图示例程插入结点前往6.建立有序链表函数Create_Order( ) 向一个空链表中不断地插入新建立的结点,并使新结点按序陈列,就产生一条有序链 建立一条有序链表的过程可分为两步:首先建立一个新结点,其次将新结点插入到链表中 例程 7.完成链表处置的主程序# include # include struct node{ char no; int score; node *next;};node * Create(void ) //建立无序链表的函数{…} void Print(const node *head)//输出链表的函数{…}void Delchain(node * head)//删除整个链表的函数{…}node * Delete( node *head, int no)//删除指定结点的函数{…}node * Insert(node * head, node *pn)//插入结点的函数{…}node *Create_Order( void)//建立有序链表的函数{…}完成链表处置的主程序 void main(void)//主函数{ node * head; int no; head=Create(); //产生无序链表 Print(head); //输出无序链表 cout<<“输入要删除结点上学生学号:\n"; cin >>no; //输入要删除结点的学生学号 head=Delete(head,no); //删除指定学号的结点 Print(head); //输出显示删除后的链表。
Delchain(head); //删除整个链表 head=Create_sort(); //产生一个有序链表 Print (head); //输出显示有序链表 Delchain(head); //删除整个链表 } 本章小结 1.枚枚举型型 枚枚举型型是是某某种种数数据据能能够取取值的的集集合合,,定定义格式格式为:: enum <枚枚举类型型名名> { <枚枚举元元素素表表> };①① 枚枚举元元素素表表中中的的各各元元素素为数数据据能能够取取值的的集合;集合;②② 每元素均有一个序号每元素均有一个序号值与之与之对应③③ 用枚用枚举类型可定型可定义枚枚举变量或枚量或枚举数数组④④ 枚枚举变量可量可进展展赋值运算与比运算与比较运算⑤⑤ 不不能能用用cin输入入枚枚举元元素素值或或序序号号值,,只只能能用用赋值运运算算符符将将枚枚举元元素素值赋给枚枚举变量量用用cout可可以以输出出枚枚举变量量,,但但输出出的的是是其其序号而不是元素序号而不是元素值⑥⑥枚枚举变量量可可进展展比比较运运算算,,枚枚举变量量之之间的比的比较运算是运算是对其序号其序号进展的。
展的 2.构造体 构造体是由假设干数据成员组成的导出数据类型,其定义格式为: struct <构造体类型名> { <类型> 成员1; … <类型> 成员n; }; ① 构造体中成员的数据类型可以是根本类型,也可以是导出类型 ② 用构造体数据类型可定义构造体变量或构造体数组 ③ 数据成员的援用格式为:构造体变量名.成员名 ④不能对构造体变量直接进展输入、输出,只能对构造体变量的数据成员进展输入、输出 3.链表的根本操作 链表由假设干个构造类型的结点用指针链接而成,每个结点由数据与指针两部分组成,其中指针用于链接下一个结点 链表的首结点地址存放在头指针中,尾结点指针必需为0 链表的主要操作有链表的建立、插入、删除、输出等 建立和删除链表的主要操作 〔1〕建立无序链表的主要操作 先用new动态分配一个结点空间,并用指针变量pn指向新结点,输入数据到结点内,然后将新结点参与到链尾,依次循环直到输入终了标志为止 假设用pt指向链尾结点,那么将新结点加到链尾的主要操作是: pt->next=pn; //新结点参与到链尾 pt=pn; //使pt指向新的链尾〔2〕删除整个链表的主要操作 先用指针变量p指向链表首结点〔p=head〕,再将首结点从链表分别出来(head=p->next),最后删除首结点(delete p),依次循环直到删完(head==0)为止。
删除指定结点的主要操作〔3〕删除指定结点的主要操作 先用循环语句找到要删除的结点,如: while (pc->no!=no) {pa=pc;pc=pc->next;} 用pc指向要删除的结点,pa指向删除结点的后一个结点,只需执行下面两条语句: pa->next=pc->next; //要删除结点前一个结点的地址赋给其后一个结点的指针 delete pc; //动态回收结点占用空间 那么指定结点被删除 插入结点的主要操作〔4〕插入结点的主要操作 先用循环语句找到插入点的位置,用pc指向插入点前一个结点,pa指向插入点后一个结点,用pn指向新结点,只需执行下面两条语句: pn->next=pc; //将插入点前一个结点的地址赋给新结点的指针 pa->next=pn; //将新结点的地址赋给插入点后一个结点的指针 那么新结点被插入到指定位置 例8.1〔1〕# include # include //运用exit(0)函数时必需包含stdlib.h头文件enum colors //定义有6种颜色元素的枚举类型colors{ red, blue,green,black,white,yellow };void main( void){ colors color[6]; //定义枚举类型数组 int j,n; cout<<"0:red,1:blue,2:green,3:black,4:white,5:yellow"<> n; //输入颜色号 if (n<0 || n>5 ) { cout << "输入颜色值出错,请重新输入!"; exit(0); } else switch(n) //将颜色号转换成元素存入数组 { case 0 : color[j]=red; break; case 1 : color[j]=blue; break; case 2 : color[j]=green ; break; case 3 : color[j]=black; break; case 4 : color[j]=white; break; case 5 : color[j]=yellow; break; } }例8.1〔3〕for (j=0 ;j<6;j++) //循环6次,输出数组元素对应的颜色 { switch (color[j]) { case red : cout <<"red" ; break; case blue: cout<<"blue" ; break; case green : cout <<"green" ; break; case black : cout<<"black" ; break; case white : cout <<"white" ; break; case yellow :cout <<"yellow" ; break; } cout<<'\t'; } cout<<'\n';}前往例8.2〔1〕# include enum colors{red , blue,green};void show(colors color){ switch(color) { case red : cout<<"red";break; case blue : cout<<"blue";break; case green : cout<<"green";break; } cout<<'\t';}例8.2〔2〕void main(void){ colors col1,col2,col3; for(col1=red ;col1<=green;col1=colors(int (col1) +1)) for(col2=red ;col2<=green;col2=colors(int (col2) +1)) for(col3=red ;col3<=green;col3=colors(int (col3) +1)) { show(col1); show(col2); show(col3); cout<<'\n'; } }前往例8.4〔1〕# include # define N 3struct student //定义学生成果构造体类型{ int no; char name[8]; float eng,phy,math,ave;};void main (void){ student s[3]; //定义构造体数组 cout <<"输入 学号、姓名、英语、物理、数学成果:"<> s[i].no >>s[i].name>>s[i].eng>>s[i].phy>>s[i].math; 例8.4〔2〕for (i=0;istruct student //定义学生成果构造体类型{ int no; char name[8]; float eng,phy,math,ave;};void Input (student s[ ],int n) //输入函数{ int i; cout <<"输入学生:"<> s[i].no >>s[i].name>>s[i].eng>>s[i].phy>>s[i].math;} 例8.5〔2〕void Ave (student s[ ],int n) //求平均成果函数{ int i; for (i=0;is[j].ave ) k=j; if (k>i) {temp=s[k];s[k]=s[i];s[i]=temp;}}}例8.5〔3〕void Print(student s[ ], int n) //输出函数{ int i; cout<< “学号〞 << ‘\t’ << “姓名〞 << ‘\t’ << “英语〞 << ‘\t' << "物理" << '\t' << "数学" << '\t'<< "平均成果" << '\n'; for (i=0;istruct date //定义出生日期构造体类型{ int year,month,day; //定义出生年、月、日 数据成员};struct student //定义学生档案构造体类型{ int no ; //学号 char name[10]; //姓名 char sex[2]; //性别 int age; //年龄 date birthday; //出生日期〔构造体类型〕};例8.6〔2〕void output( student x) //定义输出函数{ cout << x.no <<'\t'<struct Complex //定义一个复数构造体{ float r; //复数的实部 float i; //复数的虚部};Complex add(Complex c1,Complex c2) //复数加法函数{ Complex c; //定义复数构造体变量c c.r=c1.r+c2.r; //两复数实部相加赋给c的实部 c.i=c1.i+c2.i; //两复数虚部相加赋给c的虚部 return c; //前往相加后的复数c}例8.7〔2〕void main( void ){ Complex x1={10,25},x2={20,35},x; //定义三个复数x1、x2、x x=add (x1,x2); //调用复数加法函数 cout<<"x1="<
cout<<“产生链表,请输入学生学号与姓名,以-1为终了:"<>no; //输入学生学号 while (no!= -1) //成果为-1时终了输入 {//动态分配新结点内存空间,并将结点地址赋给pn pn= new node; pn->no=no; //将学生学号输入新结点cin>>pn->score ; //学生成果输入新结点if (head==0) //假设链表为空 { head=pn; //那么将新结点地址由pn赋给头指针head与尾指针pt pt=pn; //使新结点参与到链首 } else //否那么链表非空 { pt->next=pn; //将新结点地址由pn赋给链尾的next指针与尾指针pt pt=pn; //使新结点参与到链尾 } cin >>no; //输入学生成果 } pt->next=0; //链尾指针变量赋0 return (head); //前往链表的头指针 } 前往输出链表函数Print( ) void Print( node *head){ node *p=head; cout<<〞输出链表中各结点值:〞<no<<’\t’<score<next; }}前往删除链表函数Delchain( )void Delchain(node * head){ node * p; p=head;//链表头指针赋给p while (head) //当链表非空时删除结点 { head=p->next; //将链表下一个结点指针赋给head delete p; //删除链表第一个结点 p=head;//再将头指针赋给p }} 前往删除链表上指定结点函数Delete( ) (1)node * Delete( node *head, int no){ node *pc,*pa; pc=pa=head; //链表为空的情况 if (head==NULL) { cout << "链表为空,无结点可删!\t"; return NULL; }// 第一个结点为要删除结点的情况else if (pc->no==no) {//将第二个结点的地址赋给head //使首结点从链表中分别出来 head=pc->next; //删除首结点 delete pc; cout<<"删除了一个结点!\n"; }删除链表上指定结点函数Delete( ) (2) else//第一个结点不是要删除的结点 { while (pc->no!=no) //查找要删除的结点 { pa=pc; //当前结点地址由pc赋给pa pc=pc->next; //pc指向下一个结点 } if (pc==NULL) //假设pc为空表示链表中无要删除的结点 cout << "链表中没有要删除的结点!\n"; else { pa->next=pc->next; //将下结点地址赋给上结点指针, //使删除结点从链表分别出来 delete pc; //删除指定结点 cout<<"删除一个结点!\n"; } } return head; //前往链表头指针}前往插入结点函数Insert( ) (1)node * Insert(node * head, node *pn){ //定义指向插入点前、后的指针pc与panode *pc,*pa;//假设链表为空,那么新结点插入到链表首 pc=pa=head; if (head==0) { head=pn; pn->next=0; return head; }//假设新结点成果≥首结点成果那么新结点插在链首 if (pn->score>=head->score) { pn->next=head; head=pn; return head; }插入结点函数Insert( ) (2)//假设链表非空,那么按成果查找插入点while (pc->next!=0 && pn->score<=pc->score) { // pc、pa移到插入点前、后结点处 pa=pc; pc=pc->next; }//新结点插入到链尾if (pn->score <= pc->score) { pc->next=pn; pn->next=0; } else //新结点插入到链表中间 { pn->next=pc; pa->next=pn; } return head;//前往链表头指针}前往建立有序链表函数Creat_Order() 前往node *Create_Order( void){ node *pn,*head=0; //定义指向新结点的指针变量pn及链表头指针head int no; //定义输入学生成果的暂时变量score cout<<"产生一条有序链表,请输入学号,以-1终了!\n"; cin>>no; while (no!= -1) //学号不等于-1那么循环 { pn=new node; //动态分配node类型结点空间,并将其地址赋给pn pn->no=no; //给新结点输入学号与成果 cin>>pn->score; head=Insert(head,pn); //调用结点插入函数,将新结点按成果降序插入链表 cin>>no; //输入学号 } return head; //前往链表头指针}。