线性表的顺序存储的实现

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);
} 

测试结果:
这里写图片描述

代码下载:http://download.csdn.net/detail/a_person_alone/9487958

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值