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、有序链表

有序链表的查找速快 ,结点插入难度增加;

四、 指向指针的指针

你可能感兴趣的:(08/09)