1、8结构体第11章 结构体8.1 概述 数组 :子元素类型必须一致; 结构体:子元素类型一般不一致。8.1.1 结构体类型的定义 子元素称为域,可以是任何类型的数据,包括数组、指针、结构。 示例:简单的结构定义,理解结构类型的大小。struct student int code; char name10; float score; ;void main() struct student st1,st2; printf(%dd,sizeof(struct student); printf(%dd,sizeof(st1); 示例:嵌套的结构定义,理解结构类型的大小。struct date int y
2、ear, month, day; ;struct person char name10; struct date birth;void main() printf(%dd,sizeof(struct date) ); printf(%dd,sizeof(struct person) );8.1.2 类型的定义位置类型的定义位置类型的有效范围某函数内部某函数内部函数外部全文件示例:void main() struct student int code; char name10; float score; ; struct student st1,st2;void f() struct stude
3、nt st1,st2;struct student int code; char name10; float score; ;void main() struct student st1,st2;void f() struct student st1,st2;错误正确良好的编程风格: 将所有类型定义至于程序首部,以便所有函数共享。更良好的编程风格: 将所有类型保存为单独的*.h文件,使用#include以便更大范围的程序共享。Usertypes.hTest.cstruct student int code; char name10; float score; ;struct date int
4、year, month, day; ;struct person char name10; struct date birth;#include Usertypes.hvoid main() struct student st1,st2;void f() struct student st1,st2;8.1.3 结构体变量的定义在定义类型的同时,定义变量struct student . st1, st2;在定义了类型之后,定义变量struct student st1, st2; 利用typedef简化类型的书写:typedef struct student STUDENT;typedef st
5、ruct date DATE;typedef struct person PERSON;8.1.4 结构体变量示例:注意结构体变量的初始化方法;注意结构体变量中域值的操作方法。注意只有同类型的结构变量才可以相互赋值。#include Usertypes.hvoid main() STUDENT st1=1,XX,99,st2; DATE d1=1998,9,1; st2.code=2; st2.name=YY; st2.score=100; st1=st2; d1.year+; d1=st1; /* 语法错误 */ 示例:注意嵌套的结构变量的使用方法。void main() struct pe
6、rson p=XXX,2007,2,28; puts(p.name); p.birth.year=2008; p.birth.month=1; p.birth.day=31;8.2 结构体数组的应用8.2.1 结构体数组的初始化示例:注意结构数组的初始化方法;结构数组变量的使用方法。#include Usertypes.hvoid main() STUDENT sts3=1,AA,66,2,BB,77; sts2.code=3; sts2.name=CC; /* 错在哪里? */ sts2.score= sts0.score + sts1.score;8.2.2 结构体数组的输入/输出#inc
7、lude Usertypes.hvoid main() STUDENT sts3; int i; for(i=0; i3; i+) scanf(%d, &stsi.code); scanf(%s, stsi.name); scanf(%f, &stsi.score); for(i=0; i3; i+) printf(%d, stsi.code); printf(%s, stsi.name); printf(%f, stsi.score); 改进版本:void Input(STUDENT sts,int n);void Output(STUDENT sts,int n);void main()
8、STUDENT sts3; Input(sts,3); Ouput(sts,3);void Input(STUDENT sts,int n) int i; for(i=0; in; i+) scanf(%d, &stsi.code); scanf(%s, stsi.name); scanf(%f, &stsi.score); void Output(STUDENT sts,int n) int i; for(i=0; in; i+) printf(%d, stsi.code); printf(%s, stsi.name); printf(%f, stsi.score); 8.2.3 结构体数组
9、的查找int search(STUDENT s,int n,char name)void main() STUDENT sts3=1,w1,66,2,w2,77,3,w3,88; int i = search(sts, 3, w2); if(i!=-1) printf(%dn,stsi.score); else printf(NoFind!); int search(STUDENT s,int n,char name) int i; for(i=0; in; i+) if(strcmp(si.name,name)=0) return(i); return(-1);8.2.3 结构体数组的排序v
10、oid BubbleSort(STUDENT s,int n);void main() STUDENT sts4=1,w1,99,2,w2,77, 3,w3,66,2,w4,88,; BubbleSort(sts, 4); Output(sts, 4);void BubbleSort(STUDENT sts,int n) int i,j; STUDENT tmp; for(i=1; i=i; j-) if(stsj-1.score stsj.score) tmp=xj-1; xj-1=xj; xj=tmp; 8.3 指向结构体的指针 STUDENT * p;8.3.1 用结构指针遍历结构数组示
11、例:输出结构数组所有数据。void main() STUDENT sts3=1,w1,66,2,w2,77,3,w3,88; for(p=sts; ps+N; p+) printf(%d,%fn,(*p).code,(*p).score); for(p=sts; pcode,p-score); 8.3.2 用结构指针作为函数参数示例:用结构变量作为函数参数,观察“单向值传递”的效果。void f(STUDENT s);void main() STUDENT st1=1,AAA,75.5; f(st1);void f(STUDENT s) s.score+=20; strcpy(s.name,b
12、bb);示例:用结构变量的指针作为函数参数,实现“双向传递”的效果。void f(STUDENT *s);void main() STUDENT st1=1,AAA,75.5; f(&st1);void f(STUDENT *s) s-score+=20; strcpy(s-name,bbb);8.4 用指针处理链表8.4.1 链表概述数据集合中,每个元素除存储自身信息外,还需存储其后继元素的信息。结点(数据域,指针域): 链表的逻辑结构图:链表的存储示意图:链表的标识:头指针(head)8.4.2 最简单链表:将3个结点串成一个链表 仔细观察链表的内存结构、逻辑结构。struct node
13、int data; struct node *next;typedef struct node NODE;void main() NODE st1,st2,st3,*head; st1.data=10; st2.data=10; st3.data=10; head=&st1; st1.next=&st2; st2.next=&st3; st3.next=NULL; print(head);void print(NODE *head) NODE *p; for(p=head; p!=NULL; p=p-next) printf(%dn,p-data);8.4.3 申请/释放空间的函数申请空间NO
14、DE *p;p=(NODE *)malloc(sizeof(NODE);释放空间free(p);8.4.4 建立动态链表NODE * Create();void Print(NODE *head);void main() NODE *head=Create(); Print(head);NODE * Create(); NODE *head=NULL, *newp, *lastp; while(1) newp=(NODE *)malloc(sizeof(NODE); scanf(%d,&new-data); if(newp-data=-1) break; if(head=NULL) head=
15、lastp=newp; else lastp-next=newp; lastp=newp; lastp-next=NULL; return(head);8.4.5 查找结点NODE *Search(NODE *head, int data) NODE *p; for(p=head; p!=NULL; p=p-next) if(p-data=data) return(p); return(NULL);8.4.6 删除结点 删除值为data的结点。NODE *Delete(NODE *head, int data) NODE *p, *prev; if(head=NULL) return(NULL
16、); if(head-data=data) p=head; head=head-next; free(p); return(head); for(prev=head,p=head-next; p; prev=p,p=p-next) if(p-data=data) break; if(p) prev-next=p; free(p); return(head);8.4.7 插入结点 在链表首结点之前,插入新结点。NODE *Insert(NODE *head, int data) NODE *newp; newp=(NODE *)malloc(sizeof(NODE); newp-data=data; if(head=NULL) newp-next=NULL; return(newp); newp-next=head-next; head-next=newp; return(head);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1