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
- c数组实现线性表储存。
- 线性表--顺序储存结构 java实现
- 线性表之<顺序表sqlist>的储存及插入、删除-C代码实现
- 线性表之<链表linklist>的储存及插入、删除-C代码实现
- 数据结构 --- 线性表 顺序储存 链式储存
- 线性表-数组实现
- 线性表数组实现
- 线性表的顺序储存及运算实现-------------顺序表
- 线性表的顺序储存及运算实现
- 数据结构-线性表之顺序储存(Java实现)
- 线性表的顺序储存结构(静态)实现
- 线性表的顺序储存结构定义(动态)实现
- 线性表的顺式储存结构与实现
- 数据结构-线性表之顺序储存(Java实现)
- 间接寻址储存的线性表—基本操作实现
- 数组实现的线性表基本操作[C]
- 线性表--顺序储存结构
- 线性链表的储存
- (8)CSS链接与链接伪类
- 产生不相同的随机数(低效率版)
- 黑马程序员——final 修饰符,抽象类,接口,内部类---
- 逆天的jquery版本 jquery-1.3.2.min、jquery-1.4.4.min 完美解决跨域问题
- CodeForces 275C k-Multiple Free Set
- c数组实现线性表储存。
- Python3.2官方文档翻译--类总介绍
- PullToRefresh开源项目详解以及universal-image-loader的使用(一)
- 互联网系统架构的演进
- POJ 3624 Charm Bracelet
- 《设计模式之禅》六大设计原则(二)里氏替换原则
- 泛型类型
- hibernate集合映射inverse和cascade详解
- 恶心的www.3600.com