ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:653.64KB ,
资源ID:23503139      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23503139.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言结构体变量与链表知识总结.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C语言结构体变量与链表知识总结.docx

1、C语言结构体变量与链表知识总结结构体与链表11.1 结构体类型的定义结构体是由C语言中的基本数据类型构成的、并用一个标识符来命名的各种变量的组合,其中可以使用不同的数据类型。1.结构体类型的定义Struct结构体名 类型标识符1 成员名1;类型标识符2 成员名2;类型标识符n 成员名n;;Struct结构体名结构体类型名2.关于结构体类型的说明:(1)“struct 结构体名”是一个类型名,它和int、float等作用一样可以用来定义变量。(2)结构体名是结构体的标识符不是变量名,也不是类型名。(3)构成结构体的每一个类型变量称为结构体成员,它像数组的元素一样,单数组中元素以下标来访问,而结构

2、体是按结构体变量名来访问成员的。(4)结构体中的各成员既可以属于不同的类型,也可以属于相同的类型。(5)成员也可以是一个结构体类型,如:Struct dateInt month;Int day;Int year;Struct personFloat num;Char name20;Char sex;Int age;Struct date birthday;Char address10;11.2 结构体类型变量11.2.1 结构体类型变量的定义1.先定义结构体类型,再定义结构体变量形式:Struct 结构体名类型标识符1 成员名1; 类型标识符2 成员名2; 类型标识符n 成员名n;;Struc

3、t 结构体名 变量名表;例如:Struct studentchar name20; Char sex; Int age; Float score;Struct student stu1,stu2;2.在定义结构体类型的同时定义变量形式:Struct 结构体名类型标识符1 成员名1;类型标识符2 成员名2;类型标识符n 成员名n;变量名表;例如:Struct studentChar name20;Char sex;Int age;Float score;stu1,stu2;3.用匿名形式直接定义结构体类型变量形式:Struct类型标识符1 成员名1;类型标识符2 成员名2;类型标识符n 成员名n

4、;变量名表;例如:StructChar naem20;Char sex;Int age;Float score;stu1,stu2;11.2.2 结构体变量的使用结构体是一种新的数据类型,因此结构体变量也可以像其它类型的变量一样赋值、运算,不同的是结构体变量以成员作为基本变量。结构体成员的表示方式为:结构体变量名.成员名其中的圆点运算符称为成员运算符,它的运算级别最高。如果将“结构体变量名.成员名”看成一个整体,则这个整体的数据类型与结构体中该成员的数据类型相同,这样就可以像前面所讲的变量那样使用,但应遵循以下规则:(1)不能将一个结构体变量作为一个整体进行输入和输出,而只能对结构体变量中的各

5、个成员分别进行输入和输出。Struct dateInt month;Int day;Itn year;day;Scanf(“%d%d%d”,day);(错误)Scanf(“%d%d%d”,&day.year,&day.month,&day.day);(正确)Printf(“%d%d%d”,day);(错误)Printf(“%d%d%d”,day.year,day.month,day.day);(正确)(2)如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最底的一级的成员,只能对最底级的成员进行赋值或存取运算。Struct dateInt month;Int day;In

6、t year;Struct studentLong num;Char naem20;Char sex;Int age;Struct date birthday;Char depart10;stu1;如:stu1.birthday.year=2004;Stu1.birthday.month=12;(3)对结构体变量的成员可以像同类型普通变量一样进行各种运算。11.2.3 结构体变量的初始化与存储1.结构体变量的初始化:在定义结构体变量的同时给它赋以初值。Struct studentChar name20;Char sex;Int age;Float score;stu1,stu2=“wangwu

