《《结构体数组学习》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《结构体数组学习》PPT课件.ppt(57页珍藏版)》请在金锄头文库上搜索。
1、一、一、结构结构体体数组数组形式一形式一: :间接定义间接定义 struct studentstudent int num; char name20; ;student student stu2;numnamenumnamestu0stu124Bstu形式二形式二: :直接定义直接定义 struct studentstudent int num; char name20;stu2;形式三形式三: :无名定义无名定义 struct int num; char name20;stu2;结构数组的初始化 顺序初始化顺序初始化: : struct studentstudent int num; cha
2、r name20; int age; ; studentstudent stu =200401,“Wang Yong”, 19, 200402,“Li Gang”, 20; 初始值的初始值的个数个数个数个数、顺序顺序顺序顺序和和类型类型类型类型必须与其对应必须与其对应的结构成员一致的结构成员一致 如果对所有数组元素如果对所有数组元素赋初值赋初值, ,则数组元素则数组元素个数可省略。个数可省略。分行分行初始化初始化: : struct studentstudent int num; char name20; int age; ; studentstudent stu = 200401,“Wang
3、 Yong”, 19, , 200402,“Li Gang”, 20 ; 结构数组的引用引用形式引用形式引用形式引用形式:结构数组名下标. .成员名 (结构数组元素. .成员名)例如:stu0.num struct studentstudent int num; char name20; char sex; int age; stu3;stu1.age+;cinstu0.name;strcpy(stu0.name, “ZhaoDa”);cinstu1.num; EXAMPLE 2. . . Sort by student aver#include #include #include using
4、 namespace std;struct Gradeint s1;int s2;int s3;float aver;struct StudentRecint num;string name;Grade s; typedef struct StudentRec STUDENT; STUDENT 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); coutsetprecisi
5、on(4)showpoint=0; i- )cout6-i: stu i .num setw(6)left stu i .name stu i .s.averendl;声明结构体数声明结构体数组组用结构体数组用结构体数组名作实参名作实参 void sort( STUDENT stu , int n) int i, j, min; STUDENT t; for ( i=0; in; i+ ) min=i; for( j=i+1; jn; j+) if ( stu j .s.aver-成员名v结构指针的运算:1.指向结构变量的指针 指针不仅可以指向普通变量、数组、 数组元素、函数,同样的,指针也可
6、以指向结构变量,我们把指向结构变量的指针称为结构指针。结构指针指向了结构变量所在存储空间的起始地址。二、二、 结构体指针结构体指针v定义形式:结构类型名 *结构指针名; ;v使用结构指针引用结构成员:方法一:(*结构指针).成员名方法二:结构指针-成员名v结构指针的运算: 1.指向结构变量的指针(*s).num struct studentstudent int num; char name20; char sex; int age; ; student student stu; student student *s=&stu;numnamesexagestus 指针不仅可以指向普通变量、数组
7、、 数组元素、函数,同样的,指针也可以指向结构变量,我们把指向结构变量的指针称为结构指针。结构指针指向了结构变量所在存储空间的起始地址。v定义形式:结构类型名 *结构指针名; ;v使用结构指针引用结构成员:方法一:(*结构指针).成员名方法二:结构指针-成员名v结构指针的运算:1.指向结构变量的指针(*s).num s是结构指针,(*s)表示s指向的结构变量stu,(*s).num表示s所指的结构变量中的成员num,所以(*s).num的意义意义是先访问结构指针所指向的结构结构变量变量,再访问该结构变量中的成员成员。由于结构成员运算符“ . ”优先于指针运算符“*”,故(*s).num中的括号
8、( )不能省略。s- num指向结构成员运算符指向结构成员运算符优先级和优先级和“ . . ”同级同级别别结合性是结合性是左结合左结合左结合左结合 指针不仅可以指向普通变量、数组、 数组元素、函数,同样的,指针也可以指向结构变量,我们把指向结构变量的指针称为结构指针。结构指针指向了结构变量所在存储空间的起始地址。v定义形式:结构类型名 *结构指针名; ;v使用结构指针引用结构成员:方法一:(*结构指针).成员名方法二:结构指针-成员名v结构指针的运算:1.指向结构变量的指针(*s).nums-num 常用运算符的优先级顺序: 一级一级运算符( - .) 单目单目运算符( ! + - - * &
9、 sizeof (类型) ) 算术算术运算符关系关系运算符逻辑逻辑运算符 条件条件条件符赋值赋值运算符逗号逗号运算符 访问结构变量中的结构成员共有访问结构变量中的结构成员共有三种方式三种方式三种方式三种方式: 结构变量结构变量. .成员名成员名 stu.numstu.num ( (* *结构指针结构指针).).成员名成员名 (*s).num(*s).num 结构指针结构指针-成员名成员名 s-num s-num 指针不仅可以指向普通变量、数组、 数组元素、函数,同样的,指针也可以指向结构变量,我们把指向结构变量的指针称为结构指针。结构指针指向了结构变量所在存储空间的起始地址。v定义形式:结构类
10、型名 *结构指针名; ;v使用结构指针引用结构成员:方法一:(*结构指针).成员名方法二:结构指针-成员名v结构指针的运算:1.指向结构变量的指针(*s).nums-num 结构指针指向的是结构变量所在存储空间的首地址。将结构指针加加1 1,则指针指向内存中下下一一个个结结构构变变量量,其地址的增加量取决于指针所指向的结构的长度。 coutnum; / /输出结构成员输出结构成员输出结构成员输出结构成员numnum的值。的值。的值。的值。 coutnum+; /*/*先输出结构成员先输出结构成员先输出结构成员先输出结构成员numnum的值,然后将该值的值,然后将该值的值,然后将该值的值,然后将
11、该值 加加加加1 1。* */ / coutnum; /*/*先取结构成员先取结构成员先取结构成员先取结构成员numnum的值,然后将的值,然后将的值,然后将的值,然后将 该值加该值加该值加该值加1, 1, 之后再输出。之后再输出。之后再输出。之后再输出。* */ /coutnum; /*/*先输出先输出先输出先输出numnum的值,然后指针加的值,然后指针加的值,然后指针加的值,然后指针加1 1,指向,指向,指向,指向 下一个结构变量。下一个结构变量。下一个结构变量。下一个结构变量。* */ / 在C+语言中,把指向结构数组或数组元素的指针称为结构数组指针结构数组指针。 #include s
12、truct studentstudent int num; char name20; float score; ;2.指向结构体数组的指针 例例 使用结构数组指针输出数据 void main( ) student student stu3=1001,Liu Jin,75, 1002,Li Lan,82, 1003,Ma Kai,80 ; studentstudent *s=stu; coutNum Name Scoreendl; for(;sstu+3;s+) coutnum name score nump1- scorep1- next 指针域指针域指针域指针域建立链表的过程:首先利用new
13、运算符,在内存中开辟一个存储空间,用来存放新结点。使p1,p2都指向该存储空间,然后从键盘上输入一个学生的数据进行判断,如果输入的p1-num不等于0,而且是第一个结点数据(n1),则把p1的值赋给head(head=p1)(head=p1),这样,结构指针head就指向了链表中的第一个结点第一个结点。p2p1headhead(n=1)建立表头结点建立表头结点000189.5p2p1headhead000189.5然后利用new再开辟一个新的存储空间,用来存放另一个结点,并使p1指向新新开开辟辟的的存存储储空空间间,然后输入该结点的数据。如果输入的p1-num不等于0,而且不是第一个结点(n1
14、)时,则应将新建结点与前一个结点连接在一起,即:执行p2 - next=p1,使第一个结点的next 成员指向第二个结点。 接着使p2p1,即:使p2指向刚刚刚刚建建立立的的结结点点(即建立链表进程中的最后一个结点最后一个结点) 。建立中间结点建立中间结点(n=2)p2p1headhead000189.5然后利用new再开辟一个新的存储空间,用来存放另一个结点,并使p1指向新新开开辟辟的的存存储储空空间间,然后输入该结点的数据。如果输入的p1-num不等于0,而且不是第一个结点(n1)时,则应将新建结点与前一个结点连接在一起,即:执行p2 - next=p1,使第一个结点的next 成员指向第
15、二个结点。 接着使p2p1,即:使p2指向刚刚刚刚建建立立的的结结点点(即建立链表进程中的最后一个结点最后一个结点) 。建立中间结点建立中间结点(n=2)000276p2p1headhead000189.5然后利用new再开辟一个新的存储空间,用来存放另一个结点,并使p1指向新新开开辟辟的的存存储储空空间间,然后输入该结点的数据。如果输入的p1-num不等于0,而且不是第一个结点(n1)时,则应将新建结点与前一个结点连接在一起,即:执行p2 - next=p1,使第一个结点的next 成员指向第二个结点。 接着使p2p1,即:使p2指向刚刚刚刚建建立立的的结结点点(即建立链表进程中的最后一个结
16、点最后一个结点) 。建立中间结点建立中间结点(n=2)000276p2p1headhead000189.5然后利用new再开辟一个新的存储空间,用来存放另一个结点,并使p1指向新新开开辟辟的的存存储储空空间间,然后输入该结点的数据。如果输入的p1-num不等于0,而且不是第一个结点(n1)时,则应将新建结点与前一个结点连接在一起,即:执行p2 - next=p1,使第一个结点的next 成员指向第二个结点。 接着使p2p1,即:使p2指向刚刚刚刚建建立立的的结结点点(即建立链表进程中的最后一个结点最后一个结点) 。(n=2)000276p2headhead000189.5000276重复步骤
17、,依次建立若干个新结点。每次都让p1指向新建立的结点,p2指向链表中最后一个结点,然后用“p2-next=p1”,把p1所指的结点连接到p2所指结点的后面。当输入某个结点数据后,如果p1-num等于0,则不再执行上述循环,此新结点不应该被连接到链表中,用语句“p2-next=NULL”,将NULL值赋给前一个结点的next成员。 至此,建立链表的过程结束。p1(n=2)p2headhead000189.5000276重复步骤 ,依次建立若干个新结点。每次都让p1指向新建立的结点,p2指向链表中最后一个结点,然后用“p2-next=p1”,把p1所指的结点连接到p2所指结点的后面。当输入某个结点
18、数据后,如果p1-num等于0,则不再执行上述循环,此新结点不应该被连接到链表中,用语句“p2-next=NULL”,将NULL值赋给前一个结点的next成员。 至此,建立链表的过程结束。p1000388p2headhead000189.5000276重复步骤 ,依次建立若干个新结点。每次都让p1指向新建立的结点,p2指向链表中最后一个结点,然后用“p2-next=p1”,把p1所指的结点连接到p2所指结点的后面。当输入某个结点数据后,如果p1-num等于0,则不再执行上述循环,此新结点不应该被连接到链表中,用语句“p2-next=NULL”,将NULL值赋给前一个结点的next成员。 至此,
19、建立链表的过程结束。p1000388p2headhead000189.5000276重复步骤 ,依次建立若干个新结点。每次都让p1指向新建立的结点,p2指向链表中最后一个结点,然后用“p2-next=p1”,把p1所指的结点连接到p2所指结点的后面。当输入某个结点数据后,如果p1-num等于0,则不再执行上述循环,此新结点不应该被连接到链表中,用语句“p2-next=NULL”,将NULL值赋给前一个结点的next成员。 至此,建立链表的过程结束。00038800p1NULLNULL建立表尾结点建立表尾结点struct student * creat( ) student *head,*p1,
20、*p2; head = NULL; /在没有创建任何结点时,表头指向空在没有创建任何结点时,表头指向空 p1 = new student; /创建一个新结点创建一个新结点 -(1) p2 = p1; cinp1-nump1-score; /*输入第一个结点的输入第一个结点的 学生数据学生数据*/p2p1headhead000189.5p2p1headhead000189.5(n=1)建立表头结点建立表头结点while(p1-num != 0) / -(2) n +; if (n = 1) head = p1; / 将将链链表表中中第第一一个个新新建建结结点点作作为为表表头头 else p2-n
21、ext = p1; p2 = p1; p1 = new(student); / 新建一个结点新建一个结点 cinp1-nump1-score; delete p1; p2-next =NULL; return head; /返回表头指针返回表头指针 /end creatwhile(p1-num != 0) / -(2) n +; if (n = 1) head = p1; / 将将链链表表中中第第一一个个新新建建结结点点作作为为表表头头 else p2-next = p1; p2 = p1; p1 = new(student); / 新建一个结点新建一个结点 cinp1-nump1-score
22、; delete p1; p2-next =NULL; return head; /返回表头指针返回表头指针 /end creatp2headhead000189.5建立中间结点建立中间结点(n=2)000276p1headhead000189.5(n=2)000276p1p2while(p1-num != 0) / -(2) n +; if (n = 1) head = p1; / 将将链链表表中中第第一一个个新新建建结结点点作作为为表表头头 else p2-next = p1; p2 = p1; p1 = new(student); / 新建一个结点新建一个结点 cinp1-nump1-s
23、core; delete p1; p2-next =NULL; return head; /返回表头指针返回表头指针 /end creatheadhead000189.5000276p2p1000388while(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
24、 head; /返回表头指针返回表头指针 /end creatheadhead000189.5000276p200038800p1while(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 creatheadh
25、ead000189.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 p1; p2-next =NULL; return head; /返回表头指针返回表头指针 /end creat 输出链表就是将链表中各结点的数据依次输出。首先要知道
26、链表第一个结点的地址,也就是要知道表头结点head的值,然后依次通过各结点next的值找到下一个结点,就可以依次输出所有结点的数据,直到链表的尾结点为止。void main( ) struct studentstudent *head1; cout“input records:”endl; head1=creat( ); /*建立链表,建立链表, 并返回表头并返回表头*/ print(head1); /输出链表输出链表 例 mainmain函数调用两个函数creatcreat( )( )和print( )print( ),实现链表的创建创建和链表数据的输出输出。headhead000189.5
27、000276000388NULLNULLvoid print(struct studentstudent *p) cout“These ”n“ records are:”endl; if(p=NULL) return; do coutnum“ ”scorenext; / /使使使使p p指向下一个结点指向下一个结点指向下一个结点指向下一个结点 while(p!=NULL);000189.5000276000388NULLNULL(next)pp1p1void print(struct studentstudent *p) cout“These ”n“ records are:”endl; if
28、(p=NULL) return; do coutnum“ ”scorenext; / /使使使使p p指向下一个结点指向下一个结点指向下一个结点指向下一个结点 while(p!=NULL); 对链表的删除操作是把某个结点从链表中摘除,并不是真正从内存中将这个结点删除掉,使它脱离原来的链表,解除原来的链接关系解除原来的链接关系解除原来的链接关系解除原来的链接关系。 算算法法分分析析:以指定的学学号号为删除标志。从指针变量p指向的第一个结点开始,检查该结点中的num是否为要删除的学号,如果是则将其删除;如果不是,则将p移到下一个结点,再继续判断,直到删除或到表尾为止。 对链表的删除操作对链表的删除
29、操作headhead000189.5000276000388NULLNULL 执执行行过过程程:设两个指针p1p1和p2p2,先使p1指向第一个结点。如果p1所指的结点不是要删除的结点,就将p2指向p1所指的结点(p2=p1p2=p1),然后将p1指向下一个结点(p1=p1-nextp1=p1-next)。再继续判断p1所指的结点是不是要删除的结点,如此重复,直到找到要删除的结点并将其删除或是检查完全部链表为止。headhead000189.5000276000388NULLNULLp1p2p1000189.5000276000388NULLNULL 要删除的结点分两种情况: 要删除的是第一个
30、结点(即p1=headp1=head),则执行head=p1-nexthead=p1-next。这时,head指向了原来的第二个结点。此时,第一个结点虽然还存在,但它已与链表脱离,因为链表中没有一个结点或头指针指向它,也就不能访问它了,即已被删除。headheadp1headhead000189.5000276000388NULLNULLheadhead 要删除的结点分两种情况: 要删除的不是第一个结点,则应执行 p2-next=p1-nextp2-next=p1-next,即p2-next指向了p1-next所指向的结点, p1所指向的结点就被删除而不再是链表的成员了。p1p2struct
31、studentstudent *dele( studentstudent *head, long num) studentstudent *p1, *p2; if (head=NULL) coutlist nullnum!=num&p1-next!=NULL) p2=p1; p1=p1-next; if (num=p1-num) if(p1=head) head=p1-next; else p2-next=p1-next; coutdelete:num; n=n-1; else coutnumnot been found!next=p0;P0-next=p1;p2-next=p0;p0-nex
32、t=p1; 过程实现:过程实现:000289.5headhead000376000488NULLNULLp1p0000180p2-next=p0;P0-next=p1;head=p0;p0-next=p1;struct studentstudent *insert(studentstudent *head,studentstudent *stud) struct studentstudent *p0, *p1, *p2; p1=head;/p1指向第一个结点指向第一个结点 p0=stud;/p0指向待插入的结点指向待插入的结点 if(head=NULL) /原来的链表是空表原来的链表是空表 h
33、ead=p0;p0-next=NULL; /使使p0指向的结点作为头结点指向的结点作为头结点 else while(p0-nump1-num)&(p1-next!=NULL) p2=p1; /p2指向指向p1所指的结点所指的结点 p1=p1-next;/p1后移一个结点后移一个结点 插插入入结结点点的的函函数数如如下下:函数的参数是head和要插入的结点存储空间首地址指针(stud),函数的返回值是链表头指针head , head的值可能在函数执行过程中被改变(当插入到第一个结点之前时)。 if(p0-numnum) if(head=p1) head=p0; /插入到第一个结点前面插入到第一个
34、结点前面 else p2-next=p0;/插入到插入到p2指向的结点后面指向的结点后面 p0-next=p1; else p1-next=p0; p0-next=NULL; /插入到最后的结点后面插入到最后的结点后面 n=n+1; /链表结点个数加链表结点个数加1 return (head); 综合实习:综合实习:综合实习:综合实习:数组、结构体与指针数组、结构体与指针链表链表操作操作:创建链表创建链表输出链表输出链表Main( )删除结点删除结点插入结点插入结点 EXAMPLE 2. . . 用结构体数组对用结构体数组对1010名学生的成绩进行排序(冒泡法和名学生的成绩进行排序(冒泡法和选择法)。选择法)。