数据结构之数组
数组(array)
这里所讲的数组和前面知识讲的差不多一样,都是开辟一片连续存储的空间,只不过这里只是认为定义了一个类数组的结构体。
一、利用数组存储数据的优缺点
优点:存取速度快,实现容易理解。
缺点:插入删除元素很慢,因为每次都需要左移或者右移。
二、和数组有关的基本操作
初始化:先声明一个数组类型,定义一个结构体变量,为变量成员赋初值。
追加:追加之前判断数组是否满;在末尾添加元素。
插入:插入之前判断数组是否满;在指定位置开始右移,插入元素。
删除:删除之前判断数组是否空;在指定位置删除元素,再左移。
排序:使用冒泡、选择排序。
#include<stdio.h> #include<malloc.h> #include<stdlib.h> struct Arr { int *pBase;//指向第一个元素地址 int len;//数组长度 int cnt;//当前长度 }; void init_arr(struct Arr *pArr,int length); int append_arr(struct Arr *pArr,int Val); int insert_arr(struct Arr *pArr,int pos,int Val); int delete_arr(struct Arr *pArr,int pos,int *Val); void inversion_arr(struct Arr *pArr); void sort_arr(struct Arr *pArr); int is_empty(struct Arr *pArr); int is_full(struct Arr *pArr); void show_arr(struct Arr *pArr); void init_arr(struct Arr *pArr,int length) { pArr->pBase=(int *)malloc(sizeof(int)*length); if(NULL==pArr->pBase)//分配失败返回空指针 { printf("动态内存分配失败!\n"); exit(-1);//终止整个程序 } else { pArr->len=length; pArr->cnt=0; } return;//空类型之所以要return,是为了告诉别人你这个函数写完了 } int append_arr(struct Arr *pArr,int Val) { if(is_full(pArr)) { printf("该数组已满");//即使返回类型为int,也可以printf return 0; } else { *(pArr->pBase+pArr->cnt)=Val; pArr->cnt++; return 1; } } int insert_arr(struct Arr *pArr,int pos,int Val)//pos从1开始,同时在pos前插入数据 { int i; if(is_full(pArr)) return 0; if(pos<1 || pos>pArr->cnt+1) return 0; for(i=pArr->cnt;i>=pos-1;i--)//向右循环移动 { *(pArr->pBase+i)=*(pArr->pBase+i-1); } *(pArr->pBase+pos-1)=Val; pArr->cnt++; return 1; } int delete_arr(struct Arr *pArr,int pos,int *Val) { int i; if(is_empty(pArr)) return 0; if(pos<1 || pos>pArr->cnt) return 0; *Val=*(pArr->pBase+pos-1); for(i=pos;i<pArr->cnt;i++)//向左循环移动 *(pArr->pBase+i-1)=*(pArr->pBase+i); pArr->cnt--; return 1; } void inversion_arr(struct Arr *pArr) { int i,j,t; if(is_empty(pArr)) return; i=0; j=pArr->cnt-1; while(i<j)//倒序的算法,要记 { t=*(pArr->pBase+i); *(pArr->pBase+i)=*(pArr->pBase+j); *(pArr->pBase+j)=t; i++; j--; } return; } void sort_arr(struct Arr *pArr) { int i,j,t; for(i=0;i<pArr->cnt-1;i++)//冒泡排序法 { for(j=1;j<pArr->cnt-i;j++) { if(*(pArr->pBase+j-1)>*(pArr->pBase+j)) { t=*(pArr->pBase+j-1); *(pArr->pBase+j-1)=*(pArr->pBase+j); *(pArr->pBase+j)=t; } } } return; } int is_empty(struct Arr *pArr) { if(pArr->cnt==0) return 1; return 0; } int is_full(struct Arr *pArr) { if(pArr->cnt==pArr->len) return 1; return 0; } void show_arr(struct Arr *pArr) { int i; if(is_empty(pArr)) printf("该数组为空\n"); else { for(i=0;i<pArr->cnt;i++) printf("%d",*(pArr->pBase+i)); printf("\n"); } } void main() { struct Arr arr; int val; init_arr(&arr,6); append_arr(&arr,2); append_arr(&arr,1); append_arr(&arr,3); append_arr(&arr,5); append_arr(&arr,4); append_arr(&arr,6); show_arr(&arr); if(!append_arr(&arr,7)) printf("追加失败\n"); show_arr(&arr); if(!insert_arr(&arr,3,7)) printf("插入失败\n"); show_arr(&arr); delete_arr(&arr,3,&val); show_arr(&arr); printf("val=%d\n",val); inversion_arr(&arr); show_arr(&arr); sort_arr(&arr); show_arr(&arr);; }

浙公网安备 33010602011771号