7、”,m,20,88.5;2.结构体变量所占内存的字节数struct 类型用内存字节数=?是所有成员变量的内存总和吗?用运算符sizeof获得结构体大小Sizeof(变量或表达式)Sizeof(类型)Typedef struct sampleChar m1;Int m2;Char m3;SAMPLE;Printf(“%dn”,sizeof(struct sample);Printf(“%dn”,sizeof(SAMPLE);并非所有成员变量的内存总和事实上,所有数据类型在内存中都是从偶数地址开始存放的且结构所占的实际空间一般是按照机器字长对齐的不同编译器、平台,对齐方式会有变化结构体变量的成员存

8、储对齐规则是与机器相关的具有特定数据类型的数据项大小也是与机器相关的所以一个结构体在内存中的存储格式也是与机器相关的3.结构体变量存储分配示意图11.3 结构体类型数组11.3.1 结构体数组的定义与使用结构体是一种新的数据类型,同样可以有结构体数组。1、结构体数组的定义结构体数组就是具有相同结构体类型的变量集合。Struct 结构体名类型标识符1 成员名1;类型标识符2 成员名2;类型标识符n 成员名n;数组名整型常量表达式;加入要定义一个班级100个同学的学号、姓名、性别、年龄,可以定义成一个结构体数组。如下所示:StructLong num;Char name20;Char sex;In

9、t age;stu100;11.3.2 结构体数组的初始化一般形式是在定义的数组后面加上=初始值表列;Struct studentLong num;Char name20;Char sex;Int age;Float score;Char add5;stu3=101,”WGJ”,M,28,88.5,”CS”102,”DYH”,F,26,88.0,”CS”103,”DYC”,M,24,78.5,”CS”;11.3.3 结构体数组的使用结构体数组成员的访问十一数组元素为结构体变量的,其形式为:结构体数组元素名.成员名如:stu2.age【例11.1】候选人得票的统计。设有三个候选人,每次输入一个得

10、票的候选人名字,要求最后输出各人得票结果。Struct personChar name20;Int count;leader3=“Zhang”,0,”Li”,0,”Wang”,0;Main()Int i,j;Char leader_name20;For(i=1;i=10;i+)Scanf(“%s”,leader_name);For(j=0;j3;j+)If(strcmp(leader_name,leaderj.name)=0)Leaderj.count+;Printf(“n”);For(i=0;i成员名-为指向运算符如:上面示例用指针变量引用其成员的方式为:(*pstu).num , (*ps

11、tu).name(*pstu).sex , (*pstu).score可以等价表示为:Pstu-num,pstu-name,pstu-sex,pstu-score例11.2 比较结构体成员的几种引用方式#include “stdio.h”Main()Struct studentLong int num;Char name20;Char sex;Float score;Struct student stu_1;Struct student *p;P=&stu_1;Stu_1.num=200601;Strcpy(stu_1.name,”liping”);Stu_1.sex=M;Stu_1.scor

12、e=811.5;Printf(“No.:%ldnname:%ssex:%cnscore:%fn”,stu_1.num,sut_1.name,stu_1.score);Printf(“nNo.:%ldnname:%snsex:%cscore:%fn”,(*p).num,(*p).name,(*p).sex,(*p).score);Printf(“nNo.:%ldnname:%snsex:%cnscore:%fn”,p-num,p-name,p-sex,p-score);11.4.2 指向结构体数组元素的指针一个指针变量可以指向一个结构体数组元素(将该结构体数组的数组元素地址赋给此指针变量)。例如

13、:StructInt a;Float b;arr3,*p;P=arr;此时使p指向arr数组的第一个元素,“p=arr;”等价于“p=&arr0;”。若执行“p+;”则此时指针变量p此时指向arr1。例11.3 输出数组中各元素中各成员的值。Struct studentInt num;Char name20;Char sex;Int age;Struct student stu3=10101,”zhang”,m,18,10102,”li”,m,19,10103,”wang”,f,20;Main()Struct student *p;Printf(“No.Name sex agen”);For(

14、p=stu;pnum,p-name,p-sex,p-age);注意:(1)如果p的初值为stu,即指向第一个元素,则p+1后指向下一个元素。请区别:(+p)-num和(p+)-num(2)指针p已定义为指向struct student类型的数据,它只能指向该结构体类型数据,而不能指向一元素的某以成员(即p的地址不能是成员的地址)。如下面的赋值是错误的:p=&stu.num编译时将给出“警告”信息,表示地址的类型不匹配。不要认为反正p是存放地址的,可以将任何地址赋给它。11.5 结构体与函数11.5.1 结构体变量作函数参数将一个结构体变量的值传递给另一个函数,可以采用以下两种方式:用结构体变量

15、的成员作参数。用法和普通变量作实参是一样的,属“值传递”方式。形参与实参都用结构体变量直接将实参结构体变量的各个成员之全部传递给形参的结构体变量。注意:实参和形参类型应当完全一致。例11.4 有一个结构体变量stu,内含学生学号、姓名和三门课的成绩。要求在main函数中赋值,在另一函数print中将它们打印输出,程序如下。Struct stuInt num;Char name20;Int score3;Main()Void print(struct stu p);Struct stu stu;int j;Scanf(“%d”,&stu.num);Scanf(“%s”,stu.name);For

16、(j=0;j3;j+)Scanf(“%d”,&stu.scorej);Print(stu);Void print(struct stu p)Int j;Printf(“%dn%sn”,p.num,p.name);For(j=0;j3;j+)Printf(“%dn”,p.scorej);注意:ANSI C允许用整个结构体作为函数的参数传递,但是必须保证实参与形参的类型相同。值得指出的是,把一个完整的结构体变量作为参数传递,虽然合法,但要将全部成员一个一个传递,既费时间又费空间,开销大,因此一般不采用。11.5.2 用指向结构体的指针作函数参数用指向结构体变量(或数组)的起始地址传给形参。形参为指

17、针变量,实参为结构体变量的地址或指向结构体变量的指针。例11.4的print函数形参改用指向结构体指针后程序如下:#include “stdio.h”Struct studentInt num;Char name20;Int score3;Main()void print(struct student *p);Struct student stu;int j;Scanf(“%d”,&stu.num);Strcpy(stu.name,”liping”);For(j=0;jnum,p-name);For(j=0;jscorej);11.5.3 返回结构体类型值的函数ANSI C还允许函数返回结构体

18、类型的值。设有struct student 类型,结构体变量定义如下:Struct student stud;若函数input()的功能是输入一个学生结构体数据,并将其返回给学生记录stud,即:#include “stdio.h”Struct studentint num;Char name10;Int score3;Struct student input()Int k;Struct student stud;Scanf(“%d”,&stud.num);Getchar();Gets(stud.name);For(k=0;k3;k+)Scanf(“%d”,&stud.scorek);Retu

19、rn stud;Main()Struct student stud;Int k;Stud=input();Pritnf(“%d%s”,stud.num,stud.name);For(k=0;knum,p-name);P=p-next;while(p!=NULL);11.6.2 内存管理库函数链表结构是动态分配存储的,即在需要时才开辟一个结点的存储单元,怎样开辟呢?C语言编译系统中提供了以下有关的函数:1、分配存储空间函数malloc()Malloc()函数的原型为:Void *malloc(unsigned int size);函数的作用是在内存自由空间开辟一块大小为size字节的空间,并将此

20、存储空间的起始地址作为函数值带回。例如,malloc(10)的结果是分配了一个长度为10字节的内存空间,若系统设定的此内存空间的起始地址为1800,则malloc(10)的函数返回值就为1800.例11.6 malloc函数的使用Main()Int j,n,*p;Printf(“nplease input a data to n:”);Scanf(“%d”,&n);P=(int *)malloc(n*sizeof(int);Printf(“nplease input %d datas:”,n);For(j=0;jn;j+)Scanf(“%d”,p+j);For(j=0;jnext=NULL;P

21、rintf(“nplease input datas to the list:”);Scanf(“%ld”,&x);While(x!=0)P=(struct student *)malloc(sizeof(struct student);P-num=x;P-next=NULL;q-next=p;q=p;Scanf(“%ld”,&x);Return (head);2.输出链表Void print(struct student *head)Struct student *p;P=head-next;Printf(“nthe list is:”);If(p=NULL)Printf(“the list

22、 is NULL!n”);While(p!=NULL)Printf(“%6ld”,p-num);P=p-next;Printf(“n”);3.删除链表中的一个结点Void del(struct student *head)Struct student *p,*q;Long num;Printf(“nplease input the student num you want to delete:”);Scanf(“%ld”,&num);P=head-next;While(num!=p-num & p-next!=NULL)Q=p;P=p-next;If(num=p-num)q-next=p-next;Free(p);elsePrintf(“n%ld is not found!n”,num);4.在链表中插入一个结点Void insert(struct student *head)Struct student *p,*q,*t;P=(struct student *)malloc(sizeof(struct student);Printf(“nplease input the student you want to insert:”);Scanf(“%ld”,&p-num);Q=head

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1