线性结构-数组

作者: 黄一倚 | 来源:发表于2018-07-24 19:09 被阅读8次

理解:
线性结构:可以用一根线把所有的结点都串起来。
术语:
线性结构:

  1. 有唯一一个第一个元素
  2. 有唯一一个最后一个元素
  3. 所有元素,除第一个元素外,都有唯一前继
  4. 所有元素,除最后一个元素外,都有唯一后继

代码实现:

#include <stdio.h>
#include <stdlib.h>  //包含了exit()
#include <malloc.h>
#include <stdbool.h>
//定义一个数据类型,名字叫struct Arr,有三个成员
struct Arr{
    int * pBase; //存储数组第一个元素的地址
    int length; //数组所能容纳最大元素个数
    int cnt; //当前数组有效元素个数
};

void init_arr(struct Arr * pArr, int length); //初始化一个数组
bool isEmpty(struct Arr * pArr); //判断数组是否为空
void show_arr(struct Arr * pArr); //打印数组
bool append_arr(struct Arr * pArr,int element); //在数组末尾追加一个元素
bool intsert_arr(struct Arr * pArr,int element,int pos); //在数组中插入一个元素
bool delete_arr(struct Arr * pArr,int *pElement,int pos); //删除数组中的一个元素
int get(struct Arr * pArr,int pos); //获取数组中的一个元素
bool isFull(struct Arr * pArr); //判断数组是否满
void sort_arr(struct Arr * pArr); //对数组进行排序
void inversion_arr(struct Arr * pArr); //倒置数组

/**
    初始化数组
    struct Arr * pArr 用于动态改变变量的值
    int length 自定义数组长度个数
*/
void init_arr(struct Arr * pArr, int length){
    pArr->pBase = (int *)malloc(sizeof(int)*length);
    if(NULL == pArr->pBase){
        printf("动态内存分配失败!");
        exit(-1);
    }
    pArr->cnt=0;
    pArr->length=length;
    return;
}

/**
    判断数组是否为空
*/
bool isEmpty(struct Arr * pArr) {
    if(pArr->cnt==0){
        return true;
    }else{
        return false;
    }
}


/**
    打印数组
*/
void show_arr(struct Arr * pArr){
    if(isEmpty(pArr)){  //如果数组为空,则输出提示
        printf("数组为空!\n");
    }else{ //如果不为空,则打钱输出数组
        for(int i=0; i<pArr->cnt; i++){
            printf("%d\t", pArr->pBase[i]);
        }
        printf("\n");
    }
    return;
}

/**
    判断数组是否为满
*/
bool isFull(struct Arr * pArr){
    if(pArr->cnt == pArr->length)
        return true;
    else
        return false;
}

/**
    在数组末尾追加元素
    struct Arr * pArr 接收数组第一个元素的地址
    int element 需要追加的元素
*/
bool append_arr(struct Arr * pArr,int element){
    if(isFull(pArr)){
        printf("数组已满!\n");
        return false;
    }else{
        pArr->pBase[pArr->cnt] = element;
        pArr->cnt++;
        return true;
    }
}

/**
    把元素插入指定的位置
    int pos 表示元素的位置,如果换算成数组下标则为 pos-1
*/
bool intsert_arr(struct Arr * pArr,int element,int pos){
    //判断数组是否为满
    if(isFull(pArr))
        return false;
    //判断插入元素的位置是否合法
    if(pos<1 || pArr->cnt+1<pos)
        return false;
    //移动元素
    for(int i = pArr->cnt-1; i>=pos-1; --i){
        pArr->pBase[i+1] = pArr->pBase[i];
    }
    pArr->pBase[pos-1] = element;
    pArr->cnt++;
    return true;
}

/**
    删除一个元素,并返回被删除元素的值
*/
bool delete_arr(struct Arr * pArr,int *pElement,int pos){
    if(isEmpty(pArr))
        return false;
    if(pos<1 || pos > pArr->cnt)
        return false;

    //保存删除的元素
    *pElement = pArr->pBase[pos-1];
    //移动元素
    for(int 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,t;
    int 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=i+1;j<pArr->cnt-1;j++){
            if(pArr->pBase[i] > pArr->pBase[j]){
                t=pArr->pBase[i];
                pArr->pBase[i] = pArr->pBase[j];
                pArr->pBase[j] = t;
            }
        }
    }
    return;
}

/**
    查找指定位置元素的值,并返回它的值
*/
int get(struct Arr * pArr,int pos){
    return pArr->pBase[pos-1];
}

int main()
{
    struct Arr arr;  //定义一个结构变量
    int elem; //保存被删除元素的值
    //测试初始化功能
    init_arr(&arr,6);
    show_arr(&arr);
    //测试追加功能
    append_arr(&arr,1);
    append_arr(&arr,2);
    append_arr(&arr,3);
    append_arr(&arr,4);
   /*append_arr(&arr,5);
    append_arr(&arr,6);
    append_arr(&arr,7);*/
    //测试插入元素功能
    intsert_arr(&arr,22,1);
    //intsert_arr(&arr,22,-1);
    //intsert_arr(&arr,33,6);
    //intsert_arr(&arr,88,7);
    //intsert_arr(&arr,88,0);

    //测试删除元素
    if(delete_arr(&arr,&elem,3)){
        printf("删除成功,你删除的元素是:%d\n",elem);
    }else{
        printf("删除失败!");
    }
    show_arr(&arr);
    printf("Hello world! \n");

    //测试倒置
    inversion_arr(&arr);
    show_arr(&arr);

    //测试排序
    sort_arr(&arr);
    show_arr(&arr);

    //测试查找指定元素
    printf("你要的元素是:%d ",get(&arr,3));
    return 0;
}

相关文章

  • Java中常用数据结构

    线性结构 非线性结构 一.线性结构 数组 特点:我们都知道数组中的元素在内存中连续存储的,可以根据是下标快速访问元...

  • 线性结构-数组

    理解:线性结构:可以用一根线把所有的结点都串起来。术语:线性结构: 有唯一一个第一个元素 有唯一一个最后一个元素 ...

  • 线性结构:数组

    什么是数据结构? 数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据。 数组...

  • C#之数据结构(上)

    数据结构 一般将数据结构分为两大类: 线性数据结构和非线性数据结构。 线性数据结构有: 线性表、栈、队列、串、数组...

  • 大话数据结构 - 链表

    代码GitHub地址 链表概述 数组和链表都是线性存储结构的基础实现,栈和队列都是线性存储结构的应用 数组优缺点 ...

  • 数据结构与算法掌握这些就够了

    数据结构 线性结构数组、链表、栈、队列 非线性多维数组、树、图 1. 栈 后进先出,可以处理递归调用实际应用:字符...

  • 算法界的小学生(2)--打好基础(链表专题)

    链表脑图 我们常见的数据结构,不管是队列,栈等线性结构,还是树,图等非线性结构,从底层来看都是数组和链表。数组在内...

  • 线性表之顺序存储结构

    线性表=顺序存储结构 +链式存储 结构 顺序存储结构:物理上连续(arraylist、数组) 增删改查排序 数组 ...

  • 2019-05-14*(线性结构 和 非线性结构的分类)

    线性结构: 百度百科:线性结构是一个有序数据元素的[集合]常用的线性结构有:线性表,栈,队列,双队列,数组,串。 ...

  • 数据结构简要

    数据结构与算法 几种常见的数据结构 线性表(数组和链表)、栈、队列和树(二叉树) 一.线性表 1.数组 数组是...

网友评论

    本文标题:线性结构-数组

    本文链接:https://www.haomeiwen.com/subject/biasmftx.html