内蒙古机电职业技术学院Word格式.docx
- 文档编号:18925433
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:7
- 大小:21.84KB
内蒙古机电职业技术学院Word格式.docx
《内蒙古机电职业技术学院Word格式.docx》由会员分享,可在线阅读,更多相关《内蒙古机电职业技术学院Word格式.docx(7页珍藏版)》请在冰豆网上搜索。
课后分析
以讲述理论知识为主,多举实例。
6.2内存管理库函数
6.2.1PC机CPU及存储器结构(略)
6.2.2编译模式(略)
6.2.3内存管理库函数
(1)分配存储空间函数malloc()
malloc()函数的原型为:
void*malloc(unsignedsize);
函数的作用是在内存自由空间开辟一块大小为size字节的空间,并将此存储空间的起始地址作为函数值带回。
例如,malloc(10)的结果是分配了一个长度为10字节的内存空间,若系统设定的此内存空间的起始地址为1800,则malloc(10)的函数返回值就为1800。
(2)分配存储空间函数calloc()
calloc()函数的原型为:
void*calloc(unsignedn,unsignedsize);
所分配的存储空间大小能容纳多个元素,且每个元素长度一致.
(3)重新分配空间函数realloc()函数用于使已分配的空间改变大小,即重新分配,其原型void*realloc(void*ptr,unsignednewsize);
(4)释放空间函数free()该函数的原型为:
voidfree(void*ptr);
该函数的功能为:
将指针ptr指向的存储空间释放,交还给系统,系统可以另行分配作它用。
必须指出,ptr值不能是随意的地址,而是只能是程序在运行时通过动态申请分配到的存储空间的首地址。
下面的做法是正确的:
pt=(long*)malloc(10);
………
free();
例6.4编程完成申请一个长512字节的动态数组,从标准输入设备上读入一个字符串放人该数组中,再将它从标准输出设备上输出。
#include“stdio.h”#include“stdlib.h”#include“alloc.h”main()
{char*malloc(),*buf;
buf=malloc(512);
/*分配512字节的内存空间*/
fputs(“enteralineofdata:
”,stdout);
fgets(buf,512,stdin);
/*从标准输入设备输入字符串*/
fputs(buf,stdout);
/*从标准输出设备输出字符串*/
free(buf);
/*释放申请的内存空间*/
}
6.2.4内存管理库函数应用示例——链表
所谓链表是指若干个数据项(每个数据项称为一个“结点”)按一定的原则连接起来。
每个数据项都包含有若干个数据和一个指向下一个数据项的指针,依靠这些指针将所有的数据项连接成一个链表。
下图表示了一个简单的链表。
(1)建立链表示例
用链表存放学生数据,表中每一个数据项存放一个学生的数据。
链表建立程序如下:
#delfinNULL0
#defineLENsizeof(structstudent)
structstudent
{longnum;
floatscore;
structstudent*next;
};
intn;
structstudent*creat()/*此函数带回一个指向链表头的指针*/
{structstudent*head,*p1,*p2;
n=0;
p1=p2=(structstudent)malloc(LEN);
/*开辟一个新单元*/
scanf(“%ld,%f”,&
p1->
num,&
score);
head=NULL;
while(p1->
num!
=0)
{++n;
if(n==1)head=p1;
elsep2->
next=p1;
p2=p1;
p1=(structstudent*)malloc(LEN);
p2->
next=NULL;
return(head);
关于函数的说明:
第一行为#define命令行,令NULL代表0,用它表示“空地址”。
第二行令LEN代表structstudent结构体类型数据的长度,sizeof是“求字节数运算符”。
creat函数是指针类型,即此函数带回一个指针值,它指向一个structstudent类型数据。
实际上creat函数带回一个链表起始地址。
在一般系统中,malloc带回的是指向字符型数据的指针。
而p1、p2是指向structstudent类型数据的指针变量,两者所指的是不同类型的数据。
因此必须用强制类型转换的方法使之类型一致,在malloc(LEN)之前加了“(structstudent*)”,它的作用是使malloc返回的指针转换为指向structstudent类型数据的指针。
注意“*”号不可省略,否则变成转换成structstudent类型了,而不是指针类型了。
函数返回的是head的值,也就是链表的头地址。
n代表结点个数。
(2)结点删除
要删除的是第一个结点(p1的值等于head值),则应将p1->
next赋给head。
这时head指向原来第二个结点。
第一个结点虽然还存在,但它已与链表脱离。
现在链表的第一个结点是原来第二个结点,原来第一个结点“丢失”。
(2)如果要删除的不是第一个结点,则将p1->
next赋给p2->
next。
next原来指向p1指向的结点,现在p2->
next改为指向p1->
next所指向的结点。
p1所指向的结点不再是链表的一部分。
算法中还需要考虑链表是空表(无结点)和链表中找不到要删除的结点的情况。
删除一个结点的函数delete如下:
structstudent*delete(structstudent*head,longnum)
{structstudent*p1,*p2;
if(head==NULL){printf(“\nlistnull!
\n”);
gotoend;
p1=head;
while(num!
=p1->
num&
&
p1->
next!
=NULL)
/*p1指向的不是所要找的结点,并且后面还有结点*/
{p2=p1;
p1=p1->
next;
}/*后移一个结点*/
if(num==p1->
num)
{if(p1==head)head=p1->
/*若p1指向的是头结点,把第二个结点的地址赋给head,即删除头结点*/
next=p1->
/*否则将下一个结点的地址赋给前一结点的地址。
即删除非头结点*/
printf(“delete:
%ld\n”,num);
n--;
/*链表结点数减1*/
elseprintf(“%ldnotbeenfound!
\n”,num);
/*找不到该结点*/
end:
delete函数的类型是指向structstudent类型数据的指针,它的返回值是链表的头指针。
函数参数为head和要删除的学号num。
当删除第一个结点时,head的值可能在函数执行过程中被改变。
(3)插入结点的函数insert如下:
structstudent*insert(structstudent*head,structstudent*stud)
{structstudent*p0,*p1,*p2;
/*p1指向第一个结点*/
p0=stud;
/*p0指向要插入的结点*/
if(head==NULL)/*原来是空表*/
{head=p0;
p0->
}/*使p0指向的结点作为链表第一个结点*/
Else
{while((p0->
num>
num)&
(p1->
=NULL))
p1=p1->
}/*p2指向刚才p1指向的结点,p1后移一个结点*/
if(p0->
numnum)
{if(head==p1)head=p0;
/*插到原来第一个结点之前*/
else{p2->
next=p0;
/*插到p2指向的结点之后*/
p0->
else
{p1->
}}/*插到最后结点之后*/
++n;
/*结点数加1*/
insert函数参数是两个结构体类型指针变量head和stud。
从实参传来待插入结点的地址传给stud,语句p0=stud的作用是使p0指向待插入结点。
函数类型是指针类型,函数返回值是链表起始地址head。
(4)链表的输出操作
要依次输出链表中各结点的数据比较容易处理。
首先要知道链表头结点的地址,也就是要知道head的值,然后设一个指针变量p,先指向第一个结点,输出p所指的结点,然后使p后移一个结点,再输出。
直到链表的尾结点。
输出链表的函数print如下:
voidprint(structstudent*head)
{structstudent*p;
prinft(“\nNow,These%dnodesare:
\n”,n);
p=head;
if(head!
do
{printf(“%d%5.lf\n”,p->
num,p->
p=p->
}while(p!
=NULL);
p首先指向第一个结点,在输出完第一个结点之后,将p原来所指向的结点中的next值赋给p(即p=p->
next),而p->
next的值就是下一个结点的起始地址。
将它赋给p就是p指向下一个结点。
head的值由实参传过来也就是将已有的链表的头指针传给被调用的函数,在print函数中从head所指的第一个结点出发,顺序输出各个结点。
(5)链表的查找操作
链表的查找是指在已知链表中查找值为某指定值的结点。
链表的查找过程是从链表的头指针所指的第一个结点出发,顺序查找。
或发现有指定值的结点,以指向该结点的指针值为查找结果;
或查找至链表结尾,未发现有指定值的结点,查找结果为NULL,表示链表中没有指定值的结点。
为简单起见,以指定的学号作为查找结点的标志。
查找一个结点的函数find如下:
structstudent*find(structstudent*head,longnum)
{structstudentp1,*p2;
if(head==NULL){printf(“\nlistnull!
\n”);
{p2=p1;
nxet;
if(num==p1->
printf(“find:
%ld%5.2f\n”,num,p1->
printf(“%ldnotbeenfound!
find函数的类型是指向structstudent类型数据的指针,其返回值是链表的头指针,函数参数为head和要查找的学号num。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内蒙古 机电 职业技术学院