c数组实现线性表储存。

来源:互联网 发布:杭州富谦网络 编辑:程序博客网 时间:2024/05/01 08:29
/*************************************************************************    > 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