《工学结构体》教学课件_第1页
《工学结构体》教学课件_第2页
《工学结构体》教学课件_第3页
《工学结构体》教学课件_第4页
《工学结构体》教学课件_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、一、结构体数组形式一:间接定义 struct student int num; char name20; ;student stu2;numnamenumnamestu0stu124Bstu形式二:直接定义 struct student int num; char name20;stu2;形式三:无名定义 struct int num; char name20;stu2;第1页,共57页。结构数组的初始化 顺序初始化: struct student int num; char name20; int age; ; student stu =200401,“Wang Yong”, 19, 200

2、402,“Li Gang”, 20; 初始值的个数、顺序和类型必须与其对应的结构成员一致 如果对所有数组元素赋初值,则数组元素个数可省略。分行初始化: struct student int num; char name20; int age; ; student stu = 200401,“Wang Yong”, 19, 200402,“Li Gang”, 20 ; 第2页,共57页。结构数组的引用引用形式:结构数组名下标.成员名 (结构数组元素.成员名)例如:stu0.num struct student int num; char name20; char sex; int age; st

3、u3;stu1.age+;;strcpy(, “ZhaoDa”);cinstu1.num;第3页,共57页。 EXAMPLE 2. . . Sort by student aver#include #include #include using namespace std;struct Gradeint s1;int s2;int s3;float aver;struct StudentRecint num;string name;Grade s;第4页,共57页。 typedef struct StudentRec STUDENT; STUDENT

4、inputstu( int ); void sort( STUDENT stu , int ); void main() STUDENT stu 6 ; for( int i=0; i6; i+) stu i = inputstu( i ); sort ( stu, 6); coutsetprecision(4)showpoint=0; i- )cout6-i: stu i .num setw(6)left stu i .name stu i .s.averendl;声明结构体数组用结构体数组名作实参第5页,共57页。 void sort( STUDENT stu , int n) int i

