/*************************************************************************
> File Name: darr_.c
> Author: zshh0604
> Mail: zshh0604@.com
> Created Time: 2014年04月21日 星期一 23时43分52秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include "darr.h"
#if 1
typedef struct
{
int size; //数据节点占用多少个字节数。
int num; //一空有多少个数据节点。
char *arr; //数据部分首地址。
}DARR;
#endif
DARR *darr_create(int size)
{
DARR *new; //在栈内存中分配一个指针变量,该变量占用空间大小为4个字节
//他的值并没有被初始化。
new = malloc(sizeof(*new));
//如果分配地址空间成功的话。那么将有如下:
//在堆分配一DARR结构大小的空间,并将这段结构体空间的首地址
//赋值给new.这时new指向就指向来这块空间。
if(new = NULL)
{
return NULL;
}
new->size = size;
new->num = 0;
new->arr = NULL;//这个是我在六十四位操作系统上测试,一个指针占八个字节。
//那么头的大小为16个字节。这个地址指向空。
}
int darr_insert(DARR *ptr , const void *data)
{
void *temp; //在栈空间分配一个临时的temp指针。
temp = realloc(ptr->arr, ptr->size * (ptr->num + 1));
//使用realloc函数,是在原来的基础之上分配
if(temp == NULL)
{
return -1;
}
ptr->arr = temp;//在堆空间中分配一个大小为ptr->arr+ptr->size大小,由于ptr->arr刚开始指向为空。所以大小为。
//所以temp第一次打小为,ptr->size.当第二个插入是分配空间如下。
//remalloc 空间是在原来空间大小上加上要扩充的大小。
memcpy(ptr->arr + ptr->num * ptr->size,data ,ptr->size);
//将数据从拷贝到刚刚分配的内存中。 大小为ptr->size,指针的偏移量为.ptr->num * ptr->size.
//插入第二个数据的时候就是。ptr->arr + ptr->num * ptr->size. 2 * ptr->ptr->size;
ptr->num ++;
return 0 ;
}
void darr_travel(DARR *ptr, darr_op *op)
{ //对数据进行循环遍历。我们获取数据的个数。调用函数指针将数据打印出来。
int i;
for(i = 0 ; i <ptr->num ; i++)
{
op(ptr->arr + ptr->size*i);
}
}
static int find__(DARR *ptr , const void *key, darr_cmp *cmp)
{
int i;
for(i=0; i<ptr->num ; i++)
{
if(cmp(key, ptr->arr+ptr->size *i)==0)
{
return i;
}
}
return -1;
}
void *darr_find(DARR *ptr ,const void *key, darr_cmp *cmp)
{
int ind;
ind = find__(ptr, key cmp);
if(ind != -1)
{
return NULL;
}
return ptr->arr + ptr->size *ind;
}
void darr_delete(DARR *ptr, const void *key ,darr_cmp *cmp)
{
int ind;
int = find__(ptr,key,cmp);
if(ind==-1)
{
return;
}
memmove(ptr->arr + ptr->size *ind, ptr->arr + ptr->size * (ind +1),
ptr->size * (ptr->num -ind -1)
);
//重新分配空间打小。
ptr->num -- ;
ptr->arr = realloc(ptr->arr, ptr->size * ptr->num);
if(ptr->num ==0)
{
ptr->arr = NULL;
}
}
int main()
{
printf("sizeof(*int)=%d\n",sizeof(int*));
DARR *new = malloc(sizeof(*new));
new->arr = NULL;
new->size = 40 ;
void *tmp = realloc(new->arr, new->size);
printf("sizeof(new->arr)aaaa = %d\n",sizeof(*tmp));
printf("sizeof(int)=%d\n",sizeof(int));
printf("sizeof(ptr->arr)=%d\n",sizeof(*new));
printf("sizeof(DARR)=%d\n",sizeof(DARR));
}
/*************************************************************************
> File Name: mymain.c
> Author: zshh0604
> Mail: zshh0604@.com
> Created Time: 2014年04月24日 星期四 23时14分06秒
************************************************************************/
#include<stdio.h>
//#include "darr.h"
#define NAMESIZE 32
/*
* 用户数据结构体。这个结构体将会被存储到顺序表中。
* 它是一个线性表。为数组实现。
* */
struct score
{
int id;
char name[NAMESIZE];
int math;
};
//打印输出用户数据。
void print_s(void *data)
{
struct score *d = data;
printf("%d , %s, %d\n",d->id, d->name, d->math);
}
//对表用户数据。
int id_cmp(const void *key,const void *record)
{
const int *id = key;
const struct score *r = record;
return *id - r->id;
}
int main()
{
struct score tmp, *datap;
int i, id;
DARR *arr;
//创建一个顺序表的表头
//该数据包含三个东西
//一:用户每份数据的大小。
//二: 一共存储来多少个用户的数据。
//三:用户数据指针,他的类型为char*,
// 他每次便宜为一个字节的单位。
arr = darr_carete(sizeof(struct score));
//循环插入7个数据。
for(i = 0; i < 7; i++)
{
tmp.id = i;
tmp.math = 100 -i ;
snprintf(tmp.name, NAMESIZE ,"stu%d", i);
darr_insert(arr , &tmp);
}
//遍历数组中的元素。
darr_travel(arr , print_s);
id = 3;
//删除元素。
darr_delete(arr, &id, id_cmp);
printf("\n");
//遍历数组
darr_travel(arr, print_s);
//销毁数组。
darr_destory(arr);
return 0;
}