08/09
总结
动态存储分配
1、用到的函数:
a、malloc 函数 :
1 分配内存快,内存快不初始化
2 函数的结构为 void*malloc(size_t ,size);
3 p = (char *)malloc(n + 1); 给具有n个字符的字符串分配空间;p指向未初始化的字符数组(加上空字符为n+1字符)
4 strcpy(p, "abc");给p指针初始化的一个函数;
5 strcat(a,b);函数对字符串进行拼接;
b、calloc
c、realloc
d、free
使用该函数 释放a,b,c 函数使用是分配占用的空间;否则程序会将内存用光;
2、动态分配字符串
二、动态分配数组
1、int *a 数组a 数组的长会在程序执行时候计算出来,
形式为:a = malloc(n*sizeof(int));
2、calloc ()
函数不但会分配内存块空间, 会通过将所有值设置为0进行初始化;
函数会自己清除分配的内存;
3、realloc() 调整数组的大小
函数是在 calloc malloc 基础上是使用
格式:void*realloc(void*ptr,size_t size);
“悬空指针”
释放了p所指的内存 但是没有将P 指向另外的有效内存;
三、链表
链表是有 一串 结构(结点) 组成 每个结点都 有指向下一结点的指针;(不能随机访问)
1、声明结点:
struct node{
int value ; //意思 准备存多少个数?
struct node *next} ;(next 是(struct node* 类型) //为什么一定要用到node标记? 写在大括号之前和之后的区别在哪?
struct node*first = NULL; 把first 初始化为NULL 链表 第一个结点 初始化为空;
2、创建结点
步骤:两步
分配储存,数据存入结点,插入链表;
临时变量 new_node
:struct node*new_node;
使用函数分配大小:new_node = malloc(sizeof(struct_ node)) //sizeof 单个机构体占的内存字节大小
(*new_node).value = 10 寻址访问
-> 右箭头选择符 是 * 和.的组合
3、在链表开始处插入结点
需要两条语句:
修改结点成员next 使其指向首点:next_node->next = firs t;// ? next_node????
其次:first指向新的结点:
first = new_node;
空链表也可以插入 结点
4、搜索链表:
for循环首选:
结构:for( p = first ; p = NULL; p = p ->next)
p = p -next p = (*p).next;
5、链表 删除结点
三步:定位, 改变前一结点“绕过”删除结点, free 函数释放空间
方法:追踪指针方法 :指向结点前的一个指针(prev) ; 当前结点指针 (cur) ;
第一步:查找条件: (list 中删除 n;)
结构: for( cur = list ,prev = NULL;
cur != NULL&& cur-> != n ;
prev = cur ,cur = cur->next);
第二步:删除
prev -> next = cur -> next ;
第三步:释放
free(cur);
6、有序链表
有序链表的查找速快 ,结点插入难度增加;