链表
可变数组
array.h
creat:构建函数
free:返回空间
size:大小
at:访问
inflate:扩大
#ifndef _ARRAY_H_
#define _ARRAY_H_
typeof struct{
int *array;
int size;
} Array;
//只是一个结构,可以定义本地变量
//不定义指针类型
Array a;
Array array_create(int init_size);
void array_free(Array *a);
int array_size(const Array *a);
int* array_at(Array *a,int index);
void array_inflate(Array*a,int more_size);
#endif
array.c
- create
Array array_create(int init_size)
{
Array a;
a.size=init_size;
a.array=(int*)malloc(sizeof(int)*init_size);
return a;
}
有风险:a==NULL || a已经指向一个有效数组
- free
void array_free(Array *a)
{
free(a->array);
a->array=NULL;
a->size=0;
}
- size
//封装:保护函数的细节
int array_size(const Array *a)
{
return a->size;
}
//printf("%d\n",srray_size(&a));
//printf("%d\n",a.size);
- at
const BLOCK_SIZE =20;
int* array_at(Array *a,int index)
{
if (index>=a->size){
//array_inflate(a,index-a->size+1);//每次只长1个
//添加一个block概念
array_inflate(a,(index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size);
}
return &(a->array[index]);
//*array_at(&a,0)=10;
//进行赋值
}
- inflate
//重新申请一块新的空间
void array_inflate(Array*a,int more_size)
{
int *p=(int*)malloc(sizeof(int)(a->size+more_size));
int i;
//把旧的数据复制到新的空间
for(i=0;i<sizeof(a);i++0
{
p[i]=a->array[i];
}
//memcpy
free(a->array);
a->array=p;
a->size+=more_size;
}
- main
int main(int argc,char const*argv[])
{
Array a=array_create(100);
array_free(&a);
//int number;
int cnt;
while(1){
scanf("%d",&number);
if (number!=-1)
*array_at(&a,cnt++)=number;
//scanf("%d",array_at(&a,cnt++);
}
array_free(&a);
reurn 0;
}
可变数组的缺陷
内存空间利用效率不高,实际上剩余空间足够,但由于不连续所以无法使用
只申请新的block,连接在一起
链表(Linked List)
结点:数据+指针
#ifndef _NODE_H_
#define _NODE_H_
typeof struct _node{
int value;
struct _node *next;
}Node;
//定义一种类型为Node
#endif
#include"node.h"
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char const *argv[])
{
Node*head=NULL;
int number;
do{
scanf("%d",&number);
if(number!=-1){
//add to linked-list
Node *p=(Node*)malloc(sizeof(Node));
p->value=number;
p->next=NULL;
//find the last
//attach
Node *last=head;
if(last){
while(last->next){
last=last->next;
}
last->next=p;
}
}
}while(number!=-1);
return 0;
}