5、, j, min; STUDENT t; for ( i=0; in; i+ ) min=i; for( j=i+1; jn; j+) if ( stu j .s.aver成员名结构指针的运算:1.指向结构变量的指针第7页,共57页。 指针不仅可以指向普通变量、数组、 数组元素、函数,同样的,指针也可以指向结构变量,我们把指向结构变量的指针称为结构指针。结构指针指向了结构变量所在存储空间的起始地址。二、 结构体指针定义形式:结构类型名 *结构指针名;使用结构指针引用结构成员:方法一:(*结构指针).成员名方法二:结构指针-成员名结构指针的运算: 1.指向结构变量的指针(*s).num stru

6、ct student int num; char name20; char sex; int age; ; student stu; student *s=&stu;numnamesexagestus第8页,共57页。 指针不仅可以指向普通变量、数组、 数组元素、函数,同样的,指针也可以指向结构变量,我们把指向结构变量的指针称为结构指针。结构指针指向了结构变量所在存储空间的起始地址。定义形式:结构类型名 *结构指针名;使用结构指针引用结构成员:方法一:(*结构指针).成员名方法二:结构指针-成员名结构指针的运算:1.指向结构变量的指针(*s).num s是结构指针,(*s)表示s指向的结构变量

7、stu,(*s).num表示s所指的结构变量中的成员num,所以(*s).num的意义是先访问结构指针所指向的结构变量,再访问该结构变量中的成员。由于结构成员运算符“ . ”优先于指针运算符“*”,故(*s).num中的括号( )不能省略。s-num指向结构成员运算符优先级和“ . ”同级别结合性是左结合第9页,共57页。 指针不仅可以指向普通变量、数组、 数组元素、函数,同样的,指针也可以指向结构变量,我们把指向结构变量的指针称为结构指针。结构指针指向了结构变量所在存储空间的起始地址。定义形式:结构类型名 *结构指针名;使用结构指针引用结构成员:方法一:(*结构指针).成员名方法二:结构指针

8、-成员名结构指针的运算:1.指向结构变量的指针(*s).nums-num 常用运算符的优先级顺序: 一级运算符( - .) 单目运算符( ! + - - * & sizeof (类型) ) 算术运算符关系运算符逻辑运算符 条件条件符赋值运算符逗号运算符 访问结构变量中的结构成员共有三种方式: 结构变量.成员名 stu.num (*结构指针).成员名 (*s).num 结构指针-成员名 s-num 第10页,共57页。 指针不仅可以指向普通变量、数组、 数组元素、函数,同样的,指针也可以指向结构变量,我们把指向结构变量的指针称为结构指针。结构指针指向了结构变量所在存储空间的起始地址。定义形式:结

9、构类型名 *结构指针名;使用结构指针引用结构成员:方法一:(*结构指针).成员名方法二:结构指针-成员名结构指针的运算:1.指向结构变量的指针(*s).nums-num 结构指针指向的是结构变量所在存储空间的首地址。将结构指针加1,则指针指向内存中下一个结构变量,其地址的增加量取决于指针所指向的结构的长度。 coutnum; /输出结构成员num的值。 coutnum+; /*先输出结构成员num的值,然后将该值 加1。*/ coutnum; /*先取结构成员num的值,然后将 该值加1, 之后再输出。*/coutnum; /*先输出num的值,然后指针加1,指向 下一个结构变量。*/第11页

10、,共57页。 在C+语言中,把指向结构数组或数组元素的指针称为结构数组指针。 #include struct student int num; char name20; float score; ;2.指向结构体数组的指针 例 使用结构数组指针输出数据第12页,共57页。 void main( ) student stu3=1001,Liu Jin,75, 1002,Li Lan,82, 1003,Ma Kai,80 ; student *s=stu; coutNum Name Scoreendl; for(;sstu+3;s+) coutnum name score nump1- score

11、p1- next 指针域第26页,共57页。建立链表的过程:首先利用new运算符,在内存中开辟一个存储空间,用来存放新结点。使p1,p2都指向该存储空间,然后从键盘上输入一个学生的数据进行判断,如果输入的p1-num不等于0,而且是第一个结点数据(n1),则把p1的值赋给head(head=p1),这样,结构指针head就指向了链表中的第一个结点。p2p1head(n=1)建立表头结点000189.5第27页,共57页。p2p1head000189.5然后利用new再开辟一个新的存储空间,用来存放另一个结点,并使p1指向新开辟的存储空间,然后输入该结点的数据。如果输入的p1-num不等于0,而

12、且不是第一个结点(n1)时,则应将新建结点与前一个结点连接在一起,即:执行p2 - next=p1,使第一个结点的next 成员指向第二个结点。 接着使p2p1,即:使p2指向刚刚建立的结点(即建立链表进程中的最后一个结点) 。建立中间结点(n=2)第28页,共57页。p2p1head000189.5然后利用new再开辟一个新的存储空间,用来存放另一个结点,并使p1指向新开辟的存储空间,然后输入该结点的数据。如果输入的p1-num不等于0,而且不是第一个结点(n1)时,则应将新建结点与前一个结点连接在一起,即:执行p2 - next=p1,使第一个结点的next 成员指向第二个结点。 接着使p

13、2p1,即:使p2指向刚刚建立的结点(即建立链表进程中的最后一个结点) 。建立中间结点(n=2)000276第29页,共57页。p2p1head000189.5然后利用new再开辟一个新的存储空间,用来存放另一个结点,并使p1指向新开辟的存储空间,然后输入该结点的数据。如果输入的p1-num不等于0,而且不是第一个结点(n1)时,则应将新建结点与前一个结点连接在一起,即:执行p2 - next=p1,使第一个结点的next 成员指向第二个结点。 接着使p2p1,即:使p2指向刚刚建立的结点(即建立链表进程中的最后一个结点) 。建立中间结点(n=2)000276第30页,共57页。p2p1hea

14、d000189.5然后利用new再开辟一个新的存储空间,用来存放另一个结点,并使p1指向新开辟的存储空间,然后输入该结点的数据。如果输入的p1-num不等于0,而且不是第一个结点(n1)时,则应将新建结点与前一个结点连接在一起,即:执行p2 - next=p1,使第一个结点的next 成员指向第二个结点。 接着使p2p1,即:使p2指向刚刚建立的结点(即建立链表进程中的最后一个结点) 。(n=2)000276第31页,共57页。p2head000189.5000276重复步骤 ,依次建立若干个新结点。每次都让p1指向新建立的结点,p2指向链表中最后一个结点,然后用“p2-next=p1”,把p

15、1所指的结点连接到p2所指结点的后面。当输入某个结点数据后,如果p1-num等于0,则不再执行上述循环,此新结点不应该被连接到链表中,用语句“p2-next=NULL”,将NULL值赋给前一个结点的next成员。 至此,建立链表的过程结束。p1(n=2)第32页,共57页。p2head000189.5000276重复步骤 ,依次建立若干个新结点。每次都让p1指向新建立的结点,p2指向链表中最后一个结点,然后用“p2-next=p1”,把p1所指的结点连接到p2所指结点的后面。当输入某个结点数据后,如果p1-num等于0,则不再执行上述循环,此新结点不应该被连接到链表中,用语句“p2-next=

16、NULL”,将NULL值赋给前一个结点的next成员。 至此,建立链表的过程结束。p1000388第33页,共57页。p2head000189.5000276重复步骤 ,依次建立若干个新结点。每次都让p1指向新建立的结点,p2指向链表中最后一个结点,然后用“p2-next=p1”,把p1所指的结点连接到p2所指结点的后面。当输入某个结点数据后,如果p1-num等于0,则不再执行上述循环,此新结点不应该被连接到链表中,用语句“p2-next=NULL”,将NULL值赋给前一个结点的next成员。 至此,建立链表的过程结束。p1000388第34页,共57页。p2head000189.500027

17、6重复步骤 ,依次建立若干个新结点。每次都让p1指向新建立的结点,p2指向链表中最后一个结点,然后用“p2-next=p1”,把p1所指的结点连接到p2所指结点的后面。当输入某个结点数据后,如果p1-num等于0,则不再执行上述循环,此新结点不应该被连接到链表中,用语句“p2-next=NULL”,将NULL值赋给前一个结点的next成员。 至此,建立链表的过程结束。00038800p1NULL建立表尾结点第35页,共57页。struct student * creat( ) student *head,*p1,*p2; head = NULL; /在没有创建任何结点时,表头指向空 p1 =

18、new student; /创建一个新结点 -(1) p2 = p1; cinp1-nump1-score; /*输入第一个结点的 学生数据*/p2p1head000189.5第36页,共57页。p2p1head000189.5(n=1)建立表头结点while(p1-num != 0) / -(2) n +; if (n = 1) head = p1; / 将链表中第一个新建结点作为表头 else p2-next = p1; p2 = p1; p1 = new(student); / 新建一个结点 cinp1-nump1-score; delete p1; p2-next =NULL; ret

19、urn head; /返回表头指针 /end creat第37页,共57页。while(p1-num != 0) / -(2) n +; if (n = 1) head = p1; / 将链表中第一个新建结点作为表头 else p2-next = p1; p2 = p1; p1 = new(student); / 新建一个结点 cinp1-nump1-score; delete p1; p2-next =NULL; return head; /返回表头指针 /end creatp2head000189.5建立中间结点(n=2)000276p1第38页,共57页。head000189.5(n=2

20、)000276p1p2while(p1-num != 0) / -(2) n +; if (n = 1) head = p1; / 将链表中第一个新建结点作为表头 else p2-next = p1; p2 = p1; p1 = new(student); / 新建一个结点 cinp1-nump1-score; delete p1; p2-next =NULL; return head; /返回表头指针 /end creat第39页,共57页。head000189.5000276p2p1000388while(p1-num != 0) / -(2) n +; if (n = 1) head =

21、 p1; / 将链表中第一个新建结点作为表头 else p2-next = p1; p2 = p1; p1 = new(student); / 新建一个结点 cinp1-nump1-score; delete p1; p2-next =NULL; return head; /返回表头指针 /end creat第40页,共57页。head000189.5000276p200038800p1while(p1-num != 0) / -(2) n +; if (n = 1) head = p1; / 将链表中第一个新建结点作为表头 else p2-next = p1; p2 = p1; p1 = n

22、ew(student); / 新建一个结点 cinp1-nump1-score; delete p1; p2-next =NULL; return head; /返回表头指针 /end creat第41页,共57页。head000189.5000276p2000388p1NULL建立表尾结点while(p1-num != 0) / -(2) n +; if (n = 1) head = p1; / 将链表中第一个新建结点作为表头 else p2-next = p1; p2 = p1; p1 = new(student); / 新建一个结点 cinp1-nump1-score; delete p

23、1; p2-next =NULL; return head; /返回表头指针 /end creat第42页,共57页。 输出链表就是将链表中各结点的数据依次输出。首先要知道链表第一个结点的地址,也就是要知道表头结点head的值,然后依次通过各结点next的值找到下一个结点,就可以依次输出所有结点的数据,直到链表的尾结点为止。void main( ) struct student *head1; cout“input records:”endl; head1=creat( ); /*建立链表, 并返回表头*/ print(head1); /输出链表 例 main函数调用两个函数creat( )和

24、print( ),实现链表的创建和链表数据的输出。第43页,共57页。head000189.5000276000388NULLvoid print(struct student *p) cout“These ”n“ records are:”endl; if(p=NULL) return; do coutnum“ ”scorenext; /使p指向下一个结点 while(p!=NULL);第44页,共57页。000189.5000276000388NULL(next)pp1p1void print(struct student *p) cout“These ”n“ records are:”e

25、ndl; if(p=NULL) return; do coutnum“ ”scorenext; /使p指向下一个结点 while(p!=NULL);第45页,共57页。 对链表的删除操作是把某个结点从链表中摘除,并不是真正从内存中将这个结点删除掉,使它脱离原来的链表,解除原来的链接关系。 算法分析:以指定的学号为删除标志。从指针变量p指向的第一个结点开始,检查该结点中的num是否为要删除的学号,如果是则将其删除;如果不是,则将p移到下一个结点,再继续判断,直到删除或到表尾为止。 对链表的删除操作head000189.5000276000388NULL第46页,共57页。 执行过程:设两个指针p

26、1和p2,先使p1指向第一个结点。如果p1所指的结点不是要删除的结点,就将p2指向p1所指的结点(p2=p1),然后将p1指向下一个结点(p1=p1-next)。再继续判断p1所指的结点是不是要删除的结点,如此重复,直到找到要删除的结点并将其删除或是检查完全部链表为止。head000189.5000276000388NULLp1p2p1第47页,共57页。000189.5000276000388NULL 要删除的结点分两种情况: 要删除的是第一个结点(即p1=head),则执行head=p1-next。这时,head指向了原来的第二个结点。此时,第一个结点虽然还存在,但它已与链表脱离,因为链表

27、中没有一个结点或头指针指向它,也就不能访问它了,即已被删除。headp1head第48页,共57页。000189.5000276000388NULLhead 要删除的结点分两种情况: 要删除的不是第一个结点,则应执行 p2-next=p1-next,即p2-next指向了p1-next所指向的结点, p1所指向的结点就被删除而不再是链表的成员了。p1p2第49页,共57页。struct student *dele( student *head, long num) student *p1, *p2; if (head=NULL) coutlist nullnum!=num&p1-next!=NULL) p2=p1; p1=p1-next;

温馨提示

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

评论

0/150

提交评论