数据结构(结构体定义,typedef)
看了郝斌老师的数据结构,很有感触,所以就想写一个系列关于数据结构的文章——不论你是出于单纯学习数据结构,还是出于为考研数据结构的初试以及复试做准备的目的,我相信你都可以从本系列博文中获益。
环境:windows xp(x86),vc++6.0
意图:要想学好数据结构,那么结构体、指针、typedef你一定要熟练的使用,所以博主在参考了郝斌老师的数据结构后,对他的练手程序进行了完善,希望能够在正式开始数据结构的链表学习前,将基础打好。
博主下面的程序主要是为了上述的目的服务的,希望大家能够获益,也希望大家能够给我留言、和我交流。
# include <stdio.h> # include <malloc.h> /* 简单说明:模拟当初始数组满时可以自增给定长度的int类型的数组 创作灵感:修改自郝斌老师数据结构,郝斌老师的int数组不能自增 作 者:leonard 书写时间:2014年3月23日 */ typedef struct Arr { int *pBase;//指向int数组首地址的指针 int length;//当前的数组最大长度 int cnt;//当前的元素个数 int increment;//数组增长的步长 }Arr; void init_arr(Arr *arr,int len); void selfincrese_arr(Arr *arr);//当arr所指向的int类型数组满是,自增给定的长度 bool append_arr(Arr *arr,int value);//将value直接追加到数组尾部 bool insert_arr(Arr *arr,int pos,int value);//将value添加到数组指定pos位置的后面,pos从0开始 bool delete_arr(Arr *arr,int pos, int *dvalue);//删除数组指定pos位置上的数据,并将这个数据返回 bool isempty(Arr *arr); bool isfull(Arr *arr); void show_arr(Arr *arr);//顺序打印int类型数组的所有元素 void inverse_arr(Arr *arr);//对指定数组的所有元素进行头尾反转 int main(void) { Arr arr; int dtemp; init_arr(&arr,6); append_arr(&arr,2); append_arr(&arr,5); append_arr(&arr,7); append_arr(&arr,4); append_arr(&arr,1); append_arr(&arr,10); append_arr(&arr,88); printf("插入之前的数组\n"); show_arr(&arr); insert_arr(&arr,3,99); printf("插入之后的数组\n"); show_arr(&arr); printf("删除一个元素之后的数组\n"); delete_arr(&arr,5,&dtemp); printf("删除的数据为%d\n",dtemp); show_arr(&arr); inverse_arr(&arr); printf("数组反转后\n"); show_arr(&arr); return 0; } void init_arr(Arr *arr,int len) { if(arr->pBase = (int *)malloc(sizeof(int)*len)) { printf("数组初始化成功...\n"); arr->length = len; arr->increment = 5; arr->cnt=0; } else printf("动态分配内存失败...\n"); } bool isfull(Arr *arr) { if(arr->length==arr->cnt) return true; else return false; } bool isempty(Arr *arr) { if(0==arr->cnt) return true; else return false; } void show_arr(Arr *arr) { for(int i=0;i<arr->cnt;i++) { printf("a[%d]=%d\n",i,arr->pBase[i]); } printf("\n"); } //将int型数组指向的内存按照事先的约定扩大 void selfincrese_arr(Arr *arr) { int *temp = (int *)malloc(sizeof(int)*arr->length); for(int j = 0;j<arr->length;j++) { *(temp+j) = arr->pBase[j]; } arr->pBase = (int *)malloc(sizeof(int)*(arr->length+=arr->increment)); for(int k = 0;k<arr->length;k++) { arr->pBase[k] = *(temp+k); } } //在数组尾部直接插入新元素 bool append_arr(Arr *arr,int value) { if(isfull(arr)) { selfincrese_arr(arr); printf("初始数组已满,现已添加了%d个空白位置,最大元素个数已扩充至%d\n",arr->increment,arr->length); append_arr(arr,value); } else { arr->pBase[arr->cnt] = value; (arr->cnt)++; } return true; } //在pos位置的后面加入一个值为value的元素,pos从0开始 bool insert_arr(Arr *arr,int pos,int value) { if(pos<0||pos>arr->length||pos>arr->cnt) { printf("无法完成插入,因为位置参数不正确!\n"); return false; } else { for(int l = arr->cnt;l>=pos+1;l--) { arr->pBase[l] = arr->pBase[l-1]; } arr->pBase[pos+1] = value; (arr->cnt)++; return true; } } //删除pos位置上的那个元素,并将删除位置上元素的值返回pos从0开始 bool delete_arr(Arr *arr,int pos, int *dvalue) { *dvalue = arr->pBase[pos]; for(int m =pos;m<arr->cnt;m++) { arr->pBase[m] = arr->pBase[m+1]; } arr->cnt--; return true; } //对指定的int类型数组进行反转 void inverse_arr(Arr *arr) { int p=0,q=arr->cnt-1,itemp; while(p<q) { itemp = arr->pBase[q]; arr->pBase[q] = arr->pBase[p]; arr->pBase[p]=itemp; p++,q--; } }