数据结构之线性结构的顺序存储(数组)

来源:互联网 发布:faceu软件 编辑:程序博客网 时间:2024/06/05 15:31

线性结构   [把所有的结点用一根直线穿起来]
连续存储 [数组]
1、什么叫数组
元素类型相同,大小相等
2、数组的优缺点:
跟链表进行比较

源代码如下:

#include <stdio.h>

#include <malloc.h>
#include <stdlib.h>


//定义了一个数据类型,该数据类型的名字叫做struct Arr,该数据类型含有三个成员
//分别是pArr len  cnt
struct Arr
{
int *pBase; //存储的是数组第一个元素的地址
int len;    //数组所能容纳的最大元素的个数
int cnt;    //当前数组有效元素的个数
// int increment; //自动增长因子
};  //忘记结构体分号

void init_arr(struct Arr *pArr,int length);    
bool append_arr(struct Arr *pArr,int val);  //追加
bool insert_arr(struct Arr *pArr,int pos,int val);//pos的值从1开始
bool delete_arr(struct Arr *pArr,int pos,int *pval);    //返回删除的值
//删除成功与失败
bool get();
bool is_empty(struct Arr *pArr);
bool is_full(struct Arr *pArr);
void sort_arr(struct Arr *pArr);
void show_arr(struct Arr *pArr);
void inversion_arr(struct Arr *pArr);

int main(void)
{
struct Arr arr; //定义变量分配内存
    //数组的长度,有效个数,pBase都是垃圾数字
int val;
// init_arr(arr);  //传递12个字节


    init_arr(&arr,6);
show_arr(&arr);
append_arr(&arr,1);
append_arr(&arr,2);
append_arr(&arr,3);
append_arr(&arr,4);
if( delete_arr(&arr,1,&val) )
{
printf("删除成功!\n");
printf("您删除的元素是:%d.\n",val);
// printf("%d.\n",arr.cnt);
}
else
{
printf("删除失败!\n");
}
/*
append_arr(&arr,5);*/
//    append_arr(&arr,6);
insert_arr(&arr,6,99);


/* append_arr(&arr,6);
append_arr(&arr,7);
if( append_arr(&arr,8))
{
printf("追加成功!\n");
}
else
{
printf("追加失败!\n");
}
*/
show_arr(&arr);
inversion_arr(&arr);
printf("倒置之后的数组内容是:\n");
show_arr(&arr);
sort_arr(&arr);


show_arr(&arr);
// show_arr(&arr);


// printf("%d\n",arr.len);
return 0;
}


void init_arr(struct Arr *pArr,int length)
{
// array.len = 99; //这样做的话没有改变
// printf("%d.\n",array.len);
// pArr -> len = 99;
// printf("%d.\n",pArr -> len);


pArr->pBase = (int *)malloc(sizeof(int) * length);


if(NULL == pArr->pBase)
{
printf("动态内存分配失败!\n");
exit(-1);  //终止整个程序
}
else
{
pArr->len = length;
pArr->cnt = 0;
}


return;  //函数终止
}


bool is_empty(struct Arr *pArr)
{
if(0 == pArr->cnt)
{
return true;
}
else
{
return false;
}
}


bool is_full(struct Arr *pArr)
{
if(pArr->cnt == pArr->len)
{
return true;
}
else
{
return false;
}
}
void show_arr(struct Arr *pArr)
{
/* if(is_empty(pArr))
提示用户数组为空
else
   输出数组有效内容*/
if(is_empty(pArr))
{
printf("数组为空!\n");
}
else
{
for(int i = 0; i < pArr->cnt; ++i)
{
printf("%d ",pArr->pBase[i]); //int *
}
printf("\n");
}


}
//追加相当于在数组后面继续存储
bool append_arr(struct Arr *pArr,int val)
{
//满时返回false
if(is_full(pArr))
return false;
//不满时追加
pArr->pBase[pArr->cnt] = val;
(pArr->cnt)++;


return true;
}


bool insert_arr(struct Arr *pArr,int pos,int val)
{
int i;

if(is_full(pArr))
return false;


if((pos < 1) || (pos > pArr->cnt+1))
return false;


for(i = pArr->cnt - 1; i >= pos-1; --i)
{
pArr->pBase[i+1] = pArr->pBase[i];
}

pArr->pBase[pos-1] = val;
pArr->cnt++;
return true;


}
bool delete_arr(struct Arr *pArr,int pos,int *pval)
{
int i;


if( is_empty(pArr))
return false;
if((pos < 1) || (pos > pArr->cnt))
return false;

*pval = pArr->pBase[pos-1];

for(i = pos; i < pArr->cnt; ++i)
{
pArr->pBase[i-1] = pArr->pBase[i];
}
     pArr->cnt--;
return true;
}
void inversion_arr(struct Arr *pArr)
{
int i = 0;
int j = pArr->cnt -1;
int t;


while(i < j)
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t; 
i++;
j--;
}
}


void sort_arr(struct Arr *pArr)
{
int i;
int j;
int t;

for(i = 0; i < pArr->cnt; i++)
{
for(j = i+1; j < pArr->cnt; j++)
{
if(pArr->pBase[i] > pArr->pBase[j])
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
}

}
}
}
0 0
原创粉丝点击