数据结构之数组

一、学习一波数据结构

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。--百度百科

二、学习一波数据结构之C语言回顾

1.指针--C语言的灵魂

指针:
重要性:C语言的灵魂
定义:
地址(内存单元的编号)
指针:就是地址==指针
指针变量是存放内存单元地址的变量
指针的本质:是一个操作受限的非负整数(0->2^n-1)
eg:int * p; //p 是个指针变量,int * 表示该p变量只能存储int类型的地址
分类:
1).基本类型的指针
int * p;
2).指针和数组的关系
一维数组:eg:int a[5] = {1,2,3,4,5};
其中,a代表数组名,是一个指针常量,代表第一个数组元素的地址;
3).指针变量:所有的指针变量只占4个子节,用第一个字节的地址表示整个变量的地址。
4).通过无返回值的函数更改变量的值,只能通过地址更改。

2.结构体--自定义数据类型

为什么出现结构体:表示一些复杂的数据
什么是结构体:根据实际需要,自己定义的复合数据类型
如何使用:struct Student st = {1000,"lisi",22};
struct Student * pst = &st;
1).st.sid = 99; 2).pst->sid = 99;
注意事项:结构体变量不能加减乘除,但能相互赋值;
普通结构体变量和结构体指针变量作为函数传参问题

三、学习一波数据结构之数组的实现

代码:

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

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

void init_arr(struct Arr * pArr,int length);
bool is_empty(struct Arr * pArr);
bool is_full(struct Arr * pArr); 
void show_arr(struct Arr * pArr);
bool append_arr(struct Arr * pArr,int val);
bool insert_arr(struct Arr * pArr,int pos,int val);
bool delete_arr(struct Arr * pArr,int pos,int * pVal);
//int get();
void inversion_arr(struct Arr * pArr);
void sort_arr(struct Arr * pArr);
 

int main(void)
{
    
    struct Arr arr;
    
    int *pVal;
    int val; //接受被删除的数组元素 
    
    printf("数组未初始化……数组随机分配长度:\n");
    printf("%d \n",arr.len);
    
    struct Arr * pArr = &arr;
    printf("数组初始化……数组长度:\n");
    init_arr(pArr,6);
    
//    printf("%d \n",arr.len);
    printf("%d \n",pArr->len);
    show_arr(pArr);
    append_arr(pArr,0);
    append_arr(pArr,1);
    append_arr(pArr,2);
//    append_arr(pArr,4);
//    append_arr(pArr,5);
//    append_arr(pArr,6);
    append_arr(pArr,3);
    show_arr(pArr);
    
    insert_arr(pArr,2,11);
    insert_arr(pArr,5,35);
    show_arr(pArr);
    
    delete_arr(pArr,3,pVal);
    show_arr(pArr);
    
    inversion_arr(pArr);
    show_arr(pArr);
    
    sort_arr(pArr);
    show_arr(pArr);
    
    return 0;
}
//******************init_arr()初始化数组****************************//
void init_arr(struct Arr * pArr,int length)
{
    pArr->pBase = (int * )malloc(sizeof(int)*length);
    if(pArr->pBase == NULL)
    {
        printf("动态内存分配失败!!\n");
        exit(-1);  //异常终止程序 
    }else{
        pArr->len = length;
        pArr->cnt = 0;
    }
}
//******************is_empty()判断数组是否为空****************************//
bool is_empty(struct Arr * pArr)
{
    if(pArr->cnt == 0)
        return true;
    else
        return false;
}
//******************is_full()判断数组是否为满****************************//
bool is_full(struct Arr * pArr)
{
    if(pArr->cnt == pArr->len)
        return true;
    else
        return false;
}
//******************append_arr()追加数组元素****************************//
bool append_arr(struct Arr * pArr,int val)
{
    if(is_full(pArr)){
        printf("数组已满,追加失败!!\n");
        return false;
    }else{
        pArr->pBase[pArr->cnt] = val;
        pArr->cnt++;
        printf("数组追加成功!!\n");
        return true;
    }
        
}
//******************show_arr()输出数组元素****************************//
void show_arr(struct Arr * pArr)
{
    if(is_empty(pArr))
        printf("数组为空!!\n");
    else{
        for(int i=0;i<pArr->cnt;i++)
            printf("%d  ",pArr->pBase[i]);
        printf("数组输出完毕。\n");
    }
}
//******************insert_arr()在pos位置处插入元素val****************************//
bool insert_arr(struct Arr * pArr,int pos,int val)
{
    //
    if( is_full(pArr) )
        return false;
    if(pos<1||pos>=pArr->cnt+1) 
        return false;
    for(int i=pArr->cnt-1;i>=pos-1;i--)
        pArr->pBase[i+1] = pArr->pBase[i];
    pArr->pBase[pos-1] = val;
    pArr->cnt++;
    printf("数组元素插入成功!!\n");
    return true;
}
//******************delete_arr()删除pos位置处的数组元素****************************//
bool delete_arr(struct Arr * pArr,int pos,int * pVal)
{
    //
    if( is_empty(pArr) )
        return false;
    if(pos<1||pos>pArr->cnt) 
        return false;
    pVal = &pArr->pBase[pos-1];
    for(int i=pos;i<=pArr->cnt;i++)
        pArr->pBase[i-1] = pArr->pBase[i];
    pArr->cnt--;
    printf("数组元素删除成功!!\n");
    return true;
    
}
//******************inversion_arr()将数组元素倒置****************************// 
void inversion_arr(struct Arr * pArr)
{
    int i=0;
    int j=pArr->cnt-1;
    int temp;
    while(i<j)
    {
        temp = pArr->pBase[j];
        pArr->pBase[j] = pArr->pBase[i];
        pArr->pBase[i] = temp;    
        i++;
        j--;
    }
    printf("数组元素倒置完成!!\n");
}
//*******************sort_arr()数组元素排序***************************// 
void 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[j];
                pArr->pBase[j] = pArr->pBase[i];
                pArr->pBase[i] = temp;
            }
        } 
    printf("数组元素排序完成!!\n");
}

编译,没有错误;运行结果:

 

posted @ 2018-08-15 12:29  刘建东  阅读(223)  评论(0编辑  收藏  举报