《第九章结构体与共用体课件.ppt》由会员分享,可在线阅读,更多相关《第九章结构体与共用体课件.ppt(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计语言程序设计1第九章第九章-结构体与共用体结构体与共用体C语言程序设计语言程序设计2结构体类型与结构体变量结构体类型与结构体变量 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;struct 结构体名结构体名 变量名表列变量名表列;C语言程序设计语言程序设计3结构体变量的引用和初始化结构体变量的引
2、用和初始化结构体变量不能整体引用结构体变量不能整体引用, ,只能引用变量成员只能引用变量成员引用方式引用方式:结构体变量名结构体变量名. .成员名成员名可以将一个结构体变量赋值给另一个结构体变量可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用结构体嵌套时逐级引用C语言程序设计语言程序设计4例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=
3、12;C语言程序设计语言程序设计5结构体数组结构体数组 struct student int num; char name20; char sex; int age; stu2;numnamesexagenumnamesexagestu0stu125BC语言程序设计语言程序设计6例:统计后选人选票例:统计后选人选票struct person char name20; int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_n
4、ame); for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0) leaderj.count+; for(i=0;i成员名成员名几种运算:几种运算:1、 p-n 得到得到p指向的结构体变量中的成员指向的结构体变量中的成员n的值的值2、 p-n+ 得到得到p指向的结构体变量中的成员指向的结构体变量中的成员n的值的值, 用完后使之加用完后使之加13、 +p-n 得到得到p指向的结构体变量中的成员指向的结构体变量中的成员n的值使之加的值使之加1C语言程序设计语言程序设计8指向指向结构体变量结构体变量的指针的指针main() struct stude
5、nt long int num; char name20; char sex; float score; stu_1,*p; p=&stu_1; stu_1.num=89101; strcpy(stu_1.name,Li Lin); p-sex=M; p-score=89.5; printf(nNo:%ldnname:%snsex:%cnscore:%fn, (*p).num,p-name,stu_1.sex,p-score);C语言程序设计语言程序设计9指向指向结构体数组结构体数组的指针的指针numnamesexagestu0pstu1stu2p+1P加加1指指p所增加的值为结构体数所增加的
6、值为结构体数组的一个元素所占的字节组的一个元素所占的字节struct student int num; char name20;stu2=10101,Li Lin,M,18, 10102,Zhang li,M,19; p=stu; p+;C语言程序设计语言程序设计10struct student int num; char name20; char sex; int age;stu3=10101,Li Lin,M,18, 10102,Zhang li,M,19, 10104,Wang Min,F,20;main() struct student *p; for(p=stu;pnum,p-nam
7、e,p-sex,p-age);C语言程序设计语言程序设计11struct student int num; char name20; char sex; int age;stu= 10104,Wang Min,F,20;void print(struct student stu)printf(“%d %s%c %d ”,stu. num, stu. name, stu.sex, stu.age)main()print(stu);用结构体变量作函数参数用结构体变量作函数参数C语言程序设计语言程序设计12用结构体指针变量作函数参数用结构体指针变量作函数参数struct student int nu
8、m; char name20; char sex; int age;stu= 10104,Wang Min,F,20;void print(struct student *p)printf(“%d %s%c %d ”,stu. num, stu. name, stu.sex, stu.age)main()print(&stu);C语言程序设计语言程序设计13(1)头指针变量)头指针变量head指向链表的首结点。指向链表的首结点。(2)每个结点由)每个结点由2个域组成:个域组成: 1)数据域)数据域存储结点本身的信息。存储结点本身的信息。 2)指针域)指针域指向后继结点的指针。指向后继结点的指针
9、。(3)尾结点的指针域置为)尾结点的指针域置为“NULL(空)空)”,作为,作为链表结束的标志。链表结束的标志。链表的基本结构链表的基本结构C语言程序设计语言程序设计14链表链表n定义结点定义结点struct node int num;struct node *next;n定义头指针定义头指针struct node *head;n三种访问结构体成员的方法三种访问结构体成员的方法C语言程序设计语言程序设计15处理动态链表的函数处理动态链表的函数1、malloc函数函数 void *malloc(unsigned int size)2、calloc函数函数 void *calloc(unsigne
10、d n, unsigned size)3、free函数函数 void * free(*p)C语言程序设计语言程序设计16链表的基本操作l建立单向链表建立单向链表l遍历单向链表遍历单向链表l插入结点插入结点l删除结点删除结点C语言程序设计语言程序设计17(1)创建创建链表是指,从无到有地建立起一个链表,即往空链表链表是指,从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。中依次插入若干结点,并保持结点之间的前驱和后继关系。(2)遍历遍历指按给定的结点索引号或检索条件,查找某个结点。指按给定的结点索引号或检索条件,查找某个结点。如果找到指定的结点,则检索成功;
11、否则,检索失败。如果找到指定的结点,则检索成功;否则,检索失败。(3)插入插入指,在结点指,在结点ki-1与与ki之间插入一个新的结点之间插入一个新的结点k,使线使线性表的长度增性表的长度增1,且,且ki-1与与ki的逻辑关系发生如下变化:的逻辑关系发生如下变化: 插入前,插入前,ki-1是是ki的前驱,的前驱,ki是是ki-1的后继;插入后,新的后继;插入后,新插入的结点插入的结点k成为成为ki-1的后继、的后继、ki的前驱。的前驱。(4)删除删除操作是指,删除结点操作是指,删除结点ki,使线性表的长度减使线性表的长度减1,且,且ki-1、ki和和ki+1之间的逻辑关系发生如下变化:之间的逻
12、辑关系发生如下变化: 删除前,删除前,k ki i是是k ki i+1+1的前驱、的前驱、k ki i-1-1的后继;删除后,的后继;删除后,k ki i-1-1成为成为k ki i+1+1的前驱,的前驱,k ki i+1+1成为成为k ki i-1-1的后继的后继C语言程序设计语言程序设计18建立单向链表建立单向链表三个指针变量三个指针变量nhead:头指针变量,指向链表的第一个结点,头指针变量,指向链表的第一个结点,用作函数返回值。用作函数返回值。nP1:指向新申请的结点。指向新申请的结点。nP2:指向链表的尾结点,用指向链表的尾结点,用P2 -next= P1 ,实现将新申请的结点插入到
13、链表尾,使之成实现将新申请的结点插入到链表尾,使之成为新的尾结点。为新的尾结点。C语言程序设计语言程序设计19建立单向链表l建立头指针建立头指针headl建立第一个结点建立第一个结点p1lhead=p1;lP2指向前一个结点指向前一个结点l建立第二个结点建立第二个结点p1lP2-next=p1;lP2=p1;lP2-next=NULL;NULLheadNULLhead1p11head、p22p11head2p2NULLC语言程序设计语言程序设计20structstruct student student * *creatcreat(void)(void) structstruct studen
14、t student * *head,head,* *p1,p1,* *p2; n=0;p2; n=0; p1=p2=( p1=p2=(structstruct student student * *) )mallocmalloc(LEN);(LEN); scanfscanf(%ld %f ,&p1-num ,&p1-score);(%ld %f ,&p1-num ,&p1-score); head=NULL;head=NULL; While(p1-next!=0)While(p1-next!=0) n=n+1; n=n+1; if(n=1) head=p1; if(n=1) head=p1;
15、else p2-next=p1; else p2-next=p1; p2=p1; p2=p1; p1=( p1=(structstruct student student * *) )mallocmalloc(LEN);(LEN); scanfscanf(%ld %f ,&p1-num ,&p1-score);(%ld %f ,&p1-num ,&p1-score); p2-next=NULL; p2-next=NULL; return(head); return(head);C语言程序设计语言程序设计21遍历单向链表P=head;if(head!=NULL)dop=p-next;while(
16、p!=NULL);C语言程序设计语言程序设计22void print(struct student *head) struct student *p; p=head; printf(Number Scoren); while(p!=NULL) printf( %ld %5d,p-num,p-score); p=p-next; printf(n); C语言程序设计语言程序设计23插入结点l利用遍历的方法确定插入利用遍历的方法确定插入位置位置lP2为前一结点为前一结点,p为要插入为要插入的结点的结点lP-next=p2-next;lP2-next=p;1p23p12p1p23p12pC语言程序设计
17、语言程序设计24三个指针变量三个指针变量nhead:头指针变量头指针变量nP0:指向要插入的结点。指向要插入的结点。nP1:指向当前结点。指向当前结点。nP2:指向前一结点(即指向前一结点(即P1 原来指向的结点)原来指向的结点)C语言程序设计语言程序设计25四种情况:四种情况:1、空表、空表2、非空表,首节点之前、非空表,首节点之前3、非空表,非首节点之前,非尾节点之后、非空表,非首节点之前,非尾节点之后4、非空表,尾节点之后、非空表,尾节点之后 C语言程序设计语言程序设计26structstruct student student * *insert(insert(structstruct
18、 student student * *head,head,structstruct student student * *stud)stud) structstruct student student * *p0,p0,* *p1,p1,* *p2;p2; p1=head; p0=stud; p1=head; p0=stud; if(head=NULL) head=p0;p0-next=NULL; if(head=NULL) head=p0;p0-next=NULL; else else while( (p0-num p1-num) & (p1-next!=NULL) ) while( (p
19、0-num p1-num) & (p1-next!=NULL) ) p2=p1; p2=p1; p1=p1-next; p1=p1-next; if( p0-num num ) if( p0-num num ) if( head=p1 ) head=p0;if( head=p1 ) head=p0; else p2-next=p0; else p2-next=p0; p0-next=p1; p0-next=p1; else p1-next=p0;else p1-next=p0; p0-next=NULL; p0-next=NULL; return(head); return(head); C语
20、言程序设计语言程序设计27删除结点l利用遍历的方法确定要删除的结点利用遍历的方法确定要删除的结点p,p2为为p的的前一结点,即前一结点,即p2-next指向指向plP2-next=(p2-next)-next;lfree(p);1p23p12p1p23p12pC语言程序设计语言程序设计28structstruct student student * *delete(delete(structstruct student student * *head,long num)head,long num) structstruct student student * *p1,p1,* *p2;p2;
21、p1=head; p1=head; while(p1!=NULL) while(p1!=NULL) if(p1-num = num)if(p1-num = num) if(p1 = head) head=p1-next;if(p1 = head) head=p1-next; else p2-next=p1-next; else p2-next=p1-next; free(p1); free(p1); p2=p1; p2=p1; p1=p1-next; p1=p1-next; return(head); return(head); C语言程序设计语言程序设计29 struct link int
22、data; struct link *next; a,b,c,*p,*q; 且变量a 和b 之间已有如图所示的链表结构指针p 指向变量a,q 指向变量c. 则能够把c 插入到a 和b 之间并形成新的链表的语句组是A) a.next=c; c.next=b; B)p.next=q; q.next=p.next; C)p-next=&c;q-next=p-next D)(*p).next=q; (*q).next=&b; p q a 5 data next b data next 9 0 7 c data next C语言程序设计语言程序设计30struct STU char num10; flo
23、at score3; main() structSTUs3=20021,90,95,85, 20022,95,80,75, 20023, 100, 95,90,*p=s; int i; float sum=0; for(i=0;iscorei; printf(%6.2fn,sum); 程序运行后的输出结果是程序运行后的输出结果是D) 285.00 C) 280.00 B) 270.00 A) 260.00 C语言程序设计语言程序设计31ltab *insert(ltab *head, ltab *stud) ltab *p0, *p1, *p2; p1=head; p0=stud; while
24、(p0-nop1-no)&( ) p2=p1; p1=p1-next; if (p0-nono) if(head=p1) p0-next=head; head=p0; else p2-next=p0; else p1-next=p0; return (head); C语言程序设计语言程序设计32# includep36void main() struct info int data; struct info *pn; info base, p; base=NULL; for(int i=0; idata=i+1; p-pn=base; base=p; p=base; while(p!=NULL
25、) printf(%2d, p-data); p=p-pn; printf(n);输出结果为:输出结果为: C语言程序设计语言程序设计33设设head是是node类型的全程量,以类型的全程量,以head为头指针的链为头指针的链表各节点的值如下图所示。表各节点的值如下图所示。 head 3 ()4 ()5 ()6 ()7 NULL 调用调用fun(head)返回值是返回值是 。#include#define LEN sizeof(struct node) struct node int nun; struct node *next; ;C语言程序设计语言程序设计34int fun(struct node*h) int k=0; struct node*p=h; while(p!=NULL) if(p-next!=NULL)k+=p-num; p=p-next; return k; C语言程序设计语言程序设计35void main() struct node*head ,*p1,*p2; int i;head=(struct node *) malloc(LEN);p1=head;for(i=3;inext=p2;p2-num=i;p2-next=NULL;p1=p2;printf(“%dn”,fun(head-next);