c数组实现线性表储存。

/*************************************************************************
    > 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; 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值