收藏 分销(赏)

第2章 结构体与链表.ppt

上传人:s4****5z 文档编号:12555394 上传时间:2025-10-29 格式:PPT 页数:147 大小:1.21MB 下载积分:10 金币
下载 相关 举报
第2章 结构体与链表.ppt_第1页
第1页 / 共147页
第2章 结构体与链表.ppt_第2页
第2页 / 共147页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,结构体,结构体声明,结构体变量定义,结构体成员使用方法,结构体与指针,结构体与数组,函数中结构体的使用,链表的各项基本操作,一、结构体的定义和使用,1,、为什么要用结构体,?,2,、结构体是一种数据类型,但其特定的含义需事先声明;,4.8,struct Employ /,结构名字为,Employ,char name20;/,姓名,long code;/,职工编号,;,/chx_1.cpp,3,、访问结构成员的方法;,4,、结构变量的整体赋值:,/,数组不能整体赋值!,不同类型的结构变量不能互相赋值,/,内存布局?,二、结构体与指针,1,、通过指向结构变量的指针来使用结构;,chx_1.cpp,2,、操作符:左边是结构指针变量,右边是成员;,三、结构体与数组,1,、结构数组:数组的每一个元素都是结构变量;,struct_array,.cpp,2,、结构数组的遍历,四、函数中的结构参数,1,、函数参数是结构体变量(结构体常量),值传递;,2,、函数参数是结构体的引用,引用传递;,3,、编程经验:优选 结构体的引用传递;,4,、函数返回结构:结构体变量 或 结构体变量的引用,参数传递过程导致不同方式效率不一样,补充,1,、结构体的嵌套,(,1,)结构体的成员可以是另一个结构体的变量:,(,2,)结构体的成员不能是本结构的变量:,(,3,)结构体的成员可以是本结构的指针变量:,qtjgt.cpp,五、链表的基本操作,7.2.1,1,、链表结构,2,、创建与建立链表,3,、删除链表中的一个结点,4,、插入一个结点到链表中,linkList.cpp,基本操作:插入、查找、删除,注意:处于 头结点 尾结点、中间结点,链表基本概念,结构数组-必须将数组的大小设定成足够大的值,太浪费,能否需要多少分配多少?,链表=动态内存分配+结构+指针,所有结构形成一条链,可以在任何地方插入或删除元素,链表是一种常见的重要的数据结构。,链表有一个,“,头指针,”,变量,图中以,head,表示,它存放一个地址。该地址指向一个元素。链表中的每一个元素称为,“,结点,”,,每个结点都应包括两个部分:一是用户需要用的,实际数据,,二是下一个结点的,地址,。,如何找到某一个结点?,单向链表,自引用结构,结构中包含指向同类型结构的指针,通过指针连接成链表,终点是,NULL,指针,(0),单向链表的定义,例子:,struct node,int data;,node*next;,;,next:,指向下一个,node,类型的结构,连接,node,的纽带,head,28,52,2,96,NULL,单向链表的定义,存放学生信息的链表节点,struct student,int num;,char name20;,char sex;,float score;,student*next;,;,动态申请内存的方法,student*p=new student;,单向链表的操作,建立单向链表,声明一个链首指针变量,head,,并赋初值,NULL(,包含0个节点的链表),动态分配一个新节点,将该节点链入链尾,重复上一步,例子1:建立链表,读入,n,个整数,每个整数作为一个新结点插入到链尾,#include,struct node,int data;,node*next;,;,node*createList(int n);,int main(),int n;,node*listHead=NULL;,cout n;,if(n 0),listHead=createList(n);,return 0;,例子1:建立链表,读入,n,个整数,每个整数作为一个新结点插入到链尾,node*createList(int n),node*temp,*tail=NULL,*head=NULL;,int num;,cin num;,head=new node;/,为新节点动态分配内存,if(head=NULL),cout data=num;,head-next=NULL;,tail=head;,for(int i=0;i num;,temp=new node;/,为新节点动态分配内存,if(temp=NULL),cout data=num;,temp-next=NULL;,tail-next=temp;,tail=temp;,return head;,例子1:建立链表,读入,n,个整数,每个整数作为一个新结点插入到链尾,建立链表的过程,tail,temp,head,NULL,初始状态,NULL,NULL,读入1后,tail,temp,head,1,NULL,建立链表过程,读入2后,tail,temp,head,1,2,NULL,读入3后,tail,temp,head,1,3,NULL,2,2025/10/29 周三,19,单向链表的操作,遍历链表,依次访问链表中的每个节点的信息,head-data=15;,head-next-data=15;,一般遍历方法,node*curNode=head;,while(curNode!=NULL),curNode=curNode-next;,2025/10/29 周三,20,例子2:编写一个函数,输出例1链表中各节点的,data,成员的值,void outputList(node*head),cout next!=NULL),cout ;,curNode=curNode-next;,cout data=n),coutFind n in the list.next;,coutCant find n in the list.nextaptr-next;,(3),把,c,的地址赋给节点,a,的后继指针,aptr-next=cptr;,例子4:编写一个函数,将输入的整数从小到大插入链表,node*insertData(int n,node*head),node*curNode=head;/,指向插入点的后节点,node*preNode=NULL;/,指向插入点的前节点,node*newNode=NULL;/,指向新建节点,while(curNode!=NULL)&(curNode-datanext;,newNode=new node;,if(newNode=NULL),cout data=n;,if(preNode=NULL)/,插入到链表头,newNode-next=curNode;,return newNode;,else,preNode-next=newNode;,newNode-next=curNode;,return head;,单向链表的操作,-,删除,从链表中删除一个节点,c,(1)在链表中查找要删除的节点,c,,用指针,cptr,指向节点,c;,(2),如果,c,有前驱节点(设为,d,用指针,dptr,指向,d),,则将,d,的后继指针指向,c,的后继节点:,dptr-next=cptr-next,(3),释放,c,占用的空间,2025/10/29 周三,26,例子5:编写一个函数,删除链表中包含指定整数的节点,node*deleteData(int n,node*head),node*curNode=head;/,指向当前节点,node*preNode=NULL;/,指向当前节点的前驱节点,while(curNode&curNode-data!=n),preNode=curNode;/,当前节点变为前驱节点,curNode=curNode-next;,if(curNode=NULL),coutCant find n in the listnext;,else,preNode-next=curNode-next;,delete curNode;,return head;/,返回链首指针,作业,一元多项式相加,一元多项式,p(x)=p,0,+p,1,x+p,2,x,2,+,+p,n,x,n,,由,n+1,个系数唯一确定,。则在计算机中可,用线性表,(p,0,,,p,1,,,p,2,,,,,p,n,),表示,。既然是,线性表,,就可以用顺序表和链表来实现。两种不同实现方式的元素类型定义如下:,链式存储表示的类型,struct ploy,float coef;/*,系数部分*,/,int expn;/*,指数部分*,/,struct ploy *next;,;,双向链表,单向链表:有利于从链首向链尾遍历,有些时候双向遍历是需要的,双向链表,2025/10/29 周三,29,双向链表的定义,定义双向链表的节点:,struct node,int data;,node*next;,/,指向后续节点,node*pre;,/,指向前面的节点,;,2025/10/29 周三,30,双向链表的定义,双向链表的例子:,双向链表一般也由头指针唯一确定,双向链表首尾相接可以构成双向循环链表,head,28,NULL,52,2,96,NULL,2025/10/29 周三,31,双向链表的操作,建立双向链表,新节点链入链尾,原链尾节点的后继指针指向新节点,新节点的前驱指针指向原链尾节点,新链尾节点的后继指针置为空指针,将新节点链入链头,原链头节点的前驱指针指向新节点,新节点的后继指针指向原链头节点,新链头节点的前驱指针置为空指针,2025/10/29 周三,32,例子6:编写一个函数,按数据输入的顺序建立双向链表,node*createBidirList(int n),node *temp,*tail=NULL,*head=NULL;,int num;,cin num;,head=new node;/,为新节点动态分配内存,if(head=NULL),cout data=num;,head-next=NULL;,head-pre=NULL;,tail=head;,2025/10/29 周三,33,例子6:编写一个函数,按数据输入的顺序建立双向链表,for(int i=0;i num;,temp=new node;/,为新节点动态分配内存,if(temp=NULL),cout data=num;,temp-next=NULL;,temp-pre=tail;,tail-next=temp;,tail=temp;,return head;,2025/10/29 周三,34,双向链表的操作,双向链表的遍历,有链首节点,则可以沿着后继指针从头至尾遍历,有链尾节点,则可以沿着前驱指针从尾向头遍历,2025/10/29 周三,35,例子7:编写一个函数,输出双向链表中各节点的,data,成员的值,void outputBidirList(node*head),cout pre),cout next),cout ;,curNode=curNode-next;,cout data next;,newNode=new node;/,为新节点动态分配内存,if(newNode=NULL)/,内存分配不成功,cout data=n;,if(preNode=NULL),/,链头,newNode-next=curNode;,newNode-pre=NULL;,if(curNode!=NULL),curNode-pre=newNode;,return newNode;,if(curNode=NULL)/,链尾,newNode-pre=preNode;,preNode-next=newNode;,newNode-next=NULL;,return head;,2025/10/29 周三,39,例子8:编写函数,将整数,n,插入到一个已排序的双向链表中(从小到大),else,/,链中,preNode-next=newNode;,newNode-next=curNode;,newNode-pre=preNode;,curNode-pre=newNode;,return head;,2025/10/29 周三,40,例子9:编写函数,在双向链表中查找并删除指定,node*deleteData(int n,node*head),node*curNode=head;/,指向当前节点,while(curNode&curNode-data!=n),curNode=curNode-next;,if(curNode=NULL),coutCant find n pre=NULL),head=head-next;,head-pre=NULL;,else,curNode-pre-next=curNode-next;,if(curNode-next!=NULL),curNode-next-pre=curNode-pre;,delete curNode;,return head;/,返回链首指针,自定义数据类型,结构体,联合,枚举,typedef,有时需要将不同类型的数据组合成一个有机的整体,以供用户方便地使用。这些组合在一个整体中的数据是互相联系的。例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,都是这个学生的属性。见图,2.1,。,2,结构体类型,2.1.1,结构体概述,在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。和,C+,允许用户自己指定这样一种数据类型,它称为结构体。,它相当于其他高级语言中的记录(,record)。,例如,可以通过下面的声明来建立如图,2.1,所示的数据类型。,struct Student /,声明一个结构体类型,Student,int num;/,包括一个整型变量,num,char name20;/,包括一个字符数组,name,,可以容纳20个字符,char sex;/,包括一个字符变量,sex,int age;/,包括一个整型变量,age,float score;/,包括一个单精度型变量,char addr30;/,包括一个字符数组,addr,,可以容纳30个字符,;/最后有一个分号,这样,程序设计者就声明了一个新的结构体类型,Student(struct,是声明结构体类型时所必须使用的,关键字,,,不能省略,),它向编译系统声明:这是一种结构体类型,它包括,num,name,sex,age,score,addr,等不同类型的数据项。应当说明,Student,是一个类型名,它和系统提供的标准类型(如,int、char、float、double,等)一样,都可以用来定义变量,只不过结构体类型需要事先由用户自己声明而已。,声明一个结构体类型的一般形式为,struct,结构体类型名,成员表列;,结构体类型名用来作结构体类型的标志。上面的声明中,Student,就是结构体类型名。大括号内是该结构体中的全部成员(,member),,由它们组成一个特定的结构体。上例中的,num,name,sex,score,等都是结构体中的成员。在声明一个结构体类型时必须对各成员都进行类型声明,即,类型名 成员名;,每一个成员也称为结构体中的一个域(,field)。,成员表列又称为域表。成员名的定名规则与变量名的定名规则相同。,声明结构体类型的位置一般在文件的开头,在所有函数(包括,main,函数)之前,以便本文件中所有的函数都能利用它来定义变量。当然也可以在函数中声明结构体类型。,在,C,语言中,结构体的成员只能是数据(如上面例子中所表示的那样)。,C+,对此加以扩充,结构体的成员既可以包括数据(即数据成员),又可以包括函数(即函数成员),以适应面向对象的程序设计。但是由于,C+,提供了类(,class),类型,一般情况下,不必使用带函数的结构体,因此在本章中只介绍只含数据成员的结构体,有关包含函数成员的结构体将在介绍类类型时一并介绍。,前面只是指定了一种结构体类型,它相当于一个模型,但其中并无具体数据,系统也不为之分配实际的内存单元。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。,1.定义结构体类型变量的方法,可以采取以下3种方法定义结构体类型的变量。,(1)先声明结构体类型再定义变量名,如上面已定义了一个结构体类型,Student,,可以用它来定义结构体变量。如,Student student1,student2;,2.1.2,结构体类型变量的定义方法及其初始化,以上定义了,student1,和,student2,为结构体类型,Student,的变量,即它们具有,Student,类型的结构。如图,2.2,所示。,图,2.2,在定义了结构体变量后,系统会为之分配内存单元。例如,student1,和,student2,在内存中各占63个字节(4+20+1+4+4+30=63)。,(2)在声明类型的同时定义变量,例如:,struct Student /,声明结构体类型,Student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,student1,student2;/,定义两个结构体类型,Student,的变量,student1,student2,这种形式的定义的一般形式为,struct,结构体名,成员表列,变量名表列;,(3)直接定义结构体类型变量,其一般形式为,struct /,注意没有结构体类型名,成员表列,变量名表列;,这种方法虽然合法,但很少使用。提倡先定义类型后定义变量的第(1)种方法。在程序比较简单,结构体类型只在本文件中使用的情况下,也可以用第(2)种方法。,关于结构体类型,有几点要说明:,(1)不要误认为凡是结构体类型都有相同的结构。实际上,每一种结构体类型都有自己的结构,可以定义出许多种具体的结构体类型。,(2)类型与变量是不同的概念,不要混淆。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。在编译时,是不会为类型分配空间的,只为变量分配空间。,(3)对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。关于对成员的引用方法见,2.3,节。,(4)成员也可以是一个结构体变量。,如,struct Date /,声明一个结构体类型,Date,int month;,int day;,int year;,;,struct Student /,声明一个结构体类型,Student,int num;,char name20;,char sex;,int age;,Date birthday;/Date,是结构体类型,,birthday,是,Date,类型的成员,char addr30;,student1,student2;/,定义,student1,和,student2,为结构体类型,Student,的变量,Student,的结构见图,2.3,所示。,图,2.3,(5)结构体中的成员名可以与程序中的变量名相同,但二者没有关系。例如,程序中可以另定义一个整型变量,num,它与,student,中的,num,是两回事,互不影响。,2.结构体变量的初始化,和其他类型变量一样,对结构体变量可以在定义时指定初始值。如,struct Student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,student1=10001,Zhang Xin,M,19,90.5,Shanghai;,这样,变量,student1,中的数据如图,2.2,中所示。,也可以采取声明类型与定义变量分开的形式,在定义变量时进行初始化:,Student student2=10002,Wang Li,F,20,98,Beijing;,/Student,是已声明的结构体类型,在定义了结构体变量以后,当然可以引用这个变量。,(1)可以将一个结构体变量的值赋给另一个具有相同结构的结构体变量。如上面的,student1,和,student2,都是,student,类型的变量,可以这样赋值:,student1=student2;,(2),可以引用一个结构体变量中的一个成员的值。例如,,student1.num,表示结构体变量,student1,中的成员的值,如果,student1,的值如图,2.2,所示,则,student1.num,的值为10001。,引用结构体变量中成员的一般方式为,结构体变量名.成员名,2.1.3,结构体变量的引用,例如可以这样对变量的成员赋值:,student1.num=10010;,(3),如果成员本身也是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。例如,对上面定义的结构体变量,student1,可以这样访问各成员:,student1.num (,引用结构体变量,student1,中的,num,成员),如果想引用,student1,变量中的,birthday,成员中的,month,成员,不能写成,student1.month,,必须逐级引用,即,student1.birthday.month (,引用结构体变量,student1,中的,birthday,成员中的,month,成员),(4)不能将一个结构体变量作为一个整体进行输入和输出。例如,已定义,student1,和,student2,为结构体变量,并且它们已有值。不能企图这样输出结构体变量中的各成员的值:,coutstudent1;,只能对结构体变量中的各个成员分别进行输入和输出。,(5)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算种类)。例如,student2.scorestudent1.score;,sumstudent1.scorestudent2.score;,student1.age+;,+student1.age;,由于“.”运算符的优先级最高,因此,student1.age+,相当于(,student1.age)+。+,是对,student1.age,进行自加运算,而不是先对,age,进行自加运算。,(6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。如,cout /,输出,student1,的首地址,cout /,输出,student1.age,的地址,结构体变量的地址主要用作函数参数,将结构体变量的地址传递给形参。,例,2.1,引用结构体变量中的成员。,#,include,using namespace std;,struct Date /,声明结构体类型,Date,int month;,int day;,int year;,;,struct Student /,声明结构体类型,Student,int num;,char name20;,char sex;,Date birthday;/,声明,birthday,为,Date,类型的成员,float score;,student1,student2=10002,Wang Li,f,5,23,1982,89.5;,/,定义,Student,类型的变量,student1,student2,,并对,student2,初始化,int main(),student1=student2;/,将,student2,各成员的值赋予,student1,的相应成员,coutstudent1.numendl;/,输出,student1,中的,num,成员的值,coutstudent1.nameendl;/,输出,student1,中的,name,成员的值,coutstudent1.sexendl;/,输出,student1,中的,sex,成员的值,coutstudent1.birthday.month/student1.birthday.day/,student1.birthday.yearendl;/,输出,student1,中的,birthday,各成员的值,coutstudent1.scoreendl;,return 0;,运行结果如下:,10002,Wang Li,f,5/23/1982,89.5,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组的不同之处在于:每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。,2.1.4,结构体数组,1.定义结构体数组,和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可。如,struct Student /,声明结构体类型,Student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,Student stu3;/,定义,Student,类型的数组,stu,也可以直接定义一个结构体数组,如,struct Student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu3;,或,struct,int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu3;,见图,2.4,。数组各元素在内存中连续存放,见图,2.5,示意。,图,2.,图,2.5,2.结构体数组的初始化,与其他类型的数组一样,对结构体数组可以初始化。如,struct Student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,sty3=10101,Li Lin,M,18,87.5,103 Beijing Road,10102,Zhang Fun,M,19,99,130 Shanghai Road,10104,Wang Min,F,20,78.5,1010,Zhongshan Road;,定义数组,stu,时,也可以不指定元素个数,即写成以下形式:,stu=,;,编译时,系统会根据给出初值的结构体常量的个数来确定数组元素的个数。一个结构体常量应包括结构体中全部成员的值。,当然,数组的初始化也可以用以下形式:,Student stu=,;/,已事先声明了结构体类型,Student,由上可以看到,结构体数组初始化的一般形式是在所定义的数组名的后面加上,=初值表列;,3.结构体数组应用举例,下面举一个简单的例子来说明结构体数组的定义和引用。,例,2.2,对候选人得票的统计程序。设有3个候选人,最终只能有1人当选为领导。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。,可以定义一个候选人结构体数组,包括3个元素,在每个元素中存放有关的数据。,程序如下:,#,include,struct Person /,声明结构体类型,Person,char name20;,int count;,;,int main(),Person leader3=Li,0,Zhang,0,Fun,0;,/,定义,Person,类型的数组,内容为3个候选人的姓名和当前的得票数,int i,j;,char leader_name20;/leader_name,为投票人所选的人的姓名,for(i=0;ileader_name;/,先后输入10张票上所写的姓名,for(j=0;j3;j+)/,将票上姓名与3个候选人的姓名比较,if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;,/,如果与某一候选人的姓名相同,就给他加一票,coutendl;,for(i=0;i3;i+)/,输出3个候选人的姓名与最后得票数,coutleaderi.name:leaderi.countendl;,return 0;,运行情况如下:,Zhang,(,每次输入一个候选人的姓名),Li,Fun,Li,Zhang,Li,Zhang,Li,Fun,Wang,Li:4 (,输出3个候选人的姓名与最后得票数),Zhang:3,Fun:2,程序定义一个全局的结构体数组,leader,它有3个元素,每一元素包含两个成员,即,name(,姓名)和,count(,得票数)。在定义数组时使之初始化,使3位候选人的票数都先置零。见图,2.6,。,图,2.6,在这个例子中,也可以不用字符数组而用,string,方法的字符串变量来存放姓名数据,程序可修改如下:,#,include,#include,using namespace std;,struct Person,string name;/,成员,name,为字符串变量,int count;,;,int main(),Person leader3=Li,0,Zhang,0,Fun,0;,int i,j;,string leader_name;/leader_name,为字符串变量,for(i=0;ileader_name;,for(j=0;j3;j+),if(leader_name=leaderj.name)leaderj.count+;/,用“=”进行比较,coutendl;,for(i=0;i3;i+),coutleaderi.name:leaderi.countendl;,return 0;,一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。,1.通过指向结构体变量的指针引用结构体变量中的成员,下面通过一个简单例子来说明指向结构体变量的指针变量的应用。,2.1.5,指向结构体变量的指针,例,2.3,指向结构体变量的指针的应用。,#,include,#include,using namespace std;,int main(),struct Student /,声明结构体类型,student,int num;,string name;,char sex;,float score;,;,Student stu;/,定义,Student,类型的变量,stu,Student*p=/,定义,p,为指向,Student,类型数据的指针变量并指向,stu,stu.num=10301;/,对,stu,中的成员赋值,stu.name=Wang Fun;/,对,string,变量可以直接赋值,stu.sex=f;,stu.score=89.5;,cotstu.num stu.name stu.sex stu.scoreendl;,coutnum(*p).name(*p).sex(*p).score,例如,p-num,表示指针,p,当前指向的结构体变量中的成员,num。p-num,和(*,p).num,等价。同样,,p-name,等价于(*,p).name。,也就是说,以下3种形式等价:,结构体变量.成员名。如,stu.num。,(*p).,成员名。如(*,p).num。,p-,成员名。如,p-num。“-”,称为指向运算符。,请分析以下几种运算:,p-n,得到,p,指向的结构体变量中的成员,n,的值。,p-n+,得到,p,指向的结构体变量中的成员,n,的值,用完该值后使它加1。,+,p-n,得到,p,指向的结构体变量中的成员,n,的值,并使之加1,然后再使用它。,将一个结构体变量中的数据传递给另一个函数,有下列3种方法:,(1)用结构体变量名作参数。一般较少用这种方法。,(2)用指向结构体变量的指针作实参,将结构体变量的地址传给形参。,(3)用结构体变量的引用变量作函数参数。,下面通过一个简单的例子来说明,并对它们进行比较。,7.1.6 结构体类型数据作为函数参数,例,2.5,有一个结构体变量,stu,,内含学生学号、姓名和3门课的成绩。要求在,main,函数中为各成员赋值,在另一函数,print,中将它们的值输出。,(1)用结构体变量作函数参数,#,include,#include,using namespace std;,struct Student /,声明结构体类型,Student,int num;,char name20;,float score3;,;,int main(),void print(Student);/,函数声明,形参类型为结构体,Student,Student stu;/,定义结构体变量,stu.num=12345;/,以下5行对结构体变量各成员赋值,stu.name=Li Fung;,stu.score0=67.5;,stu.score1=89;,stu.score2=78.5;,print(stu);/,调用,print,函数,输出,stu,各成员的值,return 0;,void print(Student stu),coutstu.num stu.name stu.score0,stu.score1 stu.score2endl;,运行结果为:12345,Li Fung 67.5 89 78.5,(2),用指向结构体变量的指针作实参,在上面程序的基础上稍作修改即可。,#,include,#include,using namespace std;,struct Student,int num;,string name;/,用,string,类型定义字符串变量,float score3;,stu=12345,Li Fung,67.5,89,78.5;/,定义结构体,student,变量,stu,并赋初值,int main(),void print(Student*);/,函数声明,形参为指向,Student,类型数据的指针变量,Student*pt=/,定义基类型为,Student,的指针变量,pt,,并指向,stu,print(pt);/,实参为指向,Student,类数据的指针变量,return 0;,void print(Student*p)/,定义函数,形参,p,是基类型为,Student,的指针变量,coutnumnamescore0,score1score2endl;,调用,print,函数时,实参指针变量,pt,将,stu,的起始地址传送给形参,p(p,也是基类型为,student,的指针变量)。这样形参,p,也就指向,stu,,见图,2.10,。在,print,函数中输出所指向的结构体变量的各个成员值,它们也就是,stu,的成员值。,在,main,函数中也可以不定义指针变量,pt,,而在调用,print,函数时以&,stu,作为实参,把,stu,的起始地址传给实参,p。,图,2.10,(3),用结构体变量的引用作函数参数,#,include,#include,using namespace std;,struct Student,int num;,string name;,float score3;,stu=12345,Li Li,67.5,89,78.5;,int main(),void print(Student /,函数声明,形参为,Student,类型变量的引用,print(stu);/,实参为结构体,Student,变量,return 0;,void print(Student&stud)/,函数定义,形参为结构体,Student,变量的引用,coutstud.num stud.name stud.score0,stud.score1 stud.score2name=Wang Fun;/,向结构体变量的成员赋值,p-num=10123;,p-sex=m;,coutnamenumsexdata=10;,q=new node;,q-data=20;,NULL,q-next=NULL,p-next=q;,;,/,为第二个结点的指针域赋值,101,2.2.2,链表的建立,【,例,】,创建一个含有,n,个结点的、包含一个数据域,且其类型为整型的单链表。,链表的建立过程如下:,首先设置,head,为,NULL,,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服