数据结构之数组

数组(array)

  这里所讲的数组和前面知识讲的差不多一样,都是开辟一片连续存储的空间,只不过这里只是认为定义了一个类数组的结构体。

一、利用数组存储数据的优缺点

  优点:存取速度快,实现容易理解。

  缺点:插入删除元素很慢,因为每次都需要左移或者右移。

二、和数组有关的基本操作

  初始化:先声明一个数组类型,定义一个结构体变量,为变量成员赋初值。

  追加:追加之前判断数组是否满;在末尾添加元素。

  插入:插入之前判断数组是否满;在指定位置开始右移,插入元素。

  删除:删除之前判断数组是否空;在指定位置删除元素,再左移。

  排序:使用冒泡、选择排序。

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

struct Arr
{
    int *pBase;//指向第一个元素地址
    int len;//数组长度
    int cnt;//当前长度
};

void init_arr(struct Arr *pArr,int length);
int append_arr(struct Arr *pArr,int Val);
int insert_arr(struct Arr *pArr,int pos,int Val);
int delete_arr(struct Arr *pArr,int pos,int *Val);
void inversion_arr(struct Arr *pArr);
void sort_arr(struct Arr *pArr);
int is_empty(struct Arr *pArr);
int is_full(struct Arr *pArr);
void show_arr(struct Arr *pArr);

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;//空类型之所以要return,是为了告诉别人你这个函数写完了
}

int append_arr(struct Arr *pArr,int Val)
{
    if(is_full(pArr))
    {
        printf("该数组已满");//即使返回类型为int,也可以printf
        return 0;
    }
    else
    {
        *(pArr->pBase+pArr->cnt)=Val;
        pArr->cnt++;
        return 1;
    }
}

int insert_arr(struct Arr *pArr,int pos,int Val)//pos从1开始,同时在pos前插入数据
{
    int i;
    if(is_full(pArr))
        return 0;
    if(pos<1 || pos>pArr->cnt+1)
        return 0;
    for(i=pArr->cnt;i>=pos-1;i--)//向右循环移动
    {
        *(pArr->pBase+i)=*(pArr->pBase+i-1);
    }
    *(pArr->pBase+pos-1)=Val;
    pArr->cnt++;
    return 1;
}

int delete_arr(struct Arr *pArr,int pos,int *Val)
{
    int i;
    if(is_empty(pArr))
        return 0;
    if(pos<1 || pos>pArr->cnt)
        return 0;
    *Val=*(pArr->pBase+pos-1);
    for(i=pos;i<pArr->cnt;i++)//向左循环移动
        *(pArr->pBase+i-1)=*(pArr->pBase+i);
    pArr->cnt--;
    return 1;
}

void inversion_arr(struct Arr *pArr)
{
    int i,j,t;
    if(is_empty(pArr))
        return;
    i=0;
    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=1;j<pArr->cnt-i;j++)
        {
            if(*(pArr->pBase+j-1)>*(pArr->pBase+j))
            {
                t=*(pArr->pBase+j-1);
                *(pArr->pBase+j-1)=*(pArr->pBase+j);
                *(pArr->pBase+j)=t;
            }
        }
    }
    return;
}

int is_empty(struct Arr *pArr)
{
    if(pArr->cnt==0)
        return 1;
    return 0;
}

int is_full(struct Arr *pArr)
{
    if(pArr->cnt==pArr->len)
        return 1;
    return 0;
}

void show_arr(struct Arr *pArr)
{
    int i;
    if(is_empty(pArr))
        printf("该数组为空\n");
    else
    {
        for(i=0;i<pArr->cnt;i++)
            printf("%d",*(pArr->pBase+i));
        printf("\n");
    }
}

void main()
{
    struct Arr arr;
    int val;
    init_arr(&arr,6);
    append_arr(&arr,2);
    append_arr(&arr,1);
    append_arr(&arr,3);
    append_arr(&arr,5);
    append_arr(&arr,4);
    append_arr(&arr,6);
    show_arr(&arr);
    if(!append_arr(&arr,7))
        printf("追加失败\n");
    show_arr(&arr);
    if(!insert_arr(&arr,3,7))
        printf("插入失败\n");
    show_arr(&arr);
    delete_arr(&arr,3,&val);
    show_arr(&arr);
    printf("val=%d\n",val);
    inversion_arr(&arr);
    show_arr(&arr);
    sort_arr(&arr);
    show_arr(&arr);;
}

 

posted @ 2021-08-16 16:07  Pangenda  阅读(59)  评论(0)    收藏  举报