数据结构基础(1)--数组C语言实现--动态内存分配http://blog.youkuaiyun.com/davidluo001/article/details/46447817
基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc()。
难点就是数组在删除或者插入元素的时候,要移动元素的坐标不好确定。规律:
1.如果要在数组中第pos个位置插入一个元素(应该从后面开始移动)
for( i=cnu;i>=pos;i--)
pBase[i]=pBase[i-1];
2.删除数组第pos位置的元素
for(i=pos+1;i<=cnu;i--)
pBase[i-2]=pBase[i-1];
使用malloc动态分配内存并将返回值赋给整形指针
int *pBase=(int *)malloc(sizeof(int)*len);//分配4*len字节长度的内存
这是pBase可以指向数组中的第一个元素,可以作为数组变量名称使用。
数组的优缺点:
优点:
存取速度快 o(1) 可以直接根据下标找到内存位置
缺点:
事先必须知道数组的长度
插入删除元素很慢
空间通常是有限制的
需要大块连续的内存块
插入删除元素的效率很低
- #include<stdio.h>
- #include<malloc.h>
- #include<stdbool.h>
- struct Arr{
- int len;
- int cnu;
- int * pBase;
- };
-
-
-
-
-
- void init_array(struct Arr * pArray,int len){
- pArray->pBase=(int *)malloc(sizeof(int)*len);
- if(NULL== pArray->pBase)
- {
- printf("动态分配内存失败\n");
-
- }else{
- pArray->len=len;
- pArray->cnu=0;
- }
- return ;
- }
-
-
-
-
- bool isempty(struct Arr * pArray){
- if(0==pArray->cnu)
- {
- return true;
- }else{
- return false;
- }
- }
-
-
-
-
- bool isfull(struct Arr * pArray)
- {
- if(pArray->len==pArray->cnu)
- {
-
- return true;
- }else {
- return false;
- }
-
- }
-
-
-
- void show_array(struct Arr * pArray){
- if(isempty(pArray))
- printf("数组为空!\n");
- else{
- int i;
- for( i=0; i<pArray->cnu;i++)
- {
- printf("%d \n",pArray->pBase[i]);
- }
- printf("------------------------------------\n");
- }
- }
-
-
-
-
- bool append(struct Arr * pArray,int val){
- if(isfull(pArray))
- {
- printf("数组已经满了!\n");
- return false;
- }else{
- pArray->pBase[pArray->cnu]=val;
- pArray->cnu++;
-
- }
- }
-
-
-
-
-
-
- bool insert(struct Arr * pArray,int pos,int val)
- {
- if(pos<1||pos>pArray->len+1)
- {
- printf("插入的位置输入的不合法\n");
- return false;
- }
- if(isfull(pArray))
- {
- printf("数组已经满了,插入失败!\n");
- return false;
- }
- int i;
-
- for(i=pArray->cnu;i>=pos;i--)
-
- {
- pArray->pBase[i]=pArray->pBase[i-1];
-
-
-
- }
-
-
-
- pArray->pBase[pos-1]=val;
- pArray->cnu++;
- pArray->len++;
- return true;
- }
-
-
-
-
- bool delete(struct Arr * pArray,int pos,int * val)
- {
- if(pos<1||pos>pArray->cnu)
- {
- printf("删除失败,位置不合法\n");
- return false;
- }
- int i;
- *val=pArray->pBase[pos-1];
- for(i=pos+1;i<=pArray->cnu;i++)
- {
-
- pArray->pBase[i-2]=pArray->pBase[i-1];
-
- }
- pArray->cnu--;
- return true;
-
- }
-
-
-
-
-
- bool inverse(struct Arr * pArray)
- {
- if(isempty(pArray))
- {
- printf("倒置失败,因数组为空");
- return false;
- }
-
- int i=0;
- int j=pArray->cnu-1;
-
- int temp;
- while(i<j)
- {
- temp=pArray->pBase[i];
- pArray->pBase[i]= pArray->pBase[j];
- pArray->pBase[j]=temp;
- i++;
- j--;
- }
- return true;
-
- }
- int main()
- {
- struct Arr arr;
- init_array(&arr,6);
- append(&arr,1);
- append(&arr,2);
- append(&arr,3);
- append(&arr,4);
- show_array(&arr);
- insert(&arr,2,88);
- show_array(&arr);
- int val;
- delete(&arr,1,&val);
- show_array(&arr);
- printf("删除了 %d\n",val);
- inverse(&arr);
- show_array(&arr);
- return 0;
- }