线性结构-数组

简介: 理解:线性结构:可以用一根线把所有的结点都串起来。术语:线性结构:有唯一一个第一个元素有唯一一个最后一个元素所有元素,除第一个元素外,都有唯一前继所有元素,除最后一个元素外,都有唯一后继代码实现:#include #includ...

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

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

目录
相关文章
|
27天前
|
存储 算法 NoSQL
什么是数组存储结构
什么是数组存储结构
51 8
|
6月前
|
存储 算法 索引
线性表的顺序存储和链式存储
线性表的顺序存储和链式存储
52 0
|
26天前
|
存储 算法 C语言
【数据结构】线性表的顺序存储结构
【数据结构】线性表的顺序存储结构
16 1
|
6月前
|
存储 算法 调度
线性结构
一、线性结构 线性结构是一种数据结构,其中数据元素按照线性顺序排列。线性结构中的每个元素都有唯一的前驱和后继,除了第一个元素没有前驱,最后一个元素没有后继。常见的线性结构包括数组、链表、栈和队列。 1. 数组:数组是一种线性结构,它由一组连续的内存单元组成,用于存储相同类型的数据元素。数组的元素可以通过索引访问,索引从0开始,每个元素占据一个固定的位置。 2. 链表:链表是一种动态数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的节点可以在运行时创建和删除,因此具有更好的灵活性。链表分为单向链表、双向链表和循环链表等不同类型。 3. 栈:栈是一种后进先出(LIFO)的
59 0
|
3月前
|
存储 机器学习/深度学习 人工智能
4.线性表之数组
4.线性表之数组
48 0
|
12月前
|
存储 人工智能 DataX
线性表的顺序存储实现
线性表的顺序存储实现
|
存储 算法 Java
C 线性结构的两种应用——栈和队列 详解
C 数据结构与算法入门——栈和队列 内容分享。
99 0
C 线性结构的两种应用——栈和队列 详解
|
存储
数据结构:线性结构和非线性结构的理解
数据结构:线性结构和非线性结构的理解
227 0
数据结构:线性结构和非线性结构的理解
|
存储 算法 Java
数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】(二)
数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】
113 0
数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】(二)