《13 结构体、联合体、链表.ppt》由会员分享,可在线阅读,更多相关《13 结构体、联合体、链表.ppt(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、结构体、联合体、枚举 本章主要内容结构体typedef联合体链表枚举(选学)结构体在保存复杂数据内容时,比方说同时保存一个人的姓名和年龄,我们前面学过的简单数据类型无法满足要求,C语言中提供了结构体类型,用简单的数据类型,或其他已经定义的复杂类型,来构造一个结构体类型结构体的定义格式:Struct 结构体类型名 类型1 成员1;类型2 成员2;.;结构类型变量的声明在C语言中声明结构体变量格式:struct 结构体类型名 变量列表在C+中声明方法和简单变量声明方法相同,格式:结构体类型名 变量列表结构体变量可以用元素值表方式进行初始化除象原来那样声明方法外,还可以直接在结构体说明的后面跟变量列
2、表进行说明如:struct studentchar name10;int age;st1=“TOM,20,st10,*pst=&st1;有关结构体变量的说明如有声明:struct studentchar name10;int age;st1,st2,*pst=&st1;指针所指单元的子元素可以使用-运算符,如(*pst).age 可以写成 pst-age结构体单元之间可以互相赋值,可用作函数参数,可以作为函数返回值typedef用typedef可以把一个数据类型名称定义为另外一个名称,如:typedef float real;这样以后在声明float a;变量时,也可以写做 real a;用t
3、ypedef 可以把结构体类型定义成一个简短的名字,方便使用,如:typedef struct student stype;/这样就可以用stype声明变量了结构体声明与访问举例-1#include#include struct student int id,age;char name10;st1;struct student st2;/in c must include struct;student st3;void main()student st4,sta10,*pst;st1.id=12;strcpy(st1.name,zhangsan);sta0.id=56;pst=&st4;pst
4、-age=78;printf(ID:%d,age:%d,name:%sn,st1.id,st1.age,st1.name);结构体声明与访问举例-2#include struct student int id,age;student fun(student a)a.age*=2;return a;void main()student b,c,d;b.id=1;b.age=20;c=b;d=fun(c);printf(%d,%dn,d.id,d.age);printf(%d,%dn,c.id,c.age);联合体定义格式:union 类型名 包含分量引用操作方法与结构体相同不同的是联合体各分量共
5、享分配的空间,因此同时只能使用其中一项分量系统给结构体分配的空间为结构体各分量占用空间之和,而给联合体分配的空间是组成联合体各分量占用空间的最大值联合体举例#include union utlong l;char c;short s;u;void main()u.l=0 x88776655l;printf(%dn,sizeof(ut);printf(%x,%x,%xn,int(u.c),u.s,u.l);u.s=0 x4433;printf(%x,%x,%xn,int(u.c),u.s,u.l);u.c=0 x22;printf(%x,%x,%xn,int(u.c),u.s,u.l);链表及操
6、作链表是一种重要的存储结构,在物理存储上各单元是不连续的,一个单元记住另一个单元的地址,如以下图所示对链表的常见操作包括,遍历,插入元素,删除元素等链表还可以用两个地址单元,分别记住前一个单元的地址和后一个地址,这被成为双向链表让链表最后一个单元的指针保存首结点的地址,就可以构造循环链表链表的建立建造十个结点的链表,结点结构为struct student int id;student*next;结点值为09,构造完后,遍历输出然后把建立和遍历功能分别移到createLink showLink函数中/用函数建造链表#include struct student int id;student*ne
7、xt;student*createLink()int i;student*h,*lp,*np;h=lp=new student;for(i=0;iid=i;np-next=NULL;lp-next=np;lp=lp-next;return h;void showLink(student*h)student*p;p=h-next;while(p!=NULL)printf(%d,p-id);p=p-next;printf(n);void main()student*h;h=createLink();showLink(h);结点插入函数/在值为key结点后插入结点valueint insertAft
8、er(student*h,int key,int value)student*p,*np;p=h-next;while(p-id!=key&p)/寻找结点p=p-next;if(p)/找到np=new student;np-id=10;np-next=p-next;p-next=np;return 1;elsereturn 0;删除结点/删除指定值的结点int delNode(student*h,int key)student*p,*lp;p=h-next;while(p-id!=key&p)lp=p;p=p-next;if(p)lp-next=p-next;delete p;return 1
9、;elsereturn 0;双向链表struct student int id;student*next;student*last;玫举类型(选学)enum coinpenny,nickle,dime,quarter,half_dollar,dollarenum coinpenny,nickle=5,dime,quarter,half_dollar,dollarenum coinpenny=1,nickle=5,dime=10,quarter=25,half_dollar=50,dollar=100enum stateready,run,stop枚举举例(选学)#include enum coinpenny,nickle,dime,quarter,half_dollar,dollar;/enum coinpenny,nickle=5,dime,quarter,half_dollar,dollar;/enum coinpenny=1,nickle=5,dime=10,quarter=25,half_dollar=50,dollar=100;void main()coin t;printf(%d,%d,%d,%d,%d,%dn,penny,nickle,dime,quarter,half_dollar,dollar);
限制150内