版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第
9
章
动态数据组织与处理1主要内容9.1动态内存管理9.2链表
9.3栈9.4队列29.1动态内存管理静态数据结构与动态数据结构静态数据结构如数组,在程序执行时大小是固定的,必须用常量来定义,系统为其分配一段连续的内存空间使用静态数据结构时,要求事先了解数据集的大小,以免内存空间不够用或浪费3动态数据结构在程序执行过程中,可以根据需要进行收缩或扩展内存按需分配或释放,即进行内存动态管理数据不一定存储在连续的内存空间,需要使用指针将数据连接起来动态数据结构:链表、栈、队列45
为实现动态数据管理,C99的结构体类型中最后一个元素允许是未知大小的数组,例如:structabc{intx;floaty[];
//数组大小是可以改变的,如floaty[0];该成员也可改为float*y;}
上述类型中,成员数组y的大小未定,该数组被称为柔性数组(FlexibleArray)。对于包含柔性数组的结构体类型变量,在分配内存空间时,将不计算该柔性数组。因此,sizeof(structabc)的值为4。
注:结构体类型的柔性数组成员前面一定要有一个其他类型的成员,且包含柔性数组成员的结构体变量用malloc()函数进行内存的动态分配时,所分配的内存空间应该大于结构体变量的大小,以适应柔性数组的预期大小。6Stack,用来存储在程序中定义的函数和复合语句中的局部变量等具有自动存储类别的变量Heap,用来存储通过动态申请空间函数申请的变量用于存放用绝对地址标识的,主要是静态存储类别的数据或变量存放程序中的常量、字符串常量等,程序运行结束后由操作系统释放。该块内存只有读取权限,没有写入权限,其值在程序运行期间不能改变。用于存放程序的二进制代码可以被其他应用程序共享的程序模块动态内存分配DynamicMemoryAllocation一般的内存分配工作是在编译阶段进行。动态内存分配允许程序员在程序执行过程中进行内存分配malloc()//分配一定字节的连续内存空间calloc()//分配若干个具有固定字节的连续内存空间realloc()//修改已分配的内存区的大小free()//释放已分配的内存区7函数原型void*malloc(unsignedlongsize);函数功能向内存申请分配size字节的连续空间参数size—申请的内存空间的字节数返回值成功:所分配的内存空间的首地址不成功:NULL头文件#include<stdlib.h>说明:所分配空间位于堆中,按指定大小分配不再使用该内存空间时,使用free函数释放应用举例:int*pi;pi=malloc(50*sizeof(int));//为50个整数申请内存空间,并使pi指向该空间8函数原型void*calloc(unsignedn,unsignedsize);函数功能向内存申请n个长度为size字节的连续空间参数n—数据项的个数size—每个数据项的字节数返回值成功:所分配的内存空间的首地址不成功:NULL头文件#include<stdlib.h>说明:所分配空间位于堆中,每个字节都被置为0不再使用该内存空间时,使用free函数释放应用举例:int*pi;pi=calloc(50,sizeof(int));//申请50个int类型的内存空间,使pi指向该空间9函数原型void*realloc(void*p,unsignedsize);函数功能将p所指向的已经分配的内存区大小改为size参数p—指向要修改大小的内存区的指针size—修改后的字节数返回值成功:新分配的内存空间的首地址不成功:NULL头文件#include<stdlib.h>说明:size可以比原来的内存区间扩大或缩小应用举例:int*pi;pi=malloc(50*sizeof(int));pi=realloc(pi,10*sizeof(int));//将空间缩小至存放10个整数10函数原型voidfree(void*p);函数功能释放p所指向的内存区参数p—指向要释放内存空间的指针返回值无头文件#include<stdlib.h>说明:拟释放的内存是由malloc或calloc函数申请空间时返回的地址所释放的空间可由系统重新分配应用举例:free(p);1112【例9-1】创建一维动态数组。#include<stdio.h>#include<stdlib.h>intmain(){int*p,i,n;p=(int*)malloc(sizeof(int)*n);printf("输入一维数组的长度:");scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&p[i]);printf("输出一维数组各个元素:\n");for(i=0;i<n;i++)printf("%3d",p[i]);free(p);return0;}13【例9-2】创建二维动态数组。#include<stdio.h>#include<stdlib.h>intmain(){int*p,*pt[10],*pp,i,j,m,n;p=(int*)malloc(sizeof(int)*m);printf("输入数组的行数m和列数n:");scanf("%d%d",&m,&n);printf("输入数组的各个元素的值:\n");for(i=0;i<m;i++){p=(int*)malloc(sizeof(int)*n);pt[i]=p;for(j=0;j<n;j++)scanf("%d",(p++));}printf("输出数组元素的值:\n");for(i=0;i<m;i++){pp=pt[i];for(j=0;j<n;j++)printf("%3d",*(pp++));printf("\n");}for(i=0;i<m;i++)free(p[i]);free(p);return0;}9.2链表一种动态数据结构若干个结点由指针串在一起构成结点数目无须事先指定,可以临时生成,每个结点有自己的存储空间,结点间的存储空间无须连续插入和删除结点时方便,无须移动大批数据,只需修改指针的指向即可14例9-3:选择合适的数据结构来存放一批学生的学号及考试成绩,以便进一步处理。
由于学生人数未知,用静态数组不合适用链表处理较恰当15用链表处理该问题的基本思路:
将各学生的数据进行离散存放,来一个学生就分配一小块内存(结点)。并将各结点用指针依次连接起来——链表。每结点应包含下一结点的开始地址最后一个结点中的指针为空链头指针指向第一个结点,是访问链表的重要依据
这样的链表称单向链表16//每个结点可用如下结构描述:structStudent{intnum;
//学号intscore;//成绩structStudent*next;//下一结点的地址};17①输入一个学生的数据②分配结点空间,存入数据③将该结点的首地址赋给上一结点的next,若该结点是第一个结点,则赋给头指针④将该结点的next置为空(NULL),表示该结点为当前的最后结点。head学号成绩next学号成绩next学号成绩next学号成绩next学号成绩NULL创建链表18structStudent*creat(){
structStudentst,*p0=NULL,*p,*head=NULL;while(1){scanf("%d%d",&st.num,&st.score);if(st.num<0)break;p=(structStudent*)malloc(sizeof(structStudent));
*p=st;p->next=NULL;if(p0==NULL)
head=p;
//p0为前一结点的指针
elsep0->next=p;
p0=p;}returnhead;
}head学号成绩next学号成绩next学号成绩NULL19
以输出为例①
通过头指针找到第一个结点.②
输出当前结点的内容,并通过next找
到后继结点,…,直到next为空遍历链表2020voidoutput(structStudent*head){
structStudent*p=head;while(p){printf("\n%d%d",p->num,p->score);p=p->next;}}head学号成绩next学号成绩next学号成绩NULL学号成绩next21①按链表的访问方法找到相应结点。②若该结点是第一个结点,则将后继结点指针赋给头指针;
若该结点是最后一个结点,则将前缀结点的next置为空;
若该结点是中间结点,则将后继结点指针赋给前缀结点的next。③释放该结点所占的内存单元。删除结点2223structStudent*delete(structStudent*head,intnum){
structStudent*p=head,*p0=NULL;while(p){if(p->num==num){if(p==head)head=p->next; elseif(p->next==NULL)p0->next=NULL; elsep0->next=p->next; free(p);break;}else{p0=p;p=p->next;}}returnhead;}//假定要删除某一指定学号的结点
head学号成绩next学号成绩next学号成绩NULL24假定将结点p插入到结点p0的后面,则插入操作的关键为:
p->next=p0->next;p0->next=p;
插入结点
252627双向链表环形链表9.3栈一种操作受限的线性表,仅允许在表的一端(栈顶)进行插入和删除操作,另一端为栈底插入新元素到栈顶元素的上面,称作进栈、入栈或压栈;从一个栈删除元素又称作出栈或退栈28栈的操作:压栈出栈计算栈长度输出栈内容293031//可用链表实现栈结构:structnode
{intval;
//存放数据structnode
*next;//下一结点的地址};structnode*head=NULL;32structnode*create_node(intval)//生成一个结点{
structnode*p=(structnode*)malloc(sizeof(structnode));p->val=val;p->next=NULL;returnp;}33structnode*push(intval)//压栈{structnode*p=create_node(val);p->next=head;head=p;returnhead;}34intpop()//出栈,返回值为栈顶数据{intval;structnode*p=head;val=p->val;head=head->next;free(p);returnval;}35intlength_stack(structnode*link)//计算栈长度{intcount=0;while(link){count++;link=link->next;}returncount;}voidprint_stack(structnode*link)//输出栈中的内容{if(link==NULL)printf("这是一个空栈.\n");elsewhile(link){printf("%d",link->val);link=link->next;}}36例9-4:voidmain(){inti,stackSize;printf("\n###########入栈操作###########\n");for(i=1;i<=MAXSIZE;i++)push(i*10);stackSize=length_stack(head);printf("栈长度为:%d\n",stackSize);printf("---------输出栈中数据---------\n");print_stack(head);printf("\n###########出栈操作###########\n");for(i=0;i<stackSize;i++)printf("%d",pop());printf("\n---------输出栈中数据---------\n");print_stack(head);}373738例9-5:编写程序,输入两个个正整数n和m,实现将n转换为m进制的功能,输出转换后的数据。分析
本题可用数组方法实现;也可以用链表构造栈方法实现39voidmain(){intn,m,nn; printf("请输入拟转换的数n及进制数m:");scanf("%d%d",&n,&m);nn=n;while(nn){push(nn%m);nn=nn/m;}printf("%d可以转换为%d进制",n,m);print_stack();}40409.4队列一种操作受限制的特殊线性表,也叫FIFO结构数据项从表的一端(rear,队尾)加入,而在表的另一端(front,队首)移除。因此,一个队列需要两个指针,分别指向队首和队尾41队列的操作:入队(排在队尾)出队(从队首删一项)4243//可用链表实现队列结构:structqueue
{intval;
//存放数据structqueue
*next;//下一结点的地址};structqueue*front=NULL,*rear=NULL;44voidInqueue(intx)//入队{s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心理学与教育试题及答案
- 张掖市领导干部任前廉政法规和法律知识考试参考试题及答案
- 营销人员岗位培训试卷教案及答案
- 医疗器械安全及使用等知识试题及答案
- 医疗器械经营质量管理规范现场检查指导原则培训试题及答案
- 中餐服务员专业素养与菜品知识考核卷及答案
- 中华保险人力资源经理岗位知识题及答案
- 住宅小区施工安全操作规程测验卷及答案
- 中小学生心理健康知识竞赛参考答案分解
- 新闻记者职业试卷带答案
- 智慧养殖科普知识培训总结课件
- stop6安全知识培训课件
- 乡村学校少年宫活动教案
- 粮食机收减损培训课件
- 《高等数学》上册课件01-01函数
- CJ/T 358-2019非开挖工程用聚乙烯管
- 2025-2030中国埋弧焊行业市场发展趋势与前景展望战略研究报告
- 总课件-发展心理学林崇德
- 模式识别 课件 第4章 线性判别分析
- GB 15930-2024建筑通风和排烟系统用防火阀门
- 苹果电脑macOS效率手册
评论
0/150
提交评论