首页 C课件C语言链表基础

C课件C语言链表基础

举报
开通vip

C课件C语言链表基础链表基础 目标 · 熟练掌握动态内存分配 · 掌握线性表的概念 · 理解线性表的存储方式 · 了解线性表的基本操作 · 了解顺序表的优缺点 · 熟练掌握单链表的存储结构 · 熟练掌握单链表的基本操作 动态分配内存 · 静态分配内存:在编译时确定了固定的内存地址与内存大小,如:函数里的局部变量、全局变量等 · 动态分配内存:由程序控制,运行时主动性的向系统申请所需大小的内存段,并且每次分配到的内存地址不固定 malloc()函数 · 功能说明:malloc() 是最常用的函数之一,它允许从空闲内存池中分...

C课件C语言链表基础
链表基础 目标 · 熟练掌握动态内存分配 · 掌握线性表的概念 · 理解线性表的存储方式 · 了解线性表的基本操作 · 了解顺序表的优缺点 · 熟练掌握单链表的存储结构 · 熟练掌握单链表的基本操作 动态分配内存 · 静态分配内存:在编译时确定了固定的内存地址与内存大小,如:函数里的局部变量、全局变量等 · 动态分配内存:由程序控制,运行时主动性的向系统申请所需大小的内存段,并且每次分配到的内存地址不固定 malloc()函数 · 功能说明:malloc() 是最常用的函数之一,它允许从空闲内存池中分配内存 · 函数原型: void *malloc(size_t bytes · 返回值:成功时返回内存段首地址,否则返回NULL · 通过malloc函数申请的内存空间,未自动初始化 malloc()示例 void main() { int *p,n,i,j,temp; printf("\n Enter number of elements in the array: "); scanf("%d",&n); p=(int*)malloc(n*sizeof(int)); if(p == NULL){ printf(“memory error”); return; } for(i = 0;i < n;++i) { printf("\n Enter element no. %d: ",i+1); scanf("%d",p+i); } for(i=0;i*(p+j)) { temp=*(p+i); *(p+i)=*(p+j); *(p+j)=temp; } } for(i = 0;I < n;++i){ printf("%d\n",*(p+i)); } /*free(p)*/ } free()函数 · 功能说明:释放由p指向的内存,被释放的内存还回给系统,并成为自由内存。 · 函数原型: void free(void *p) p必需是通过malloc、calloc或realloc分配的指针(首地址) · 返回值:无 · 动态分配的内存一定要通过free()函数来释放,否则会造成内存泄露 free()示例 #include #include int main() { int number,i; int *ptr; printf("How many ints?"); scanf("%d", &number); ptr = (int *) malloc (number*sizeof(int)); if(ptr == NULL) { printf("Memory allocation failed.\n"); return 1; } for(i=0 ; i0 ; i--) { printf("%d\n",*(ptr+(i-1))); } free(ptr); return 0; } calloc()函数 · 功能说明: calloc()与malloc()类似,主要的区别是存储在已分配的内存空间中的值默认为零。 · 函数原型: void *calloc(size_t num,size_t bytes 要分配内存单元的个数 每个内存单元的字节大小 calloc()示例 #include #include void main() { float *calloc1; int i; calloc1 = (float *) calloc(3, sizeof(float)); if(calloc1!=NULL) { for(i = 0 ; i < 3 ; i++) printf("\ncalloc1[%d]holds%05.5f", i,calloc1[i]); free(calloc1); } else { printf("Not enough memory \n"); } } realloc()函数 · 功能说明:为已经分配的内存重新分配空间并复制内容;新的空间大小为0时,等价于free函数功能。 · 函数原型: void *realloc(void *ptr,size_t bytes ) 已分配的内存段首地址 新申请的内存字节大小 · 返回值:成功时返回内存段首地址,否则返回NULL realloc()示例 #include #include int main(){ int *ptr , i; ptr = (int *)calloc(5, sizeof(int)); if(ptr ==NULL) return 1; *ptr = 1; *(ptr+1) = 2; ptr[2] = 4; ptr[3] = 8; ptr[4] = 16; ptr = (int *)realloc(ptr,7*sizeof(int)); if(ptr == NULL) return 1; ptr[5] = 32; ptr[6] = 64; for(i = 0;i < 7;i++){ printf(“ptr[%d]:%d\n", i, ptr[i]); } realloc(ptr,0); /* free(ptr);*/ return 0; } 内存初始化函数 memset() · 功能说明:在一段内存中填充某个给定的值(注意填充时 是按照字节顺序填充的,而不是按照元素填充。) · 函数原型:void *memset( void *buffer, char ch, size_t n); 目标字符串首地址 · 参数:buffer是需要设置的内存的开始地址; ch是期望填充的值; n是需要填充的字节数。 · 返回值:成功时返回buffer的首地址,否则返回NULL memset()示例 #include #include int main( ) { char buffer[] = "This is a test of the memset function"; printf( "Before: %s\n", buffer ); memset( buffer, '*', 4 ); printf( "After: %s\n", buffer ); return 0; } 线性表 · 在计算机科学中,线性结构被称为线性表 · 线性表是在数据元素的非空集合中 · 存在唯一的一个首元素; · 存在唯一的一个尾元素; · 除首元素外每个元素有且只有一个直接前驱; · 除尾元素外每个元素有且只有一个直接后续; · 按存储方式分为顺序存储与链式存储 顺序存储结构及特点 · 顺序存储结构:用一组地址连续的存储单元 依次存放线性表的所有数据元素 · 特点1:逻辑关系上相邻的两个元素在物理位置上也相邻,因此,可以直接存取表中任意一个元素 · 特点2(缺点): · 存储空间闲置、存储容量难以扩充 · 当进行插入和删除操作时,存在大量数据元素移动 链式存储结构 · 在链式存储结构中,数据元素的存储单元是不链续的。每个元素除自身信息外,还需要存储其后续元素的信息 · 每个元素的存储映像称为结点,存放数据元素信息的域称为数据域,存放后续结点存储位置的域称为指针域,每个结点由数据域和指针域构成 · 用指针相连的结点序列称为链表 单链表 · 若每个结点只包含一个指针域的链表,则为线性单链表 · 单链表存储结构中,有一首指针head指示链表中第一个结点的存储位置,同时,由于最后一个元素没有直接后续,所以单链表最后一个结点的指针域为空(NULL),而当head为NULL时,head所指向的单链表为空表,其表长length=0 单链表的状态图 · 单链空表逻辑状态图如下: Head ->NULL 单链表一般逻辑状态图如下: a1   Head-> a2   -> an ∧ -> 循环单链表的状态图 循环单链表一般逻辑状态图如下:(头尾相连) 双向链表的状态图 双向链表一般逻辑状态图如下: Head-》 ∧ a1     a2   -》 《- …… 双向循环链表的状态图 线性表的基本操作 · 初始化 · 插入 · 删除 · 遍历(即访问每一个元素,如打印所有信息) · 查找 · 排序 单链表结点数据结构定义 struct student { char sno[4]; /*学号*/ char sname[21]; /*姓名*/ int age; /*年龄*/ int score[5]; /*五门成绩*/ /*下一学生指针*/ struct student *next; }; struct studentData{ char sno[4]; /*学号*/ char sname[21]; /*姓名*/ int age; /*年龄*/ int score[5]; /*五门成绩*/ }; struct student { /*数据域*/ struct studentData info; struct student *next;/*指针域*/ }; 单链表初始化 · 单链表的初始化时,必需先定义一头指针,并把其指向空NULL,如: struct student *head = NULL; · 初始化时不需要定义头结点 单链表插入 struct student *head=NULL,*last=NULL; //定义链尾指针,始终指向最后一个结点 int AppendOneStudent(struct studentData info){ struct student *newStudent =(struct student *)malloc(struct student ); if(newStudent != NULL){ newStudent->info = info; //确定数据域 newStudent->next = NULL; //确定指针域 if(head == NULL) head = newStudent; //直接插入到表头 else last->next = newStudent; last = newStudent; //更新last,使其始终指向最后一个结点 return 1; } return 0; } 总结 · 动态内存分配 · 线性表概念 · 线性表存储结构与基本操作 · 顺序表及优缺点 · 单链表概念与结构 · 单链表的基本操作
本文档为【C课件C语言链表基础】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_153996
暂无简介~
格式:doc
大小:77KB
软件:Word
页数:6
分类:互联网
上传时间:2018-09-11
浏览量:12