可变数组
仔细看这段代码:
#include<stdio.h>
#include<stdlib.h>
const int BLOCK_SIZE =20;
typedef struct{
int *array;
int size;
}Array;
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);
int main(){
Array a=array_create(100);
printf("%d\n",array_size(&a)); //100
*array_at(&a,0)=10;//可以写入值
printf("%d\n",*array_at(&a,0)); //10
int cnt=0;
int number=0;
while(number!=-1){
scanf("%d",&number);
*array_at(&a,cnt++)=number;
}
array_free(&a);
return 0;
}
Array array_create(int init_size){
Array a;
a.size=init_size;
a.array=(int*)malloc(sizeof(int)*a.size);
return a;
}
void array_free(Array *a){
free(a->array);
a->array=0;a->size=0;//保险起见
}
//封装
int array_size(const Array *a){
return a->size;
}
int* array_at(Array *a,int index){
if(index>=a->size){
array_inflate(a,(index/BLOCK_SIZE+1)*BLOCK_SIZE - a->size);//120-100
}
return &(a->array[index]);
}
/*int array_get(const Array *a,int index){
return a->array[index];
}
void array_set(Array *a,int index,int value){
a->array[index]=value;
}*/
void array_inflate(Array *a,int more_size){
int *p=(int *)malloc(sizeof(int)*(a->size+more_size));
for(int i=0;i<a->size;i++){
p[i]=a->array[i];
}
free(a->array);
a->array=p;
a->size+=more_size;
}
链表
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int value;
struct node *next;
}Node;
typedef struct _list{
Node* head;
}List;
void add(List* pList,int number){
//add to linked-list
Node *p=(Node*)malloc(sizeof(Node));
p->value=number;
p->next=NULL;
Node *last=pList->head;
//find the last
if(last){
while(last->next){
last=last->next;
}
last->next=p;
}else{
pList->head=p;
}
}
void print(List *pList){
Node *p;
for(p=pList->head;p;p=p->next){
printf("%d\t",p->value);
}
printf("\n");
}
int main(){
//Node *head=NULL;
List list;
list.head=NULL;
int number;
//添加
do{
scanf("%d",&number);
if(number!=-1){
add(&list,number);
}
}while(number!=-1);
//打印
print(&list);
//找到一个值并删除
int isFound=0;
Node *p;
for(p=list.head;p;p=p->next){
if(p->value==number){
printf("找到了\n");
isFound=1;
break;
}
}
if(!isFound){
printf("没找到\n");
}
Node* q;
for(q=NUll,p=list.head;p;q=p,p=p->next){
if(p->value==number){
//找边界: Any pointer at the left of -> must be checked
if(q){
q-next=p->next;
}else{
list.head=p->next;
}
free(p);
break;
}
}
//整个链表的清除
for(p=list.head;p;p=q){
q=p->next;
free(p);
}
return 0;
}