1、线性表的顺序存储的结构代码
struct Arr{
int* pBase;//数组首地址
int len;//分配空间的长度
int cnt;//线性表实际长度
};
2、初始化
//length为分配的长度
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;
}
3、判断线性表是否为空
bool is_empty(struct Arr* pArr){
//线性表的实际长度为零时,即为空
if(0==pArr->cnt)
return true;
else
return false;
}
4、判断线性表是否为满
bool is_full(struct Arr* pArr){
if(pArr->cnt==pArr->len)
return true;
else
return false;
}
5、添加数据
bool append_arr(struct Arr* pArr,int val){
//如果满的话,返回false
if(is_full(pArr))
return false;
//不满时,追加,添加在线性表的末尾位置
pArr->pBase[pArr->cnt]=val;
//线性表的实际长度加一
(pArr->cnt)++;
//追加成功,返回true
return true;
}
6、遍历线性表
void show_arr(struct Arr* pArr){
int i;
if(is_empty(pArr)){
printf("数组为空!\n");
exit(-1);
}else{
for(i=0;i<pArr->cnt;i++)
printf("%d ",pArr->pBase[i]);
}
printf("\n");
}
7、查找某个位置的数据
int getElem(struct Arr* pArr,int i){
int temp;
int* pVal=(int*)malloc(sizeof(int));
if(pArr==NULL || i<1 || i > pArr->cnt){
printf("你查询的位置的数据不存在\n");
exit(-1);
}
temp=pArr->pBase[i-1];
//释放内存,防止泄露
free(pVal);
return temp;
}
8、反转线性表
void inversion_arr(struct Arr* pArr){
int i=0;
int j=pArr->cnt-1;
int temp;
while(i<j){
temp=pArr->pBase[i];
pArr->pBase[i]=pArr->pBase[j];
pArr->pBase[j]=temp;
++i;
--j;
}
return;
}
9、插入数据
算法:
1、如果插入的位置不合理,抛出异常
2、从最后一个元素开始向前遍历到第i个位置,分别将他们都向后移动一个位置
3、将要插入的元素填入位置i处
4、表长要加一
代码:
bool insert_arr(struct Arr* pArr,int index,int val){
int i;
//如果数组满了,插入失败
if(is_full(pArr))
return false;
//如果插入的位置不合法,插入失败
if(index<1||index>pArr->cnt+1)
return false;
//从后面开始移动数组
for(i=pArr->cnt-1;i>=index-1;i--){
pArr->pBase[i+1]=pArr->pBase[i];
}
pArr->pBase[index-1]=val;
//有效个数加一
pArr->cnt++;
return true;
}
10、删除操作
算法:
1、如果删除的位置不合理,抛出异常
2、从删除元素的位置开始遍历到最后一个元素,分别将他们都向前移动一个位置
3、表长减一
代码:
bool delete_arr(struct Arr* pArr,int index,int* pVal){
int i;
//如果为null,返回false
if(is_empty(pArr))
return false;
//如果删除的位置不合法
if(index<1||index>pArr->cnt)
return false;
//将删除的值保存起来
*pVal=pArr->pBase[index-1];
//将删除元素的后续元素向前移动
for(i=index;i< pArr->cnt;++i) {
pArr->pBase[i-1]=pArr->pBase[i];
}
//有效个数减一
pArr->cnt--;
return true;
}
11、对线性表进行冒泡排序
void maopao_sort_arr(struct Arr *pArr){
int i,j,temp;
for(i=0;i<pArr->cnt;i++){
for(j=i+1;j<pArr->cnt;j++){
if(pArr->pBase[i]>pArr->pBase[j]){
temp=pArr->pBase[i];
pArr->pBase[i]=pArr->pBase[j];
pArr->pBase[j]=temp;
}
}
}
return ;
}
测试代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//声明函数
void init_arr(struct Arr* pArr,int length);
bool is_empty(struct Arr* pArr);
void show_arr(struct Arr* pArr);
bool is_full(struct Arr* pArr);
bool append_arr(struct Arr* pArr,int val);
bool insert_arr(struct Arr* pArr,int index,int val);
bool delete_arr(struct Arr *pArr,int index,int* val);
void inversion_arr(struct Arr* pArr);
void maopao_sort_arr(struct Arr *pArr);
int getElem(struct Arr* pArr,int i);
//主函数
int main(void)
{
int val;
int pVal;
struct Arr arr;
//初始化数组
init_arr(&arr,6);
//添加数值
append_arr(&arr,6);
append_arr(&arr,4);
append_arr(&arr,2);
append_arr(&arr,-12);
//查找第几个位置的数据
pVal= getElem(&arr,1);
printf("第%d个返回的数据是%d\n",2,pVal);
printf("反转数组\n");
inversion_arr(&arr);
show_arr(&arr);
//插入
printf("插入数组\n");
insert_arr(&arr,3,88);
show_arr(&arr);
//printf("%d\n",arr.cnt);
//冒泡排序
printf("排序\n");
maopao_sort_arr(&arr);
show_arr(&arr);
printf("删除数组\n");
delete_arr(&arr,3,&val);
show_arr(&arr);
printf("你删除的数字是:%d\n",val);
printf("线性表的长度是%d\n",arr.cnt);
}
测试结果: