版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
语言程序设计C语言程序设计第9章结构体类型用户自定义数据类型用指针处理链表59.5.1什么是线性链表数组:静态分配存储单元,容易造成内存浪费。链表:根据需要,动态分配内存单元。head1249135614751021A1356B1475C1021DNull
1249datanextheaddatanextdatanextdataNULL用指针处理链表59.5.1什么是线性链表链表各结点的特点:在内存中可以不连续,访问某结点应找上一结点提供的地址,每一结点有一指针变量存放下一结点的地址。链表的每个结点实际上是一个结构体变量,它有若干成员组成,包括的内容有两部分:数据部分:整、实、字符、结构体等类型。指针变量:通常具有指向自身结构体类型的指针变量,此指针变量用来存放下一结点的地址,以便一环扣一环而形成链表。
structstudent{
intnum;intscore;
structLink*next;};用指针处理链表5例9.8建立静态链表处理学生信息1.问题提出:2.解题思路:构成链表?
head?
p?3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:#include<stdio.h>#defineNULL0structstudent{longnum;floatscore;structstudent*next;};intmain()
{structstudenta,b,c,*head,*p;a.num=10101;a.score=89.5;b.num=10103;b.score=90;c.num=10107;c.score=85;
head=&a;
a.next=&b;
b.next=&c;c.next=NULL;
p=head;
do{printf(“%ld%5.1f\n”,pnum,pscore);
p=pnext;
}while(p!=NULL);}用指针处理链表59.5.3建立动态链表malloc函数:void*malloc(unsignedintsize);calloc函数:void*calloc(unsignedn,unsignedsize);作用:在动态区分配一个长度为size的连续空间,函数返回值是一个指向分配域起始地址的指针,如内存空间不足,返回空指针NULL。(此处:void为无确定类型)作用:在内存动态区分配n个长度为size的连续空间,函数返回指向分配域起始地址的指针,若分配不成功,返回NULL值。free函数:voidfree(void*p);作用:释放由p指向的内存区,使这部分内存区能被其它变量使用。P所指向的是最近一次calloc或malloc分配的存储区域。free函数无返回值。#include“malloc.h”用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p,head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:#include“stdio.h”#include“malloc.h”#defineNULL0#defineLENsizeof(structstudent)structstudent{longnum;floatscore;structstudent*next;};intn;Intmain()
{structstudent*head;structstudent*p;
head=p=(structstudent*)malloc(LEN);scanf(“%ld,%f”,&pnum,&pscore);head->next=NULL;
p=head;printf(“\n结点1:%d,%6.2f\n”,p->num,p->score);p=p->next;
printf(“\n结点2:%d,%6.2f\n”,p->num,p->score);return0;}用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p,head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:n=n+1n==1head=p1p2next=p1真假(把p1所指结点作为第一个结点)(把p1所指结点连接到表尾)p2=p1(p2移到表尾)再开辟一个新结点,使p1指向它读入一个学生数据给p1所指结点表尾结点的指针变量置NULL开辟一个新结点,并使p1,p2指向它读入一个学生数据给p1所指向的结点head=NULL,n=0当读入的p1num不是零用指针处理链表5(n=1)9910189.5headp1p2(a)(n=2)headp2p19910189.59910390headp2p19910189.59910390(b)(n=2)p2=p1headp2p19910189.59910390(c)(n=2)用指针处理链表59910189.59910390headp2p19910785(a)n=39910189.59910390headp2p19910785(b)n=39910189.59910390p2p19910785(a)n=3head00009910189.59910390p2p19910785NULL(b)n=3head用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点#include“stdio.h”#include“malloc.h”#defineNULL0#defineLENsizeof(structstudent)structstudent{longnum;floatscore;structstudent*next;};intn;structstudent*creat(void){structstudent*head;structstudent*p1,*p2;n=0;p1=p2=(structstudent*)malloc(LEN);scanf(“%ld,%f”,&p1num,&p1score);head=NULL;while(p1num!=0){n=n+1;if(n==1)head=p1;elsep2next=p1;p2=p1;p1=(structstudent*)malloc(LEN);scanf(“%ld,%f”,&p1num,&p1score);}p2next=NULL;return(head);}建立链表用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点voidprint(structstudent*head){structstudent*p;printf(“\nNow,these%drecordsare:\n”,n);p=head;if(head)!=NULL)do{printf(“%ld,%5.2f\n”,pnum,pscore);p=pnext;}while(p!=NULL);}P=head,使p指向第一个结点P指向的不是尾结点真假输出p所指向的结点p=pnext当p指的不是表尾NULLheadPP’输出链表用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点99101headp19910399107NULL(a)初始状态p2(b)下移一个结点
headp199107NULL9910199103p2=p1head=p1nextheadp1(c)选中第一个结点9910199107NULL99103headp2p1p2next=p1next(d)第二个结点被删除99107NULL9910199103删除链表用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点删除链表p1是要删除的结点是否
链表是一个空表真假输出空表p1=head
当num≠p1num以及p1所指的结点不是表尾结点p2=p1(p2后移一个位置)p1=p1next(p1后移一个位置)输出“找不到”的信息P1所指是头结点是否head=p1next(删除头结点)p2next=p1next(删除一个结点)用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点structstudent*del(structstudent*head,longnum){structstudent*p1,*p2;if(head==NULL){printf(“\nlistnull!\n”);gotoend;}p1=head;while(num!=p1num&&p1next!=NULL){p2=p1;p1=p1next;}if(num==p1num){if(p1==head)head=p1next;elsep2next=p1next;printf(“delete:%d\n”,num);n=n-1;}elseprintf(“%ldnotbeenfound!\n”,num);return(head);}删除链表用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点head991019910399107NULL99102p0p1(a)准备将p0插入链表中插入结点用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点插入结点head991019910399107NULL99102p0p1p2(b)插入点位于链表中间
p0num>p1nump2=p1,p1=p1next用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点插入结点9910399107NULLp1head9910199102p0p2(c)链接新结点p0num≤p1nump2next=p0,p0next=p1用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点插入结点99107NULLhead991009910399101p0p1(d)结点插在表首p0num<p1num
head=p0,p0next=p1用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点插入结点p199101991079910399109NULLp0(e)结点插在表尾p1next=p0
p0next=NULLhead用指针处理链表5插入结点p1=head,p0=stud
原来的链表是空表是否当p0num>p1num以及p1所指的不是表尾结点
p2=p1p1=p1nextp0num≤p1num真假P0指向头结点是否head=p0p0next=p1(插到表头之前)p2next=p0p0next=p1(插到表中间)p1next=p0p0next=NULL(插到表尾之后)将p0所指的结点作为唯一结点n=n+1用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点structstudent*insert(structstudent*head,structstudent*stud){structstudent*p0,*p1,*p2;p1=head;/*使p1指向第一个结点*/p0=stud;/*p0指向要插入的结点*/if(head==NULL)/*原来的链表是空表*/{head=p0;p0next=NULL;}/*使p0指向的结点作为头结点*/else{while((p0num>p1num)&&(p1next!=NULL))
{
p2=p1;/*使p2指向刚才p1指向的结点*/p1=p1next;}
/*p1后移一个结点*/if(p0num<=p1num)
{
if(head==p1)head=p0;
/*插到原来第一个结点之前*/elsep2next=p0;/*插到p2指向的结点之后*/p0next=p1;}
else{p1next=p0;p0next=NULL;}/*插到最后的结点之后*/}n=n+1;/*结点数加1*/return(head);}插入结点用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点voidmain()
{structstudent*head,*stu;longdel_num;printf(“inputrecords:\n”);
head=creat();/*建立链表,返回头指针*/
print(head);/*输出全部结点*/printf(“\ninputdeletenumber:”);scanf(“%ld”,&del_num);/*输入要删除的学号*/while(del_num!=0){head=del(head,del_num);/*删除后链表的头地址*/
print(head);/*输出全部结点*/printf(“inputthedeletenumber:”);scanf(“%ld”,&del_num);/*输入要删除的学号*/}
printf(“\ninputtheinsertedrecord:”);stu=(structstudent*)malloc(LEN);综合操作用指针处理链表5例9.9单向动态链表1.问题提出:2.解题思路:
malloc():p1,p2head输入数据
NULL:链表结束3.编写程序:
4.运行结果:5.程序分析:
6.程序改进:3个以上结点scanf(“%ld,%f”,&stunum,&stuscore);/*输入要插入的结点*/while(stunum!=0){head=insert(head,stu);/*插入新结点,返回地址*/
print(head);/*输出全部结点*/printf(“inputtheinsertedrecord:”);stu=(structstudent*)malloc(LEN);scanf(“%ld,%f”,&stunum,&stuscore);}}综合操作提高部分—共用体6structsample{
shorti;
charch;
floatf;};0x0037b00unionsample{
shorti;
charch;
floatf;};printf("%d\n",sizeof(structsample));8个字节ichf4个字节printf("%d\n",sizeof(unionsample));ichf提高部分—共用体6union
共用体名{
类型标识符成员名;类型标识符成员名;
…………….};例
uniondata{inti;charch;floatf;};fchi提高部分—共用体6sizeof(unionnumber)取决于占空间最多的那个成员变量0x0037b00同一内存单元在每一瞬时只能存放其中一种类型的成员起作用的成员是最后一次存放的成员,不能作为函数参数不能进行比较操作,只能对第一个成员初始化f4个字节提高部分—共用体6提高部分—共用体6提高部分—枚举类型6枚举(Enumeration)数据类型描述的是一组整型值的集合用于当某些量仅由有限个数据值组成时
enumweeks{SUN,MON,TUE,WED,THU,FRI,SAT};
enumweekstoday;enumresponse{no,yes,none};enumresponseanswer;
today=TUE;
answer=yes;
enumresponse{no=-1,yes=1,none=0};其值为2其值为1enum枚举类型名{枚举元素列表}枚举变量列表;提高部分—枚举类型6例11.13口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中先后取出3个球,问得到3种不同色的球的可能取法,打印出每种排列的情况。要判断各球是否同色,应用枚举类型变量处理。设取出的球为i,j,k。根据题意,i、j、k分别是5种色球之一,并要求i≠j≠k。可以用穷举法,即一种可能一种可能地试,看哪一组符合条件。n=0n=n+1输出一种取法i≠j和k≠j
真假k从red变到blacki≠j
真假j从red变到black输出取法的总数n
i从red变到blackloop由1到3loop的值123ipriipriipripri的值redyellow
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏盐城市大丰区2025-2026学年六年级上学期期末语文试卷(文字版含答案)
- 2026年语数综合小学教师招聘考试笔试试题(含答案)
- 2026年养老机构膳食照料专职社工招聘考试笔试试题(含答案)
- 2026年烟草内管内勤专员烟草公司招聘考试笔试试题(含答案)
- 2026 年 PICU 护理实习带教安全教学课件
- 2026 年护理疑难病例多学科讨论个案分享
- 2026年秋季广告学专业开学第一课 专业素养与核心竞争力讲座方案
- 2026年秋季小学数学开学第一课 考试策略与技巧
- 2026年秋季小学开学主题班会 行为规范与品德培养
- 石材工程施工安全技术交底
- 安徽省芜湖市2025-2026学年高一下学期期末考试语文试卷
- 东北证券战略发展规划-第三次指导委员会汇报-20241028-vf
- 2026河南郑州临港产教融合科技有限公司第一批招聘34人考试参考题库及答案详解
- 音箱调音师资格证考试题库及答案
- 【世界经济论坛】塑造学习的未来:人工智能时代的教育准备
- 2026海南农村商业银行招聘(202605)笔试备考试题及答案详解
- 监理专项检查工作制度
- 保密工作制度汇编
- 光伏安全生产例会制度
- 2025手术体位相关性周围神经损伤预防专家共识解读课件
- DBJ-T 13-491-2025 福建省建筑修缮工程施工质量验收标准
评论
0/150
提交评论