




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计主讲教师:陈荣钦Email:chen_rongqin@163.comC数据类型指针类型空类型void定义类型typedef构造类型枚举类型enum数组结构体struct共用体union基本类型字符类型char实型单精度型float双精度型double整型短整型short长整型long整型int只能定义单一的数据类型,反映事物单一属性结构体学习的意义
如定义学生成绩:
floatscore;能定义复杂的数据类型,反映事物多个属性如定义学生信息:structSTU{charno[9];//学号
charname[12];//姓名
charsex;//性别
floatscore;//成绩}student;1、结构体类型的定义struct[结构体类型名]{
数据类型名1成员名1;数据类型名2成员名2;
……
数据类型名n成员名n;};struct是关键字,不能省略合法标识符可省:无名结构体成员类型可以是基本型或构造型以分号;结尾
例1:struct
Student_Info{charno[9];//学号
charname[20];//姓名
charsex;//性别
unsignedintage;//年龄
unsignedint
classno;//班级
floatgrade;//成绩};例2:structDate{
intyear;//年
intmonth;//月
intday;//日};struct
Student_Info{charno[9],name[20],sex;unsignedintage,classno;floatgrade;};struct
Student_Infostudent;例:2、结构体变量的定义和引用struct
结构体类型名{
数据类型名1成员名1;
……
数据类型名n成员名n;};struct
结构体类型名变量名列表;结构体变量的定义间接定义法:先定义结构类型,再定义结构变量
……9字节20字节1字节2字节2字节4字节nonamesexageclassnograde内存映像(BC下)2、结构体变量的定义和引用struct[结构体类型名]{
数据类型名1成员名1;
……
数据类型名n成员名n;}变量名列表;结构体变量的定义直接定义法:定义结构体类型的同时定义结构体变量
struct
Student_Info{charno[9];//学号
charname[20];//姓名
charsex;//性别
unsignedintage;//年龄
unsignedint
classno;//班级
floatgrade;//成绩}student1,student2;struct{charno[9];//学号
charname[20];//姓名
charsex;//性别
unsignedintage;//年龄
unsignedint
classno;//班级
floatgrade;//成绩}student1,student2;或无名结构体定义,变量只能一次例
structstudent{
intnum;charname[20];charsex;
intage;floatscore;charaddr[30];}stu,*pstu=&stu;strcpy(,"zhangMing");
stu.score=80;
pstu->score+=10;
printf("%s%f",,(*pstu).score);
结构体变量的引用引用规则结构体变量名.成员名//非指针型结构体变量的引用结构体指针->成员名或
(*结构体指针).成员名//指针型结构体变量的引用strcpy(stu1.no,stu.no);strcpy(,);stu1.sex=stu.sex;stu1.age=stu.age;stu1.classno=stu.classno;stu1.grade=stu.grade;struct
Student_Info
stu;
strcpy(stu.no,"20020306");strcpy(,"ZhangMing");stu.sex='M';stu.age=18;stu.classno=1;stu.grade=90;struct
Student_Infostu1;stu1=stu;3、结构体变量的赋值逐一赋值
利用已赋值的结构体变量赋值
memcpy
(&stu1,&stu,sizeof(struct
Student_Info));5、结构体数组
结构体数组的每一个元素都是具有相同结构体类型的下标结构变量。结构体数组的定义agenonamesexclassnogradeagenonamesexclassnograde…stu[0]stu[9]……形式一:struct
Student_Info{charno[9],name[20],sex;unsignedintage,classno;floatgrade;};struct
Student_Infostu[10];结构体数组的引用引用格式为:结构体数组名[下标].成员名;struct
Student_Info{charno[9];charname[20];charsex;unsignedintage;unsignedint
classno;floatgrade;}stu[10];strcpy(stu[0].name,"WangFei");
stu[1].grade++;printf("%s",stu[0].name);线性链表1、线性链表概述及其结构
线性表:当一组数据元素形成了“前后”关系时,我们称之为线性表
线性表在内存中的两种形式顺序表:以数组的形式存放,元素在内存中是连续存放的线性链表:数据元素在内存中不需要连续存放,而是通过指针将各数据单元链接起来,就象一条“链子”一样将数据单元前后元素链接起来
特点:插入或删除一个数据元素时,需要移动其它数据元素
特点:插入或删除一个数据元素时,不需要移动其它数据元素
节点实际数据链表头节点…headtail数据1数据2数据n^表示NULL数据域指针域线性链表中的节点可以用一个结构体类型来定义,其形式为:
struct
节点结构体类型名{
数据成员定义;
struct
节点结构体类型名
*指针变量名;};例:struct
Grade_Info{
intscore;
struct
Grade_Info*next;};typedef
struct
Grade_Info
NODE;
2、线性链表的基本操作基本操作有:创建、插入、删除、输出和销毁等。链表的创建操作
含义:从无到有地建立起一个链表,即往空链表中依次插入若干结点,并保持结点之间的前驱和后继关系。
基本思想:首先创建一个头节点,让头指针head和尾指针tail都指向该节点,并设置该节点的指针域为NULL(链尾标志);然后为实际数据创建一个节点,用指针pnew指向它,并将实际数据放在该节点的数据域,其指针域置为NULL;最后将该节点插入到tail所指向节点的后面,同时使tail指向pnew所指向的节点。【例】链表创建操作函数Create_LinkList。head∧tailNODE*Create_LinkList()//创建链表{NODE*head,*tail,*pnew;
int
scor;
head=(NODE*)malloc(sizeof(NODE));
//创建头节点
if(head==NULL)//创建失败,则返回
{
printf("noenoughmemory!\n");return(NULL);}head->next=NULL;//头节点的指针域置NULLtail=head;//开始时尾指针指向头节点
pnew->score=score;
pnew->next=NULL;
tail->next=pnew;
tail=pnew;}return(head);}【例】链表创建操作函数Create_LinkList。head∧tailinputthescoreofstudents:70↙pnew70∧tail65↙pnew65∧tail78↙pnew78∧tail90↙pnewtail90∧95↙pnewtail95∧-1↙
printf("inputthescoreofstudents:\n");while(1)//创建学生成绩线性链表
{
scanf("%d",&score);//输入成绩
if(score<0)//成绩为负,循环退出
break;
//创建一新节点
pnew=(NODE*)malloc(sizeof(NODE));
if(pnew==NULL)//创建新节点失败,则返回
{
printf("noenoughmemory!\n");return(NULL);}2、线性链表的基本操作链表的插入操作
含义:在第i个结点Ni与第i+1节点Ni+1之间插入一个新的结点N,使线性表的长度增1,且Ni与Ni+1的逻辑关系发生如下变化:插入前,Ni是Ni+1的前驱,Ni+1是Ni的后继;插入后,新插入的结点N成为Ni的后继、Ni+1的前驱
基本思想:通过单链表的头指针head,首先找到链表的第一个结点;然后顺着结点的指针域找到第i个结点,最后将pnew指向的新结点插入到第i个结点之后。插入时首先将新节点的指针域指向第i个结点的后继节点,然后再将第i个结点的指针域指向新节点。注意顺序不可颠倒。当i=0时,表示头节点。
【例】链表插入操作函数Insert_LinkList
。voidInsert_LinkList(NODE*head,NODE*pnew,inti){NODE*p;
intj;p=head;for(j=0;j<i&&p!=NULL;j++)//将p指向要插入的第i个节点
p=p->next;if(p==NULL)//表明链表中第i个节点不存在
{
printf("the%dnodenotfoundt!\n",i);return;}
pnew->next=p->next;
//将插入节点的指针域指向第i个节点的后继节点
p->next=pnew;
//将第i个节点的指针域指向插入节点}
head70657890∧0123465pnew假设i=2ppp2、线性链表的基本操作链表的删除操作
含义:删除链表中的第i个结点Ni,使线性表的长度减1。删除前,节点Ni-1是Ni的前驱,Ni+1是Ni的后继;删除后,结点Ni+1成为Ni-1的后继。
基本思想:通过单链表的头指针head,首先找到链表中指向第i个结点的前驱节点的指针p和指向第i个节点的指针q;然后删除第i个结点。删除时只需执行p->next=q->next即可,当然不要忘了释放节点i的内存单元。注意当i=0时,表示头节点,是不可删除的。
【例】链表删除操作函数Delete_LinkList
。voidDelete_LinkList(NODE*head,inti){NODE*p,*q;
intj;//删除的是头指针,则返回if(i==0)return;
p=head;//将p指向要删除的第i个节点的前驱节点
for(j=1;j<i&&p->next!=NULL;j++)p=p->next;
if(p->next==NULL)//表明链表中第i个节点不存在
{
printf("the%dnodenotfoundt!\n",i);return;}head70657890∧01234假设i=2p
q=p->next;
//q指向待删除的节点ip->next=q->next;
//删除节点i
free(q);
//释放节点i的内存单元}
pq2、线性链表的基本操作链表的输出操作
含义:将链表中节点的数据域的值显示出来。如果在输出过程中,对数据进行相应的比较,则可实现对链表的检索操作。
基本思想:通过单链表的头指针head,使指针p指向实际数据链表的第一个节点,输出其数据值,接着p又指向下一个节点,输出其数据值,如此进行下去,直到尾节点的数据项输出完为止,即p为NULL为止。
voidDisplay_LinkList(NODE*head){NODE*p;for(p=head->next;p!=NULL;p=p->next)
printf("%d",p->score);
printf("\n");}【例】链表输出操作函数Display_LinkList
。2、线性链表的基本操作链表的销毁操作
含义:将创建的链表从内存中释放掉,达到销毁的目的
基本思想:每次删除头节点的后继节点,最后删除头节点。注意,不要以为只要删除了头节点就可以删除整个链表,要知道链表是一个节点一个节点建立起来的,所以销毁它也必须一个一个节点的删除才行。voidFree_LinkList(NODE*head)
{NODE*p,*q;p=head;while(p->next!=NULL){q=p->next;p->next=q->next;free(q);}free(head);}【例】链表销毁操作函数Free_LinkList
。head70657890∧01234pqqqq∧位运算1.按位与──&
(1)格式:x&y
(2)规则:对应位均为1时才为1,否则为0:3&9=1。例如,3&9=1:0011&1001 ──── 0001=1 (3)主要用途:取(或保留)1个数的某(些)位,其余各位置0。
位运算
2.按位或──|
(1)格式:x|y
(2)规则:对应位均为0时才为0,否则为1:3|9=11。例如,3|9=11:0011 |1001──── 1011=11
(3)主要用途:将1个数的某(些)位置1,其余各位不变。位运算3.按位异或──^(1)格式:x^y(2)规则:对应位相同时为0,不同时为1:3^9=10。(3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变。位运算4.按位取反──~(1)格式:~x(2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1:在IBM-PC机中,~0=0xffff,~9=0xfff6。(3)主要用途:间接地构造一个数,以增强程序的可移植性。位运算5.按位左移──<<(1)格式:x<<位数(2)规则:使操作数的各位左移,低位补0,高位溢出:5<<2=20。6.按位右移──>>(1)格式:x>>位数(2)规则:使操作数的各位右移,移出的低位舍弃;高位:1)对无符号数和有符号中的正数,补0;2)有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。例如,20>>2=5。文件的打开、读写和关闭文件使用方式:打开文件-->文件读/写-->关闭文件打开文件fopenFILE*fopen(char*filename,char*mode);
函数原形:要打开的文件名打开文件方式功能:按指定方式打开文件返值:正常打开,为指向文件结构体的指针;打开失败,为NULL例:FILE*fp;fp=fopen("wang.txt","r");if(fp==NULL){
printf("thefile:wang.txtnotfound!");exit(-1);}关闭文件fcloseint*fclose(FILE*filepointer);
函数原形:文件打开时返回的文件类型指针功能:关闭filepointer指向的文件返值:正常关闭为0;出错时,非0
作用:使文件指针变量与文件“脱钩”,释放文件结构体和文件指针FILE*fp;fp=fopen("wang.txt","r+");if(fp==NULL){
printf("thefile:wang.txtnotfound!");exit(-1);}……//读取和加工数据fc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 驾校业务员工作总结
- 老梗后遗症的护理
- 公司独立董事聘任合同二零二五年
- 离婚后财产分配协议书范例二零二五年
- 家长心理健康知识培训
- 二零二五二手房过户协议书范例
- 招聘合同书范例
- 二零二五版房地产策划服务合同范例
- 餐饮托管合作协议书
- 骨皮牵引术护理技术要点
- 《沉淀溶解平衡》说播课课件(全国高中化学优质课大赛获奖案例)
- 技能比赛自我介绍
- 五年级《红楼梦》知识考试题库(含答案)
- 公积金提取单身声明
- 安全培训证明
- 陕西省西安市各县区乡镇行政村村庄村名居民村民委员会明细及行政区划代码
- 三年级道德与法治下册不一样的你我他
- 2022年龙岩市第一医院医护人员招聘笔试模拟试题及答案解析
- 2022版义务教育语文课程标准(2022版含新增和修订部分)
- 色谱、质谱、联用
- 苏教版小学数学四年级下册《图形旋转》练习题
评论
0/150
提交评论